ObjectMessage.setObject () выбрасывает javax.jms.JMSException без видимой причины - PullRequest
0 голосов
/ 11 ноября 2018

Имея пользовательский объект, подобный этому:

package Messages;

import java.io.Serializable;
import javax.jms.TextMessage;

public class MessageObject implements Serializable{

private static final long serialVersionUID = 1L;
private TextMessage message;
private String state; 
private String sender;
private String receiver;

public MessageObject() {

}

public TextMessage getMessage() {
    return message;
}

public void setMessage(TextMessage message) {
    this.message = message;
}
* the rest of the getters and setters *

}

Затем я пытаюсь отправить в мою очередь jms ObjectMessage, содержащую мой пользовательский объект сообщения:

try {
        Context context = new InitialContext();

        QueueConnectionFactory factory = 
        (QueueConnectionFactory)context.lookup("tiwconnectionfactory");
        Queue queue = (Queue) context.lookup("tiwqueue");
        Connection connection = factory.createConnection();
        connection.start(); 
        Session session= connection.createSession(false, 
        javax.jms.Session.AUTO_ACKNOWLEDGE);

        MessageProducer producer = session.createProducer(queue);


        MessageObject mymessage = new MessageObject();


         ObjectMessage object = session.createObjectMessage();


        TextMessage message = session.createTextMessage();
        message.setText("Hi");


        mymessage.setState("still not read");
        mymessage.setMessage(message);
        mymessage.setSender("Peter");
        mymessage.setReceiver("John");


        object.setObject(mymessage);


        producer.send(object);  

При попытке запустить код выдается исключение:

[2018-11-11T19:20:07.270+0100] [glassfish 5.0] [SEVERE] [] [] [tid: _ThreadID=28 _ThreadName=Thread-9] [timeMillis: 1541960407270] [levelValue: 1000] [[ javax.jms.JMSException:MQJMSRA_DM4001::Exception:ObjectMessage.setObject()object=Messages.MessageObject@d8b66e3:message=com.sun.messaging.jms.ra.DirectTextPacktatcom.sun.messaging.jms.ra.DirectObjectPacket.setObject(DirectObjectPacket.java:218)

Так в чем проблема? Я не нахожу никаких ошибок в моем коде, и мой объект сериализуем.

1 Ответ

0 голосов
/ 12 ноября 2018

Я использовал Google, чтобы выделить ваше сообщение об ошибке:

[2018-11-11T19:20:07.270+0100] [glassfish 5.0] [SEVERE] [] [] [tid: _ThreadID=28 _ThreadName=Thread-9] [timeMillis: 1541960407270] [levelValue: 1000] 
[[ javax.jms.JMSException:MQJMSRA_DM4001::Exception:ObjectMessage.setObject()
  object=Messages.MessageObject@d8b66e3:
  message=com.sun.messaging.jms.ra.DirectTextPacket
  at com.sun.messaging.jms.ra.DirectObjectPacket.setObject(DirectObjectPacket.java:218)

Кажется, что объект TextMessage на самом деле является экземпляром com.sun.messaging.jms.ra.DirectTextPacket.

Однако для вашего MessageObject чтобы быть сериализуемым, все его поля тоже должны быть сериализуемыми.Поскольку DirectTextPacket не сериализуем, ваш MessageObject не сериализуем.


Чтобы ответить на вопрос «почему вы получаете это исключение вместо NotSerializableException»?

Thisпотому что JMS оборачивает исключения типа NotSerializableException в свои собственные исключения.


Чего я не понимаю: почему вы хотите, чтобы ваш MessageObject содержал упакованный TextMessage?Почему бы не добавить сам текст в ваш MessageObject?

...