2014-10-01 6 views
1

Axon을 사용하여 개발중인 프로젝트가 있지만, 내 Saga가 제대로 실행되지 않습니다. (. 올바르게 추가 단계의 집합을 생성) :associationProperty와 일치하는 이벤트가 Axon Saga에 통지되도록하려면 어떻게해야합니까?

내 사가는 다음과 유사한 행이 포함

첫 번째 이벤트가 시작 사가 트리거링, 또한 initialiseWorkflow 작업을 트리거한다
@StartSaga 
@SagaEventHandler(associationProperty = "uuid") 
public void handle(FirstEvent event) { 
    System.out.println("Processing FirstEvent for uuid=" + event.getUuid()); 
    associateWith("uuid", event.getUuid().toString()); 
    initialiseWorkflow(event.getUuid(), Status.CREATED) ; 
} 

@SagaEventHandler(associationProperty = "uuid") 
public void handle(SecondEvent event) { 
    System.out.println("Processing SecondEvent for uuid=" + event.getUuid()); 
    this.processStep(STEP_2,event.getUuid()); 
} 

그러나 때 Saga가 두 번째 이벤트를 선택하지 않으면 SecondEvent가 도착합니다 (FirstEvent와 동일한 UUID associationProperty 값).

나는 연결을 향상시키기 위해 다음 줄을 포함하여 구체적으로 시도했다, 그러나 그것은 또한 작동하지 않았다 :

associateWith("uuid", event.getUuid().toString()); 

는 아이러니하게도, 내가 테스트 케이스를 가지고, 제대로 작동 축삭 테스트 프레임 워크를 사용하여,이

@Test 
public void testSecondEvent() { 
    fixture.givenAggregate(uuid).published(new FirstEvent(uuid)) 
    .whenAggregate(uuid).publishes(new SecondEvent(uuid)) 
    .expectDispatchedCommandsMatching(exactSequenceOf(
      new CompleteTaskCommandMatcher("SecondEvent"))); 
} 

문제는 내가 CommandGateway에 직접 명령을 가하고, 그리고 저장소에 직접 결과를 확인하고 테스트를 종료 나의 끝에서 발생 비슷합니다.

AnnotatedSagaManager가 사용되고 있는지 다시 한 번 확인했습니다.

잘못된 것이 무엇인지에 대한 아이디어가있는 사람이 있습니까? 아니면 Sagas가 어떻게 작동해야하는지 오해 한 적이 있습니까?

편집 : 더 몇 업데이트 :

1) 내가 toString()를 직접 UUID를 연결 할 때 사용하는 데 필요한 것으로 나타났습니다, 그래서 이벤트에 대한 문자열로 값을 시도 - 아니 진행.

2) I는 연관된 값을 인쇄했는데, I는 직접적인 연관 라인 I가 온 @StartSaga 바꾸어 시도 (UUID를가))

3 시작 사가 과정 연관된 필요하지 않은 것을 알 수있다 secondEvent, 그리고 이것은 "Processing SecondEvent ..."에 대한 코드에 도달했지만 새로운 무용담에 있습니다.

더 많은 이해가되었지만 아직 해결 방법이 없습니다.

답변

2

내가 문제의 원인을 발견 ...

은 내가 AxonTrader 샘플 응용 프로그램에 대한 몽고의 프로필에 내 구성을 기반으로.

<beans profile="mongodb"> 
    <bean id="mongoSpringTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
     <constructor-arg name="mongo" ref="mongo"/> 
     <constructor-arg name="databaseName" value="axontrader"/> 
    </bean> 

    <bean id="mongoTemplate" class="org.axonframework.eventstore.mongo.DefaultMongoTemplate"> 
     <constructor-arg index="0" ref="mongo"/> 
     <constructor-arg index="1" value="axontrader"/> 
     <constructor-arg index="2" value="domainevents"/> 
     <constructor-arg index="3" value="snapshotevents"/> 
     <constructor-arg index="4"> 
      <null/> 
     </constructor-arg> 
     <constructor-arg index="5"> 
      <null/> 
     </constructor-arg> 
    </bean> 

    <bean id="mongoSagaTemplate" class="org.axonframework.saga.repository.mongo.DefaultMongoTemplate"> 
     <constructor-arg index="0" ref="mongo"/> 
     <constructor-arg index="1" value="axontrader"/> 
     <constructor-arg index="2" value="snapshotevents"/> 
     <constructor-arg index="3"> 
      <null/> 
     </constructor-arg> 
     <constructor-arg index="4"> 
      <null/> 
     </constructor-arg> 
    </bean> 

    <mongo:mongo id="mongo" host="127.0.0.1" port="27017"/> 
</beans> 

당신이 eventStore 및 sagaRepository 위의 코드 조각에서 볼 수 있듯이

모두 자신의 매개 변수로 "snapshotevents"를 사용하고 있습니다 : 그러나, AxonTrader 지속성 인프라-context.xml에 (다음 그림 참조) 결함이 포함되어 있습니다. 그러나 스냅 샷 이벤트는 eventStore와 만 관련이 있으며 sagaRepository와 결합 할 때 충돌을 일으키는 것으로 보입니다.

이 값을 sagaRepository의 "sagas"로 변경하면 모든 것이 제자리에 제대로 들어갑니다!