2

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

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

有什么方法可以避免这种情况(无需将应用程序名称添加到消息中)?

谢谢,

G

4

1 回答 1

0

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

您可以在消息中包含来源并丢弃您不感兴趣的消息。如果您实现该Consumes.Accept接口,我认为该Accept方法可以让您轻松地做到这一点,而无需将其混入正常的消费代码中。

于 2013-04-15T11:10:32.357 回答