2013-08-21 3 views
0

nservice bus saga를 사용하여 내 커넥터를 구현했습니다. 다음은 NserviceBus가 기존의 Saga 데이터를로드하지 않습니다.

public class ClientSaga : Saga<ClientSagaState>, 
      IAmStartedByMessages<ClientChangeMessage>, 
      IAmStartedByMessages<ClientContactChangeMessage>, 
      IAmStartedByMessages<ClientPictureChangeMessage>, 
      IHandleTimeout<ClientSagaState> 
     { 
      [SetterProperty] 
      public IClientContactChangeDb ClientContactChangeDb{get;set;} 

      [SetterProperty] 
      public IBusRefTranslator BusRefTranslator{get;set;} 



      public void Handle(ClientContactChangeMessage message) 
      { 
       var state=this.Data; 
       //Some handling logic 
       //Check if client is not in database then store the state 
       state.ClientContactChange=message; 
       state.ClientRef =message.ClientRef; 
       //if client is in the data base then 
       MarkAsComplete(); 
      } 

      public void Handle(ClientChangeMessage message) 
      { 
       var state=this.data; 
       //Update or create the client depending on the situation 
       //check for dependencies 
       if(state.ClientContactChange !=null) 
       { 
        //Handle the contact change 
       } 
       else 
       { 
        state.ClientChangeMessage=message; 
        state.ClientRef=message.ClientRef; 
        } 
      } 
       public void Handle(ClientPictureChangeMessage message) 
      { 
        var state=this.Data; 
       //If the client is there then update the picture else store in saga 
        state.ClientPictureChangeMessage =message; 
        state.ClientRef=message.ClientRef; 
        } 
      } 

      public override void ConfigureHowToFindSaga() 
      { 
       ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef); 
       ConfigureMapping<ClientPictureChangeMessage>(s => s.ClientRef, m => m.ClientRef); 
       ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id); 
      } 
     } 


     public class ClientSagaState: IContainSagaData 
     { 
      //i dont need these three fields 
      public Guid Id { get; set; } 
      public string Originator { get; set; } 
      public string OriginalMessageId { get; set; } 

      // the fields which i needed 
      public Guid ClientRef {gee; set;} 
      public ClientChangeMessage ClientChange {get;set;} 
      public ClientContactChange ClientContactChange {get;set;} 
      public ClientPictureChangeMessage ClientPictureChangeMessage {get;set;} 
     } 

지금 내 커넥터에서 클라이언트가 클라이언트 연락처 변경 메시지/O를 존재 승을 만들 수 없습니다 코드입니다.

사가 실패

케이스 : 내가 클라이언트 사진 메시지를 보낼 때

  1. 먼저 새로운 사가 저장 파일을 작성합니다.
  2. 그럼 난 또 다른 모험과 저장이 내가 클라이언트 연락처 변경 메시지를 보내
  3. 그런 다음 클라이언트 사진 메시지에 의해 생성 된 무용담을 찾을 수 없습니다 어떻게 든 의해 생성 된 무용담을 발견 즉, 생성하는 클라이언트 변경 메시지를 보내 클라이언트 그림이 변경되었지만 이제 직원을 찾을 수 없습니다.

왜 이런 일이 발생하는지 알 수 없습니다.

사가 성공

케이스 : 내가 먼저 클라이언트 변경 메시지를 보낼 때

  1. 이는 무용담을 만듭니다.
  2. 그런 다음 클라이언트 연락처 변경 메시지를 보내면 해당 서버가 이고 제대로 실행됩니다.

누구든지이 문제가 발생하는 이유를 설명해주십시오.

자세한 정보가 필요하면 알려주십시오.

감사

UPDATE 다시는 내 코드를 검사에

, 난이의 원인을 발견했다. 내 ClientChangeMessage는 IContainSaga 데이터 (내가 시도했지만 제거하는 것을 잊어 버렸던 무언가)를 상속 받았다. 상속 링크를 제거한 후에 모든 것이 잘 작동했습니다. 수치스럽게 매달려있는 머리

+0

ClientChangeMessage가 ClientRef가 아닌 Id에 의해 조회 된 것처럼 보입니까? –

+0

클라이언트 변경 메시지의 경우 ID와 클라이언트 참조가 동일합니다. 죄송합니다. – sagar

+0

@ sa1986에 대한 언급을 잊어 버렸습니다. 어딘가에서 재연 프로그램을 업로드 할 수 있었습니까? – Simon

답변

1

모든 처리기에서 Saga Data에 ClientRef를 설정해야합니다. 그래서, 당신은 것입니다 : 이러한 메시지 중 하나로서

public void Handle(ClientContactChangeMessage message) 
     { 
      Data.ClientRef = message.ClientRef 
      ... 
     } 

를 무용담을 시작할 수 있습니다, 당신은 당신의 무용담 상태에서이 값을 설정해야합니다. 다른 메시지가 들어 오면 이미이 ID를 가진 무용담의 인스턴스가 있으므로이 ID로 공동 관련됩니다.

사가 상태 변수를 참조하려면 데이터를 사용하십시오. 이쪽으로.

+0

미안하지만, 그 사실을 언급하는 것을 잊어 버렸습니다. 그렇습니다. 저는 db (모든 변경을했습니다)에서 클라이언트를 찾을 수없는 경우 모든 처리기에서 this.Data.ClientRef를 설정하고 있습니다. 클라이언트 변경 메시지가 도착하면 nservicebus가 클라이언트 그림 변경 사가를로드 할 수 없습니다.내 ClientRef에 고유 한 속성을 넣으면 클라이언트 메시지가 고유 키 제약 오류로 오류와 함께 도착하면 커넥터가 실패합니다. – sagar

+0

@imon이 제안했듯이 어딘가에 문제를 재현하여 게시 할 수 있습니까? 감사. –

관련 문제