MassTransit订阅和接收自己的消息

时间:2013-04-15 08:13:45

标签: msmq esb masstransit

我正在尝试使用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();

问题是当其中一个应用程序发布消息时,所有三个应用程序都会收到它(包括原始发件人)。

有没有办法避免这种情况(不需要在邮件中添加应用程序名称)?

谢谢,

1 个答案:

答案 0 :(得分:0)

所以MassTransit是一个发布/订阅系统。如果您发布了一条消息,那么每个注册接收它的人都会。如果只需要一些端点来接收它,那么你真的需要直接发送。这就是它的工作原理。

您可以在邮件中包含来源,并丢弃您不感兴趣的邮件。如果您实现了Consumes.Accept接口,我认为Accept方法可以让您轻松完成,而不会将其混合到正常的消费代码中。