2017-12-22 36 views
1

AMQPを使用して2つのマイクロサービス間で非同期メッセージングを設定するための "舗装道路"に取り組んでいます。各サービスで別々のドメインオブジェクトを使用することを促進する必要があります。つまり、各サービスは、キューを通過するオブジェクトのコピーを定義する必要があります。Spring統合 - AMQPの推論型Java DSL?

私たちはプロデューサとコンシューマ側の両方でJackson2JsonMessageConverterを使用しており、Java DSLを使用してキューとの間でフローを配線しています。

私はこれを行う方法があると確信していますが、それは私をエスケープしています。コンシューマ側は、そのイベントの別の表現を持つ可能性があるので、プロデューサから渡された__TypeID__ヘッダーを無視しますおそらく別のJavaパッケージに入っているでしょう)。

注釈@RabbitListenerを使用すると、inferredArgumentType引数が導出され、ヘッダー情報がオーバーライドされるようになったようです。これはまさに私がやりたいことですが、私はJava DSLを使ってそれをやりたいと思います。私はまだこれを行うためのきれいな方法を見つけていないし、おそらく私は明らかなものを欠いているかもしれません。それは次のDSLを使用するときに型を派生するために、かなりまっすぐ進むだろうと思われる:

return IntegrationFlows 
     .from(
       Amqp.inboundAdapter(factory, queueRemoteTaskStatus()) 
         .concurrentConsumers(10) 
         .errorHandler(errorHandler) 
         .messageConverter(messageConverter) 
     ) 
     .channel(channelRemoteTaskStatusIn()) 
     .handle(listener, "handleRemoteTaskStatus") 
     .get(); 

しかし、これはClassNotFound例外が発生します。これを回避するために私が見つけた唯一の方法は、タイプの明示的な定義が必要なカスタムメッセージコンバータを設定することです。

public class ForcedTypeJsonMessageConverter extends Jackson2JsonMessageConverter { 

    ForcedTypeJsonMessageConverter(final Class<?> forcedType) { 
     setClassMapper(new ClassMapper() { 

      @Override 
      public void fromClass(Class<?> clazz, MessageProperties properties) { 
        //this class is only used for inbound marshalling. 
      } 

      @Override 
      public Class<?> toClass(MessageProperties properties) { 
       return forcedType; 
      } 
     }); 
    } 
} 

私はこれが本当に派生したかったので、開発者はこれに本当に対処する必要はありません。

これを行う簡単な方法はありますか?

+0

申し訳ありませんが、私は何かが不足していますが、タイプを導き出すためにそのフロー定義の中でどのように「まっすぐ」のように見えませんか? Thanks –

+0

コンバータのタイプマッパーでタイプIDマッピング( 'setIdClassMapping')を使用してください。私の答えを見てください。 –

+0

コンテンツタイプがapplication/jsonの場合、特定のタイプのマッピング戦略を明示的に定義しなくても、 "straight forward"が間違った用語であると思われます。これは、https://github.com/spring-cloud/spring-cloud-stream/issues/156で議論されているものと同様の考え方です。私がプロデューサ側でtypeIdを削除し、アプリケーション/ jsonをそのまま残しておくと、マーシャリングの「すぐに使える」ことができます。 – Tyler

答えて

1

最も簡単な方法は、ジャクソンコンバータのDefaultJackson2JavaTypeMapperTypeIdMappingsetIdClassMapping())に設定することです。

送信システムでは、foo:com.one.Fooと受信システムマップfoo:com.two.Fooにマップします。

次に、__TypeId__ヘッダーはfooになり、受信側システムはFooという表現にマップします。

EDIT

別のオプションは、インバウンドチャネルアダプタのリスナーコンテナにafterReceiveMessagePostProcessorを追加することです - それは__TypeId__ヘッダーを変更することができます。