我正在尝试使用MassTransit实现概念证明服务总线。我有三个应用程序需要在彼此之间传递公共实体类型的更改。因此,当用户在一个应用程序中更新实体时,会通知另外两个实体。
每个应用程序都配置如下,并带有自己的队列:
bus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/app1_queue");
sbc.UseSubscriptionService("msmq://localhost/subscription");
sbc.UseControlBus();
sbc.Subscribe(subs =>
{
subs.Handler<IMessage1>(IMessage1_Received);
});
});
还有一个订阅服务应用程序配置如下:
subscriptionBus = ServiceBusFactory.New(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/subscription");
});
var subscriptionSagas = new InMemorySagaRepository<SubscriptionSaga>();
var subscriptionClientSagas = new InMemorySagaRepository<SubscriptionClientSaga>();
subscriptionService = new SubscriptionService(subscriptionBus, subscriptionSagas, subscriptionClientSagas);
subscriptionService.Start();
问题是当其中一个应用程序发布消息时,所有三个应用程序都会收到它(包括原始发件人)。
有没有办法避免这种情况(不需要在邮件中添加应用程序名称)?
谢谢,
答案 0 :(得分:0)
所以MassTransit是一个发布/订阅系统。如果您发布了一条消息,那么每个注册接收它的人都会。如果只需要一些端点来接收它,那么你真的需要直接发送。这就是它的工作原理。
您可以在邮件中包含来源,并丢弃您不感兴趣的邮件。如果您实现了Consumes.Accept
接口,我认为Accept
方法可以让您轻松完成,而不会将其混合到正常的消费代码中。