Search code examples
javaglassfishjms

ObjectMessage.setObject() throws javax.jms.JMSException for no apparently reason


Having a custom object like this:

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 *

}

Then I create I try to send to my jms queue an ObjectMessage containing my custom message object:

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

When trying to run the code, exception throwed is:

[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)

So what the problem is? I dont find any errors in my code, and my object is serializable.


Solution

  • I used google to pick apart your error message:

    [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)
    

    It seems that the TextMessage object is actually an instance of com.sun.messaging.jms.ra.DirectTextPacket.

    However, for your MessageObject to be serializable all of its fields need to be serializable too. As DirectTextPacket is not serializable, your MessageObject is not serializable.


    To answer the question "why do you get this exception instead of NotSerializableException"?

    This is because JMS wraps exceptions like NotSerializableException into its own exceptions.


    What I do not understand: why do you want your MessageObject to contain a wrapped TextMessage? Why not add the text itself into your MessageObject?