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();
});
});
}
}