Производитель Java, потребитель Stompy Python, ActiveMQ

У меня есть производитель java ActiveMQ, который создает сообщения Integer в экземпляр ObjectMessage.

Что касается Python, я использую stomp python для прослушивания очереди. Однако я получаю пустое тело сообщения, хотя все заголовки получены правильно.

Более того, если я изменю тип сообщения на TextMessage на стороне java, я получу правильное сообщение на стороне потребителя python.

Я также пробовал с PyactiveMQ, но с тем же эффектом

Любые предложения будут оценены!!!

EDIT: вот шаблонный код производителя java и код подписчика python, который я написал для тестирования stomp на python.

public class App 
{
Connection conn;
Session session;
MessageProducer producer;

public void registerPublisher(String queueName, String url) throws JMSException {
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("system", "manager" ,url);
    conn = cf.createConnection();
    conn.start();
    session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue(queueName);
    producer = session.createProducer(destination);
    producer.setDeliveryMode(DeliveryMode.PERSISTENT);

}

public void send(int c) {

    for (int i=0; i<c; ++i) {

        try {
            TextMessage tm = session.createTextMessage(new Integer(i).toString());
//              ObjectMessage tm = session.createObjectMessage();
            producer.send(tm);
        } catch (JMSException e) {
            e.printStackTrace();
        }

    }
}

public static void main(String []arg) {
    App app = new App();
    try {
        app.registerPublisher(arg[0], arg[1]);
        System.out.println(app.session);
    } catch (JMSException e) {
        e.printStackTrace();
    }
    app.send(1000);
}


}

И слушатель Python Stomp

import time
import sys
import logging
import stomp
from stomp import ConnectionListener

queuename = sys.argv[1]

logging.basicConfig( level=logging.DEBUG)

class MyListener(ConnectionListener):
    def on_error(self, headers, message):
        print 'received an error %s' % message

    def onMessage(self, headers, message):
        print headers
        print str(message)
        print type(message)
        print 'received a message ...%s...' % message


conn = stomp.Connection([('localhost', 61613)])                                                                                               
conn.set_listener('', MyListener())
conn.start()
conn.connect()


conn.subscribe(destination='/queue/'+queuename, ack='auto')


while 1:
    time.sleep(2)

person Amm Sokun    schedule 07.08.2012    source источник
comment
дайте нам несколько фрагментов кода, где вы создаете сообщение и где вы читаете сообщение.   -  person Dmitry Zagorulkin    schedule 07.08.2012


Ответы (2)


Для отправки типов ObjectMessage через Stomp вам необходимо использовать функцию преобразования ActiveMQ для получить полезную нагрузку объекта в форме, которую может понять клиент STOMP. ActiveMQ предоставляет поддержку преобразования XML и JSON по умолчанию, однако вы можете добавить свой собственный преобразователь, чтобы получить любой формат содержимого.

person Tim Bish    schedule 07.08.2012
comment
Спасибо за ответ Тим. Не проще ли отправить текстовое сообщение и полностью отказаться от ObjectMessage. Для ObjectMessage потребуется сериализуемый объект, а для textMessage — методы toString() и fromString(). IMO textMessage должно быть достаточно для всех видов данных полезной нагрузки, не так ли? - person Amm Sokun; 07.08.2012
comment
Также у меня есть виртуальная очередь и 3 физические очереди. Таким образом, есть три потребителя: 2 в java и 1 в python. Имеет ли смысл преобразовать сообщение, потому что потребители Java используют протокол Openwire? - person Amm Sokun; 07.08.2012
comment
Вы должны использовать любой тип сообщения, который имеет смысл для вашего приложения. Механизм преобразования сообщений влияет только на сообщение между клиентами STOMP, если вы преобразуете сообщение в ObjectMessage от клиента STOMP, клиенты openwire получают ObjectMessages, если у вас есть преобразование объекта в XML, только клиент STOMP получает форму XML, клиенты openwire все еще получить объектное сообщение. - person Tim Bish; 07.08.2012

ПРОБЛЕМА: отправка ObjectMessage от производителя Java в брокер ActiveMQ. Потребительский клиент Stomp Python получал пустое тело сообщения

РЕШЕНИЕ: используйте заголовок преобразования при подписке на брокера activemq в клиенте python,

Например:

connection.subscribe(destination='/queue/'+queuename, ack='auto', transformation="jms-json")

Чтобы брокер знал, в каком виде сообщение должно быть отправлено клиенту stomp

person Amm Sokun    schedule 08.08.2012