0

ApacheQpidでメッセージレベルでルーティングキーを設定するオプションはありますか。私の現在のやり方は

  1. アドレス文字列でルーティングキーを指定します。この宛先アドレスでプロデューサーを作成します。

    トピック=(トピック)context.lookup( "destination"); 送信者=session.createProducer(トピック);

  2. プロデューサーを介してメッセージを送信します。

このようにして、すべてのメッセージが同じルーティングキーを持ちます。私が達成したいのは、各メッセージのルーティングキーを個別に設定することです。

これができるかどうか教えてください

4

4 に答える 4

2

これは、メッセージごとの件名を指定することで簡単に実行できます。Qpidアドレススキームで定義されている「サブジェクト」は、0-10プロトコルを使用する場合、トピックのルーティングキーにマップされます。

Message m = ssn.createMessage();
m.setStringProperty("qpid.subject", "my-subject");
prod.send(m);

これにより、Qpidアドオンを使用しながら、標準のJMSインターフェースを使用できます。

于 2012-02-13T17:00:45.477 に答える
1

私は最初にこれをやってみました:

Message message = session.createTextMessage("test");
AMQMessageDelegate_0_10 delegate = (AMQMessageDelegate_0_10) ((AbstractJMSMessage)message).getDelegate();
delegate.getDeliveryProperties().setRoutingKey("rk1");

しかし、メッセージを送信すると、宛先に設定されたルーティングキーがまだ残っていました。

QpidのJavaソースコードを見ると、これが現在可能かどうかはわかりません。https://svn.apache.org/repos/asf/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.javaを見ると、次のように表示されます。このようなコード:

String routingKey = destination.getRoutingKey().toString();
if (deliveryProp.getRoutingKey() == null || ! deliveryProp.getRoutingKey().equals(routingKey))
{
        deliveryProp.setRoutingKey(routingKey);
}

残念ながら、これは、メッセージにルーティングキーを設定した場合でも、メッセージのルーティングキーが宛先のルーティングキーと異なる場合は、宛先のルーティングキーに置き換えられることを意味しているように見えます。

これを行う方法はあるかもしれませんが、残念ながら、私はQpidのJava側にあまり精通していません。最善の策は、おそらくQpidユーザーメーリングリストで質問することです(詳細については、http://qpid.apache.org/mailing_lists.htmlを参照てください)。

于 2012-02-11T12:29:35.923 に答える
0

setJMSReplyTo( "address")をルーティングキーに設定できます。必要な応答チャネルで応答を取得するために使用しました。

于 2012-06-08T08:56:42.577 に答える
0

AMQPトピックを使用することで、目的を達成できるはずです。routingKeyを「my-topic」などに設定します。「subject-1」、「subject-2」など、設計どおりにさまざまなサブジェクトにコンシューマーを設定します。

プロデューサーの場合、それぞれが「my-topic.subject-1」、「my-topic.subject-2」など、さまざまな件名のメッセージを送信できます。これらをプロデューサーのroutingKeyとして使用します。

サンプルコードは次のようになります。

//set up message consumer for "subject-1"
AMQTopic topic-1 = new AMQTopic(new AMQShortString("amq.topic"), new AMQShortString("my-topic.subject-1), false, null, true);
MessageConsumer consumer = session.createConsumer(topic-1);
Message message = consumer.receive();
...

//set up message producer for "subject-1"
MessageProducer producer = session.createProducer(topic-1);
producer.send(session.createTextMessage("my message"));

このようにして、ルーティングキーとして「my-topic。*」を使用して、「my-topic」に送信されるすべてのメッセージを受信するようにコンシューマーを設定することもできます。詳細については、Qpidのドキュメント「Programming-In-Apache-Qpid」を参照してください。

于 2013-10-11T15:13:27.753 に答える