2012-08-07 170 views
0

我有一個java的ActiveMQ生產者,它產生一個ObjectMessage實例的整數消息。Java生產者,蟒蛇消費者,ActiveMQ

在python方面,我使用stomp python監聽隊列。但是,我收到空郵件正文,雖然所有標題都收到正確。而且,如果我將消息類型更改爲java端的TextMessage,則在python-consumer端會得到正確的消息。

我也試圖與PyactiveMQ但具有相同的效果

任何建議,可以理解!

編輯:這是我寫的關於蟒蛇

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踐踏監聽測試跺腳一個樣板的java製作的代碼和Python用戶代碼

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) 
+0

給我們一些代碼片段,您在哪裏創建消息以及在哪裏閱讀消息。 – 2012-08-07 05:23:37

回答

3

爲了發通過Stomp接收ObjectMessage類型,您需要使用ActiveMQ的消息transformation feature以STOMP客戶端可以理解的形式交付對象負載。 ActiveMQ提供XML和JSON轉換支持,但您可以添加自己的轉換器以獲取您想要的任何格式的內容。

+0

感謝您的回答蒂姆。發送textMessage並完全消除ObjectMessage是不是更容易? ObjectMessage需要一個可序列化的對象,而textMessage需要一個toString()和fromString()方法。國際海事組織的textMessage應該足以應付各種有效載荷數據,不是嗎? – 2012-08-07 11:59:51

+0

另外我有一個虛擬隊列和3個物理隊列。因此,有三個消費者,2個java和1個python。轉換消息是否有意義因爲java消費者正在使用Openwire協議? – 2012-08-07 12:05:14

+0

您應該使用任何消息類型對您的應用程序有意義。消息轉換機制僅影響STOMP客戶端之間的消息,如果您將消息從STOMP客戶端轉換爲ObjectMessage,則openwire客戶端將獲得ObjectMessages,如果您將對象轉換爲XML,則只有STOMP客戶端獲得XML形式的openwire客戶端得到ObjectMessage。 – 2012-08-07 13:02:01

2

問題:將ObjectMessage從java生產者發送到ActiveMQ代理。踐踏Python的消費客戶是越來越空消息體

SOLUTION:使用轉換頭,而訂閱的Python客戶端ActiveMQ代理,

例如:

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

讓經紀人知道以什麼形式將消息發送給stomp客戶端