2016-07-06 14 views
0

私は、スプリング統合を使用してアノテーション駆動のイベントバス(例:Guava Event Bus)を実装しようとしています。 私はイベントを公開するPublishSubscribeChannelを持っています。考えられるのは、@ServiceActivatorアノテートされたメソッドをイベントハンドラとして使用することです。 各メソッドは、処理する必要のあるイベント(ペイロード)に基づいて異なるシグネチャを持つことができます。私が気づいた何 同じinputChannelと異なる署名を持つ複数の@ServiceActivatorメソッド

は、イベントが公開されたときに、 ServiceActivatorAnnotationPostProcessorによって作成 ServiceActivatingHandler全てのインスタンスが呼び出されると、ペイロードに一致しない署名を持つ各メソッドの例外されていることです。例えば。

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method handle(model.api.ServiceAvailableEvent) cannot be found on service.eai.TestServiceActivatorImpl2 type 

のみ、特定のペイロードタイプのため@ServiceActivatorメソッドを定義する方法はありますか?

答えて

0

正しいことですが、PublishSubscribeChannelのすべてのユーザが同じメッセージを受け取ります。また、着信ペイロードを予想されるメソッドの引数型に変換する機会がない場合は、その例外が発生します。

フィルタの予期しないタイプの場合は、@ServiceActivatorの前にを必ず使用する必要があります。言い換えれば、現在と同じことをやっていますが、フロントフィルタを使用してフローを少し複雑にします(PublishSubscribeChannel)。

あなたも、既存のPayloadTypeSelectorに頼ることができます。

@Bean 
@Filter(inputChannel = "publishSubscribeChannel", outputChannel="service1") 
public MessageSelector payloadTypeSelector() { 
    return new PayloadTypeSelector(...); 
} 

または、​​タイプをチェックし、同じ@Filterが付いはい、単純なPOJO方法。

私はあなたの次の質問は次のようになると思います:なぜ@ServiceActivatorはターゲットメソッドには適していないタイプを無視しますか?

懸念事項を混ぜてはいけません。サービスアクティベータは、対象のビジネスロジックでの処理のためのものです(Message)。フィルタリングとスキップのために、異なるEIパターン(filter)があります。

+0

ありがとう、私はパターンを誤解しました。同じ合理性がゲートウェイにも当てはまると思います。つまり、同じrequestChannelにサブスクライブされた "@Gateway"アノテーションで注釈が付けられたすべてのメソッドは、同じペイロードを使用する必要があります。私は正しいですか? –

+0

異なる署名を持つ同じクラスに複数のメソッドがある場合、フレームワークはペイロードに一致するメソッドを呼び出すことに注意してください。それらが一意で曖昧でない限りいいえ。署名が異なる複数のゲートウェイメソッドを同じチャネルに公開することができます。 –

+0

'@ Gateway'は全く別の話です。そして、* subscribe *についてではなく、* publish *についてです。 'requestChannel'は、ゲートウェイのメソッド呼び出しを介してメッセージを送信するためのものです。それは異なる '@ Gateway'のために同じチャンネルにすることができますが、それらの引数がパブリッシュするメッセージのための' payload'として正確に数えるべきです。 –

関連する問題