JMS / ActiveMQ:使用对象作为类成员发送对象

时间:2012-11-09 11:23:39

标签: jms activemq spring-jms

我正在使用ActiveMQ(使用Spring)将消息发送到远程OSGi-Container。 这非常好,但有一个问题。

我有两个实现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;
}

因此,当发送Parent实例时,Parent的成员为空。

希望你明白我的问题是什么:)

编辑:有趣的问题:我的类中有一个java.util.date,它被正确序列化,但这是唯一的,所有双打等都是null

2 个答案:

答案 0 :(得分:10)

如果对象是一个选项,你可能会选择这样的东西

制片人方:

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

答案 1 :(得分:2)

字节消息中的序列化对象有点难以处理。

我会像Aksel Willgert建议的那样使用对象消息,或者简单地将它带到更多loosley耦合格式,例如序列化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.