Apache Qpid - установить ключ маршрутизации на уровне сообщения - PullRequest
0 голосов
/ 08 февраля 2012

Есть ли возможность установить ключ маршрутизации на уровне сообщений в Apache Qpid.В настоящее время я делаю так:

  1. Укажите ключ маршрутизации в адресной строке.Создать производителя с этим адресом назначения.

    topic = (Topic) context.lookup ("destination");отправитель = session.createProducer (тема);

  2. Отправка сообщений через производителя.

Таким образом, все сообщения имеют одинаковый ключ маршрутизации.Чего я хочу добиться, так это установить ключ маршрутизации для каждого сообщения в отдельности.

Дайте мне знать, если это можно сделать

Ответы [ 4 ]

2 голосов
/ 13 февраля 2012

Это легко сделать, указав тему сообщения. «Субъект», как определено схемой адресов Qpid, будет отображаться в ключе маршрутизации для Тем при использовании протокола 0-10.

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

Это позволяет использовать стандартный интерфейс JMS, все еще используя надстройки Qpid.

1 голос
/ 11 февраля 2012

Сначала я попытался сделать это:

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

Но при отправке сообщения оно все еще имело ключ маршрутизации, который был установлен в моем пункте назначения.

Глядя на исходный код Java Qpid,Я не уверен, что это возможно в настоящее время.Если вы посмотрите на 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);
}

Это, к сожалению, означает, что даже если вы установите ключ маршрутизации в своем сообщении, он будет заменен наключ маршрутизации адресата, если ключ маршрутизации сообщения отличается от ключа маршрутизации адресата.

Возможно, есть способ сделать это, но я, к сожалению, не очень знаком со стороной Java Qpid.Лучше всего спросить в списке рассылки пользователей Qpid (см. http://qpid.apache.org/mailing_lists.html).

0 голосов
/ 11 октября 2013

Вы должны быть в состоянии достичь того, что вы хотите, используя тему AMQP. Установите для параметра routingKey что-то вроде «my-topic». Настройте своих потребителей на различные предметы, как это предусмотрено, такие как «субъект-1», «субъект-2», ...

Для производителей каждый из них может отправлять сообщения с разными темами, такими как «my-topic.subject-1», «my-topic.subject-2», ... использовать их в качестве ключа маршрутизации для производителей.

Пример кода выглядит следующим образом:

//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, "Программирование в Apache-Qpid"

0 голосов
/ 08 июня 2012

Вы можете установить setJMSReplyTo ("адрес") на ключ маршрутизации. Я использовал его для получения ответов на требуемый канал ответа.

...