0

POJO を使用して spring amqp を介して基本的な要求/応答メッセージングをセットアップしました。これらは JSON メッセージコンバーターを介して RabbitMQ で交換されます。

これまでの応答 pojo のペイロードは単純な文字列でしたが、今では画像を返信する必要があります。

Q1) これを処理する最善の方法は何ですか? JSON メッセージのペイロード文字列として画像を base64 エンコードする必要がありますか?

Q2) 単純に画像を BytesMessage として返すことは可能ですか?

Q2.a) spring-amqp は、POJO を返すリスナーと BytesMessage を返すリスナーの 2 つの別個のリスナーを処理できますか? 私はそうは思わないでしょうが、ここに私が求めているものの周りの疑似コードがあります:

<listener-container>
    <listener ref="requestHandlerA" method="handleMessage" queue-names="#{requestQueue.name}" />
    <listener ref="requestHandlerB" method="handleMessage" queue-names="#{requestQueue.name}" />
</listener-container>

public class RequestHandlerA {
    public ResponseDelegatePojo handleMessage(RequestDelegatePojo requestDelegate) {...}
}
public class RequestHandlerB {
    public BytesMessage handleMessage(RequestDelegatePojo requestDelegate) {...}
}

Q2.b) または ... MessageListener がオブジェクトを返す場合 (POJO の場合もあれば、BytesMessage の場合もある) ... spring-amqp フレームワークは、実行時にそれに応じて調整して、シリアル化された POJO を送り返すことができますか?場合によっては json として、場合によっては BytesMessageをそのままにしますか?

4

1 に答える 1

1

このような 2 つのリスナーは機能しません。競合する 2 つのコンシューマーが同じキューに作成されるだけです。1 つの解決策は、異なるキュー (および異なるリスナー) を使用することです。

両方のリクエスト タイプに同じキューを使用する場合、おそらく最も簡単な解決策は、リスナー POJO がObject(POJO またはbyte[]) (Q2b) を返し、カスタム を使用することMessageConverterです。

カスタム messageConverter は非常に単純です。常にインバウンドで JSON を取得すると仮定すると、常にJsonMessageConverterin に委任さfromMessage()れ、アウトバウンド側 ( toMessage) は aJsonMessageConverterまたは a のいずれかに委任する必要がありSimpleMessageConverterます。

if (object instanceof byte[]) {
    return this.simpleMessageConverter.toMessage(object, messageProperties);
else {
    return this.jsonMessageConverter.toMessage(object, messageProperties);
}

はプロパティを にSimpleMessageConverter設定しますが、必要に応じてそのメソッドを呼び出した後に変更できます( .contentTypeapplication/octet-streamtoMessagemessage.getMessageProperties().setContentType(...);

于 2013-06-23T08:08:26.887 に答える