2015-09-16 6 views
3

У меня есть веб-приложение, отправляющее сообщения через ребус, чтобы начать длительные рабочие задания на удаленной машине. Я использую транспорт MSMQ. Удаленный рабочий может обрабатывать 5 операций параллельно. Поэтому, если удаленный рабочий занят, некоторые сообщения могут накапливаться в очереди, пока рабочий не сможет их обработать. Между тем пользователь может принять решение об отмене ожидающей операции (или исполняющей). Какова лучшая стратегия для обработки этого конкретного сценария при использовании ребуса (или любой шины, если на то пошло)?Какова наилучшая стратегия для отмены ожидающего задания или выполнения задания с использованием ребуса и MSMQ? (long running)

ответ

2

Ну, так как очередь непрозрачна, и конечная точка только увидит сообщения, которые она на самом деле пытается получить, нет способа фильтровать сообщения до их получения.

В зависимости от того, насколько важно для вас, что вы не делаете ненужного труда, я могу придумать несколько способов отменить обработку до ее начала.

Один из способов, которым я могу думать, состоит в том, чтобы использовать тот факт, что Rebus выполняет обработчики в handler pipeline, что означает, что вы можете перехватывать сообщения до их выполнения.

Если работа выполняется DoWork, вы можете вставить «фильтр», как это:

Configure.With(...) 
    .(...) 
    .Options(o => o.SpecifyOrderOfHandlers() 
     .First<AbortIfCancelled>() 
     .Then<DoWork>()) 
    .Start(); 

, а затем ваш AbortIfCancelled может выглядеть следующим образом:

public class AbortIfCancelled : IHandleMessages<Work> 
{ 
    readonly IMessageContext _messageContext; 
    readonly ICancelWork _cancelWork; 

    public AbortIfCancelled(IMessageContext messageContext, ICancelWork cancelWork) 
    { 
     _messageContext = messageContext; 
     _cancelWork = cancelWork; 
    } 

    public async Task Handle(Work work) 
    { 
     if (await _cancelWork.WasCancelled(work)) 
     { 
      _messageContet.AbortDispatch(); 
     } 
    } 
} 

, таким образом, отбрасывание остальные конвейер, если значение ICancelWork возвращает true. Затем вам нужно будет реализовать ICancelWork, например. набирая bool в базу данных где-нибудь.


PS: AbortDispatch() функция на IMessageContext доступна от 0.98.11

+1

мысли о чем-то в этом роде. Несмотря на то, что это вводит общие данные, я думаю, это может быть целесообразно рассмотреть в зависимости от важности выполнения ненужной работы, как вы упомянули. Я попробую! Еще раз спасибо. – Bredstik