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.
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
?