2013-04-15 4 views
2

Я пытаюсь внедрить доказательство шины служебного обслуживания, используя 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(); 

Проблема в том, что, когда один из приложений, публикует сообщение, все три приложения получают его (включая исходного отправителя).

Есть ли способ избежать этого (не прибегая к добавлению имени приложения в сообщение)?

Спасибо,

G

ответ

0

Так MassTransit паб/подсистема. Если вы опубликуете сообщение, все зарегистрированные его получат. Если вам нужны только некоторые конечные точки для его получения, вам действительно нужно напрямую отправить. Это как раз то, как это работает.

Вы можете включить источник в свое сообщение и отказаться от сообщений, которые вас не интересуют. Если вы реализуете интерфейс Consumes.Accept, я думаю, что метод Accept позволит вам сделать это легко, не смешивая его с нормальным кодом потребления.

+0

Чтобы отправить напрямую: вместо вызова .Publish() на шине, получите (используя IEndpointFactory) конечную точку, к которой вы хотите отправить ее, и вызовите .Send() на нем. –

+0

Спасибо, я уже фильтровал сообщения на основе источника сообщений, но у вас есть . Фильтр Selected.Accept - полезный совет! – gareththegeek

+0

Я выполнил свой класс потребительского потребления . Выбран и реализован метод Accept, однако метод никогда не вызывается. Потребитель расходует все сообщения. Я пропустил? – gareththegeek