2017-03-07 8 views
3

私は、所定の宛先に複数の種類のインスタンスを書くことができます例えば:私はその後、別のメッセージペイロードを受信するための複数の@JmsListener注釈付きの方法を提供することができるだろうと思って同じ宛先に対して複数のペイロードタイプを持つ@JmsListenerを使用していますか?

JmsTemplate template = ... 
Alpha alpha = new Alpha(...); 
Beta beta = new Beta(...); 

template.convertAndSend("my-destination", alpha); 
template.convertAndSend("my-destination", beta); 

- そのような:

@JmsListener(destination = "my-destination") 
public void receiveAlpha(Alpha alpha) { ... } 

@JmsListener(destination = "my-destination") 
public void receiveBeta(Beta beta) { ... } 

しかし、これを試してみると、Betaの値をあるメソッドに送信し、Alphaの値を別のものに送信することを区別できないため、例外が発生します。PayloadArgumentResolver.resolveArgument

これはどのように処理する必要がありますか?私はメッセージプロパティとしてペイロードタイプを符号化するとして、私は物事がそうのように動作させるために、セレクタを指定することができます。

@JmsListener(destination = "my-destination", selector = "_type = 'Alpha'") 
public void receiveAlpha(Alpha alpha) { ... } 

@JmsListener(destination = "my-destination", selector = "_type = 'Beta'") 
public void receiveBeta(Beta beta) { ... } 

しかし、春は舞台裏賢さのすべての種類をやっているように私は私が支援する必要があり驚いてそれは明示的にこれのように。

もっと暗黙的/より良い方法がありますか?

答えて

1

JmsListenerルーティングをサポートしていません - 注釈付きメソッドごとに独自のリスナーコンテナが取得されます。

唯一の他の選択肢は、...(Object object)を使用して自分自身をダウンキャストすることです。

1

メッセージポストプロセッサにセレクタプロパティを設定しようとしました。コンシューマメソッドのセレクタと同じプロパティを使用します。

template.convertAndSend("my-destination", alpha, m -> { 
     m.setStringProperty("classType", "alpha"); 
     return m; 
    }); 



をキューからメッセージを取るために:このJMSListener selector not working

がキューに送信するにチェック

@JmsListener(destination = "my-destination", selector = "classType = 'alpha'")<br/> 
    public void receiveAlpha(Alpha alpha) { ... } 
関連する問題