2016-07-25 12 views
1

spring-amqpでnice @RabbitHandlerアノテーションを使用して、RestControllersのコーディングスタイルに似ていますが、フードの下でRabbitで動作するエンドポイントを作成しています。そのすべては非常に素晴らしく、すっきりしていて、シグネチャに基づいたメソッドハンドラの動的分解能が特に優れています。しかし、我々はここで少しの論争に直面している。 だから、次のような方法Spring amqp @RabbitListenerランタイム型の問題

@RabbitHandler 
public void handleEmailDto(EmailDto message) { 
    System.out.println(message); 
} 

これはMessagingMessageConverter.javaクラスにfromMessageメソッドによって処理されます想像してみてください。チェーンのある点では、ハンドラリゾルバがどのメソッドをメッセージのペイロードで呼び出すか、そしてペイロードをどのクラスにシリアライズするかを決定するために、メッセージの型情報が必要になります。問題は、MappingJackson2MessageConverterを使用していることです。それにもかかわらず、クラスの型の完全修飾名を使用して、メッセージの入力済みの____TypeId____小文字が必要です。それは問題でもない。非常にうまく設計され、考え出されています。

このクラスがクラスパス上にないと問題が発生します。これは実際にはマイクロサービス環境で作業しており、一部のサービスは完全に分離されているため、大きな苦痛です。つまり、私たちはデータドメインを保持する「共通の」アーチファクトを持ちたくないので、メッセージの送信者と受信者の両方で実行時に使用できます。コードをたどって、このホール型の状況がどのように処理されているのか、それがどのように行われているのかを確認します。

しかし、アーキテクチャ上の観点からすれば、これは非常に限定的です...つまり、シリアライゼーション/デシリアライズ/メソッド解決ロジックを満たすために、まったく分離されたマイクロサービス間でコードを共有する必要がありますか?

多分私は何かを見逃している、またはそれをやっている別の方法を見落としているかもしれません。そのような場合は、私は確かに提案に開かれています。助けを前にありがとう。

+0

カスタマイズされたタイプではなく、java lang自体から内部タイプを試すことができるようです。サービス間でこれらのクラスを共有しないためです。これをスキーマと呼ぶと、サービス間で同じでなければなりません。今度は、これらのクラスを共有しないので、それらを使用しないでください。私の提案は、 'java.lang.Map'や' java.lang.List'のような内部型を使用しています。しかし、そこでプロパティを取得するには、より具体的な仕事をする必要があります。ちなみに、あなたがネットワークから転送している場合、それらが単一のプリミティブ型でない場合はマップに入れることができます。それはあなたのために十分に知的です。 –

+0

私は、あなたが言っていることの背後にある論理をあまり理解していません。私はいくつかのデータを消費し、それをオブジェクトに解析しようとしています。あなたは、残りのコントローラを押すと、あなたはサーバーと同じタイプを共有する必要はありませんか? – Zahari

+0

はい、そうです。私が言っていることは、データをデシリアライズしてカスタマイズされたクラスタイプにする代わりに、あなたのデータを読み込み、それらをマップに逆直列化することができるということです。例えば、あなたのリモートサービスは、 'A'がカスタマイズされたクラス型(' long'のような単一の単純型ではありません)を表しているserilized 'A'(例えばjson)を返します。新しい 'A'インスタンスではありません。最後に、このマップからプロパティを取得できます。私が話していることを持っていますか? –

答えて

1

1.6はnew featureです。@RabbitListenerの引数タイプは、タイプIDヘッダーの代わりに使用できるJSONメッセージコンバータに供給されます。

残念ながら、のペイロードが変換された後にハンドラ方法がと決定されるため、このメカニズムは@RabbitHandlerとは機能しません。

クラスパスにソースタイプは必要ありません。異なるタイプを使用するようにコンバータを設定できます。 Foo1を送信し、Foo2を受け取る例については、this test caseを参照してください。

リスナーはhere、カスタマイズされたコンバーターを使用するリスナーファクトリの設定はhereです。 idClassMappingFoo2タイプに変換されるように設定されている方法をご覧ください。

明らかに、タイプはソースタイプと互換性がなければなりませんが、同じクラスである必要はありません。

関連する問題