2012-02-08 4 views
0

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

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

    topic = (Тема) context.lookup ("destination"); sender = session.createProducer (тема);

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

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

Позвольте мне знать, если это может быть сделано

ответ

2

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

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

Это позволяет использовать стандартную JMS-связь при использовании дополнений Qpid.

+0

Я мог бы найти вспомогательный тестовый пример в Qpid Test Case. Попробуем и вернемся – ManojGumber

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); 
} 

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

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

0

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

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")); 

таким образом, вы также можете настроить потребитель получать все сообщения, которые отправляются на «мою-тему», а также с помощью «моей-темы *. «как его ключ маршрутизации. См. Более подробную информацию в документации Qpid, «Programming-In-Apache-Qpid»

Смежные вопросы