【问题标题】:ObjectMessage.setObject() throws javax.jms.JMSException for no apparently reasonObjectMessage.setObject() 无缘无故抛出 javax.jms.JMSException
【发布时间】:2019-04-14 14:10:21
【问题描述】:

有一个像这样的自定义对象:

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)

那么问题是什么?我在我的代码中没有发现任何错误,而且我的对象是可序列化的。

【问题讨论】:

  • TextMessage 也可以序列化吗?
  • @ThomasKläger 我不确定。你认为那是问题吗?错误应该是“异常不可序列化”而不是我得到的错误吗?

标签: java glassfish jms


【解决方案1】:

我用 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”这个问题?

这是因为 JMS 将 NotSerializableException 之类的异常包装到自己的异常中。


我不明白的是:为什么你希望你的MessageObject 包含一个包装好的TextMessage?为什么不将文本本身添加到您的 MessageObject 中?

【讨论】:

  • 你说得对,我将 textmessage 更改为 String,现在可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2022-08-16
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多