2012-11-09 35 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

相关问题