2014-01-20 2 views
0

Rhino 서비스 버스 사용. 처리를 처리하는 백엔드 앱이 있고 백엔드에 메시지를 게시하는 다른 앱 (클라이언트 UI)이 있습니다. 백 그라운데이션에 사가가있어 사가가 자체 메시지를 게시하고 자체 스레드에서 실행할 수있는 여러 개의 작은 작업으로 처리를 나누기를 원합니다. 문제는 오케스트레이션 인터페이스를 통해 메시지를 구독하는 경우 항상 메시지가 삭제된다는 것입니다. ConsumerOf를 사용하여 다른 클래스에서 구독 할 수 있으며 소비자는 메시지를 가져옵니다.Rhino ESB 자체에 메시지 게시

namespace Sagas 
{ 
public class MoveJobSaga: ISaga<MoveJobState>, 
    InitiatedBy<TriggerMoveJobCommand>, 
    Orchestrates<TriggerMoveTerminalCommand> 
{ 
    private readonly IServiceBus _bus; 
    private readonly ITerminalFilesService _tfService; 

    public MoveJobSaga(IServiceBus bus) 
    { 
     _bus = bus; 
     State = new MoveJobState(); 
    } 

    public MoveJobState State { get; set; } 
    public Guid Id { get; set; } 
    public bool IsCompleted { get; set; } 

    public void Consume(TriggerMoveJobCommand message) 
    { 
     State.TerminalsToProcess = message.Terminals.Count(); 
     State.JobId = message.JobId; 
     foreach (var terminal in message.Terminals) 
     { 
      _bus.Publish(new TriggerMoveTerminalCommand() 
      { 
       CorrelationId = message.CorrelationId, 
       Name = terminal.Name 
      }); 
     } 
    } 

    public void Consume(TriggerMoveTerminalCommand message) 
    { 
     var result = _tfService.MoveTerminalFiles(message.SourceTifDir, message.TargetTifDir, message.SourceDatDir, message.TargetDatDir); 
     State.TerminalsProcessed++; 

     if (State.TerminalsToProcess == State.TerminalsProcessed) 
     { 
      _bus.Publish(new MoveJobCompletedEvent() 
      { 
       Success = State.Success, 
       JobId = State.JobId }); 
     } 
    } 
} 

public class MoveJobState 
{ 
    public MoveJobState() 
    { 
     Success = true; 
    } 
    public int TerminalsToProcess { get; set; } 
    public int TerminalsProcessed { get; set; } 
    public int JobId { get; set; } 
    public bool Success { get; set; } 
} 
} 

호스트 구성 :

<rhino.esb> 
<bus threadCount="1" numberOfRetries="5" endpoint="msmq://localhost/myapp.host" /> 
<messages /> 
</rhino.esb> 

부트 스트랩 :

또한
  sm.For<ISagaPersister<MoveJobSaga>>() 
       .Singleton() 
       .Use<InMemorySagaPersister<MoveJobSaga>>(); 

내가의 게시를 이동했다 :

public class HostBootStrapper: StructureMapBootStrapper 
{ 
    protected override void ConfigureContainer() 
    { 
     base.ConfigureContainer(); 
     Container.Configure(sm => 
     { 
      sm.For<ISagaPersister<MoveJobSaga>>().Use<InMemorySagaPersister<MoveJobSaga>>(); 
      sm.Scan(x => 
      { 
       x.TheCallingAssembly(); 
       x.WithDefaultConventions(); 
      }); 
     }); 
    } 
} 

답변

0

내가 싱글로 ISagaPersister를 등록하는 데 필요한 모든 메시지는 무용담에 의해 사용되는 무대 사가. 그래서 시작 메시지를 시작한 다음 작업 내의 각 메시지를 트리거하는 서비스 클래스를 만들었습니다.