【问题标题】:MassTransit Subscriptions and Receiving Own MessagesMassTransit 订阅和接收自己的消息
【发布时间】:2013-04-15 08:13:45
【问题描述】:

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

【问题讨论】:

    标签: msmq esb masstransit


    【解决方案1】:

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

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

    【讨论】:

    • 直接发送:不要在总线上调用 .Publish(),而是获取(使用 IEndpointFactory)要发送到的端点并在其上调用 .Send()。
    • 谢谢,我已经根据消息源过滤了消息,但是 Consumes.Selected.Accept 过滤器是一个有用的提示!
    • 我让我的消费者类实现了 Consumes.Selected 并实现了 Accept 方法,但是该方法从未被调用。消费者消费所有消息。我错过了什么吗?
    • 它是否实现了任何其他接口?我认为您必须删除 Consumes.All 接口。
    • 不,只是:公共类消费者:Consums.Selected
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多