1

Axon で開発しているプロジェクトがありますが、Saga が適切に実行されません。

My Saga には、次のような行が含まれています。

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

First イベントは開始サガをトリガーし、initialiseWorkflow タスクもトリガーします (追加のステップのセットを正しく作成します)。ただし、SecondEvent が到着すると (FirstEvent と同じ UUID associationProperty 値で)、サガはその秒を取得しません。イベント。

関連付けを強化するために次の行を具体的に含めようとしましたが、それも機能しませんでした。

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

皮肉なことに、正しく動作する axon テスト フレームワークを使用したテスト ケースがあります。これは次のようなものです。

@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) UUID を直接関連付けるときに toString() を使用する必要があることに気付いたので、値をイベントの文字列にしようとしましたが、進行しませんでした。

2) 関連付けられた値を出力してみましたが、直接の関連付け行が必要ないことがわかりました (uuid は、開始サガ プロセス中に関連付けられます)。

3) @StartSaga を secondEvent に配置しようとしましたが、これは "Processing SecondEvent ..." のコードに到達しましたが、新しいサガでした。

理解は深まりましたが、まだ解決策はありません。

4

1 に答える 1

2

問題の原因がわかりました...

AxonTrader サンプル アプリの Mongo プロファイルに基づいて構成しました。ただし、AxonTrader persistence-infrastructure-context.xml (次に示す) には欠陥があります。

<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」をパラメーターとして使用しています。ただし、スナップショット イベントは eventStore のみに関連しており、sagaRepository と組み合わせると競合が発生するようです。

この値を sagaRepository の「sagas」に変更すると、すべてが適切に配置されます。

于 2014-10-02T10:01:23.133 に答える