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;
}
});
}
}
私はこれが本当に派生したかったので、開発者はこれに本当に対処する必要はありません。
これを行う簡単な方法はありますか?
申し訳ありませんが、私は何かが不足していますが、タイプを導き出すためにそのフロー定義の中でどのように「まっすぐ」のように見えませんか? Thanks –
コンバータのタイプマッパーでタイプIDマッピング( 'setIdClassMapping')を使用してください。私の答えを見てください。 –
コンテンツタイプがapplication/jsonの場合、特定のタイプのマッピング戦略を明示的に定義しなくても、 "straight forward"が間違った用語であると思われます。これは、https://github.com/spring-cloud/spring-cloud-stream/issues/156で議論されているものと同様の考え方です。私がプロデューサ側でtypeIdを削除し、アプリケーション/ jsonをそのまま残しておくと、マーシャリングの「すぐに使える」ことができます。 – Tyler