2012-11-09 47 views
0

我使用ActiveMQ(與Spring)發送消息到遠程OSGi-Container。 這工作得很好,但有一個問題。JMS/ActiveMQ:發送一個對象作爲類成員

我有兩個類實現Serializable。一類是另一類的類成員,如下所示:

public class Member implements Serializble { 
private int someValue; 
private static final long serialVersionUID = -4329617004242031635L; 
... } 

public class Parent implements Serializable { 
    private static final long serialVersionUID = -667242031635L; 
private double otherValue; 
private Member; 
} 

因此,何時發送父實例,父類的成員爲空。

希望你能理解我的問題是什麼:)

編輯:有趣的問題:我在我的類java.util.date這是正確的序列化,但是這是唯一的東西,所有的雙打等均爲空

+0

因此,您發送序列化的對象作爲字節消息?我的理解是否正確? –

+0

是的,這是正確的 – Mirco

+0

是否是使用對象消息的選項? –

回答

2

字節消息中的序列化對象有點難以處理。

正如Aksel Willgert所建議的那樣,我會使用對象消息,或者簡單地將它帶入一些更鬆散耦合的格式,例如序列化的XML。我快速的解決方案是使用的XStream去/從XML更鬆散耦合的方式,快速指南這裏:XStream

更新,這裏的一些代碼(需要的XStream-的.jar添加到您的項目)

// for all, instanciate XStream 
XStream xstream = new XStream(new StaxDriver()); 

// Producer side: 
TextMessage message = session.createTextMessage(xstream.toXML(mp)); 
producer.send(message); 


// consumer side: 
TextMessage tmsg = (TextMessage)msg; 
Parent par = (Parent)xstream.fromXML(tmsg.getText()); 

par.getMember() // etc should work just fine. 
9

如果對象是一個選項,你可能會去這樣的事情

製片方:

SomeObject someObject = new SomeObject(); 
ObjectMessage objectMessage = session.createObjectMessage(); 
objectMessage.setObject(someObject); 
producer.send(objectMessage); 

消費者方:

private class MessageConsumer implements MessageListener { 
    @Override 
    public void onMessage(Message message) { 
     logger.debug("onMessage() " + message); 

     if (message instanceof ObjectMessage) { 
      ObjectMessage objectMessage = (ObjectMessage) message; 
      SomeObject someObject = (SomeObject)objectMessage.getObject(); 
     } 
    } 
} 
+0

我不會像這樣創建消息,我在beans.xml中使用來創建客戶端和端點。不要沒有如何改變它 – Mirco

相關問題