2011-01-25 4 views
1

NServiceBus를 조사 중이며이 시나리오를 처리하는 데 어떻게 사용할 수 있는지 확신 할 수 없습니다.NServiceBus 배포자가 작업자에게 진행 상태를보고 할 수 있습니까?

배포자가 작업자에게 배포하는 작업 요청을 보내는 클라이언트가 여러 개 있습니다. 작업이 완료되는 데 오랜 시간이 걸릴 것이며 원 작업자가 원래 요청을 보낸 클라이언트에게 진행 상태를보고하길 원합니다.

전이중 샘플을 살펴본 결과 how to add the distributor to that sample입니다. 나는 이것들을 작동시키지 만, 일련의 진행 메시지들 (메시지들 사이에, 아래 표시된 코드에 따라 지연 됨)로 응답하도록 수정하면, 클라이언트는 동시에 모든 진행 메시지를 수신한다.

public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage> 
{ 
    public IBus Bus { get; set; } 

    public void Handle(RequestDataMessage message) 
    { 
     for (var i = 0; i < 10; i++) 
     { 
      var count = i; 
      var response = this.Bus.CreateInstance<DataResponseMessage>(m => 
       { 
        m.DataId = message.DataId; 
        m.Progress = count * 10; 
       }); 

      this.Bus.Reply(response); 

      Thread.Sleep(1000); 
     } 
    } 
} 

나는 NServiceBus가 어떻게 작동하는지에 대해 기본적인 것을 이해하지 못했다고 생각합니다. 누군가 내가 잘못한 곳을 설명하거나, 몇 가지 예 및/또는 문서를 가르쳐 줄 수 있습니까?

+0

코드를 표시 할 수 있습니까? – Paco

답변

2

생성 한 메시지는 항상 동일한 트랜잭션의 일부로 메시지를 보냅니다. 핸들러마다 하나의 트랜잭션이 있으므로이 방법으로 진행 상황을 전달할 수 없습니다. 진행 상황을 알리는 처리 청크마다 별도의 끝점을 가져야합니다. 우리는 트랜잭션과 관련이없는 외부의 것을 업데이트함으로써 의사 소통 진행을 구현했습니다. RPC 호출과 같은 진행 상황을 업데이트하기 위해 다른 끝점에 비 트랜잭션 메시지를 보내면됩니다. 거기에서 진도 데이터 저장소에 대한 설문 조사를 할 수 있습니다.

+0

고마워요. 매우 유용합니다. 트랜잭션 대 비 트랜잭션 메시지를 읽어야한다고 생각합니다. nservicebus 웹 사이트의 설명서는 약간 빛이 보입니다 - 좋은 자료를 찾을 수있는 곳이 있습니까? – Akash

+0

또 다른 좋은 곳은 야후 그룹입니다. 여기에있는 것과 비슷한 활동이 있지만,이 시점에서 조금 더 있습니다. –

1

근로자에게 bus.Reply()를 사용하여 고객에게 메시지를 보냅니다. Reply는 원래 메시지를 보낸 엔드 포인트에 메시지를 자동으로 전송합니다.

+0

Bus.Reply()를 사용하고 있습니다 - 원래 질문에 코드 샘플을 추가했습니다. 문제는 응답이 모두 동시에 클라이언트에 도달한다는 것입니다 (서버가 Handle() 메소드를 완료했을 때). 간격을두고있다. – Akash

+0

위의 대답은 왜 이런 일이 일어나는 지 설명합니다. 나는 당신의 프로세스를 다른 덩어리들로 분할하는 그의 제안 된 접근법에 동의한다. (아마 bus.SendLocal을함으로써). 또 다른 "해킹"옵션은 버스를 포장하는 것입니다. 새로운 TransactionScope (ScopeOptions.Supress)를 사용하십시오. 그러면 응답이 즉시 전송됩니다. –

+0

"hackish"접근 방식이 작동하지만이 단점을 이해하기에 충분하지 않습니다. – Akash

관련 문제