gpt4 book ai didi

c# - Rebus 和 WebApi

转载 作者:行者123 更新时间:2023-11-30 23:17:11 25 4
gpt4 key购买 nike

我正在将 rebus 与 Autofac 集成用于 webapi

下面是我在 Global.asax.cs 的 Application_Start 上调用的配置语句

当应用程序池重新启动时,它无法识别监听由 webapi 发布的事件的服务的事件订阅,所以结果是

DEBUG 09:56:12.842 dd2c1f8c-370d-4bd4-828c-27f033dfabdf RebusConfigurer+<>c.0 Sending Events.UserLoggedIn -> << no destinations>>

我需要重新启动 webapi 的服务来接收订阅请求

我可以看到发生的配置

DEBUG 09:55:50.744 890204c2-1dcb-4df0-9525-d6585d9692cb RebusAutofacConfig.25 Configuring rebus in queue :'xyz'

DEBUG 09:55:50.864 890204c2-1dcb-4df0-9525-d6585d9692cb RebusAutofacConfig.33 Configured rebus with 1 workers

这是我发布消息的 webapi 配置

public static class RebusAutofacConfig
{
private static readonly ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
internal static IContainer ConfigureRebus(this IContainer container)
{
var inputQueueName = System.Configuration.ConfigurationManager.AppSettings["queueName"];
if (inputQueueName.IsNullEmptyOrWhisteSpace())
{
inputQueueName = "xyz";
}
var errorQueue = inputQueueName + ".errors";
Logger.DebugFormat("Configuring rebus in queue :'{0}'", inputQueueName);
var bus = Configure
.With(new AutofacContainerAdapter(container))
.Serialization(s => s.UseJil(Jil.Options.IncludeInherited))
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmq(inputQueueName))
.Options(b => b.SimpleRetryStrategy(errorQueue, 5, true))
.Start();
Logger.DebugFormat("Configured rebus with {0} workers", bus.Advanced.Workers.Count);
return container;
}
}

这是我用来监听消息的windows服务配置

internal static IContainer ConfigureRebus(this IContainer container, ISettings settings)
{
Configure
.With(new AutofacContainerAdapter(container))
.Serialization(s => s.UseJil(Jil.Options.IncludeInherited))
.Logging(l => l.Log4Net())
.Transport(t => t.UseMsmq(settings.EventsQueueName))
.Routing(r => r.TypeBased().MapAssemblyOf<UserLoggedIn>(inputQueueName))
.Options(o => o.SimpleRetryStrategy(settings.EventsErrorQueueName, 5, true))
.Options(o =>
o.SpecifyOrderOfHandlers()
.First<UserCacheHandler>()
.Then<UserCreatedResetPasswordHandler>()
)
.Events(e =>
{
e.BeforeMessageHandled += (bus, headers,message, context, args) =>
{
System.Diagnostics.Trace.CorrelationManager.ActivityId = Guid.NewGuid();
};
})
.Start();
return container;
}

似乎在 apppool 重新启动后无法识别任何订阅。

我正在使用本地 Msmq。

知道我做错了什么吗?

最佳答案

从您发布的配置来看,您似乎没有在任何地方存储您的订阅。

这意味着您的 Web API 将订阅存储在内存中,这解释了为什么您似乎总是必须在

  1. 网络应用程序接口(interface)
  2. window 服务

订购。

因为 MSMQ 是一个 transport WITHOUT native pub/sub support (至少 Rebus 使用它的方式),您需要为您的场景配置一个(持久的!)订阅存储。

如果你有一个可用的 SQL Server,我建议您配置 Web API 以使用它来存储订阅。这是通过导入 Rebus.SqlServer 包来完成的,然后你就可以了

.Subscriptions(s => s.StoreInSqlServer(...))

在配置拼写中。

您可以在 the wiki page about ISubscriptionStorage 上阅读有关配置订阅存储的更多信息.

关于c# - Rebus 和 WebApi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com