我遇到了一些关于rebus的问题。
这是我的情景。 我们有三项服务
身份)发布'IdentityCreated'消息
网关)将'UpdateProfileCommand'直接发送到'profile-westeu-input'队列
个人资料)使用来自输入队列'profile-westeu-input'的消息并订阅'IdentityCreated'消息
个人资料服务
中的rebus配置鉴于我已经在城堡windsor注册了我的处理程序。
container.Register(Classes.FromThisAssembly()
.BasedOn(typeof(IHandleMessages<>))
.WithServiceAllInterfaces()
.LifestyleTransient());
我用
配置了Rebusvar bus = Configure.With(new CastleWindsorContainerAdapter(container))
.Logging(x => x.Trace())
.Transport(
t => t.UseAzureServiceBus(connectionStringNameOrConnectionString: connectionString,
inputQueueAddress: ProfileInputQueueName, mode: AzureServiceBusMode.Standard))
.Options(o => o.SimpleRetryStrategy(ProfileErrorQueueName))
.Start();
并订阅了这样的消息类型
bus.Subscribe(typeof(Nabufit.Messages.Identity.Events.IdentityCreated)).Wait()
我希望自动调用我的处理程序。但它没有:(。
我尝试了不同的解决方案
奖金信息:
答案 0 :(得分:1)
在调查应用程序之后,我们发现我们在OwinCommunicationListener中的Webapi之间共享了Windsor Container,它具有一些自定义的依赖关系生命周期配置。这导致了两个不同的错误。
我们最终使用随rebus提供的内置的BuiltinHandlerActivation类构建了一个特定于总线使用过程的自定义ICommunicationListener。看起来像这样。
public class ServiceBusCommunicationListener : ICommunicationListener
{
private BuiltinHandlerActivator activator;
public async Task<string> OpenAsync(CancellationToken cancellationToken)
{
activator = new BuiltinHandlerActivator();
RegisterHandlers(activator);
var connectionString = "...";
var bus = Configure.With(activator)
.Logging(x => x.Serilog(Log.Logger))
.Transport(
t => t.UseAzureServiceBus(connectionStringNameOrConnectionString: connectionString,
inputQueueAddress: "input", mode: AzureServiceBusMode.Standard))
.Options(o => o.SimpleRetryStrategy("error"))
.Start();
return connectionString;
}
private void RegisterHandlers(BuiltinHandlerActivator builtinHandlerActivator)
{
(...)
}
public async Task CloseAsync(CancellationToken cancellationToken)
{
if (activator != null)
activator.Dispose();
}
public void Abort()
{
if (activator != null)
activator.Dispose();
}
}
将ServicebusCommunicationListner注册为ServiceInstanceListener。
internal sealed class ProfileService : StatelessService
{
public ProfileService(StatelessServiceContext context)
: base(context)
{ }
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener(context => new ServiceBusCommunicationListener()),
};
}
}