0

リモートOSGi-Containerにメッセージを送信するためにActiveMQ(Springを使用)を使用しています。これは非常にうまく機能しますが、1つの問題があります。

Serializableを実装する2つのクラスがあります。次のように、一方のクラスはもう一方のクラスのクラスメンバーです。

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

したがって、が親インスタンスを送信すると、親のメンバーはnullになります。

私の問題が何であるかを理解していただければ幸いです:)

編集:面白い問題:正しくシリアル化されたjava.util.dateをクラスに取得しましたが、これが唯一のものであり、すべてのDoubleなどはnullです。

4

2 に答える 2

11

オブジェクトがオプションである場合、あなたはこのようなものを選ぶかもしれません

プロデューサー側:

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();
        }
    }
}
于 2012-11-09T15:27:15.810 に答える
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.
于 2012-11-09T14:57:47.873 に答える