weblogic.jms.common.messageFormatException:[JMSClientException:] Invalid property value

Error:

weblogic.jms.common.messageFormatException:[JMSClientException:055123] Invalid property value, com.jms.BHR@164dbd5

Description:

今天学习JMS,其中我想发送一个 Object 对象,代码如下:

 1 public static void send(String key, Object obj){
 2         InitialContext ctx = null;
 3         ctx = JMSUtil.getInitialContext();
 4         ConnectionFactory cf = null;
 5         Connection conn = null;
 6         Session session = null;
 7         try {
 8             cf = (ConnectionFactory) ctx.lookup("jms-jndi-cf-orient");
 9             conn = cf.createConnection();
10             session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
11             Destination dest = (Destination)ctx.lookup("jms-jndi-queue-orient");
12             MessageProducer producer = null;
13             producer = session.createProducer(dest);
14             Message msg = session.createObjectMessage();
15             msg.setObjectProperty(key, obj);
16             msg.setJMSDeliveryMode(1);
17             producer.send(msg);
18         } catch (NamingException e) {
19             e.printStackTrace();
20         } catch (JMSException e) {
21             e.printStackTrace();
22         } finally{
23             JMSUtil.close(session);
24             JMSUtil.close(conn);
25         }
26     }
27 
28     public static void main(String[] args){       
29         send("bhr", new BHR("BT FrontLine", "大连软件园路31号科技大厦A座"));
30     } 

我明明是按照JMS流程进行的,开始的时候我还以为是Message的类型设置错误了,可是我的的确确是ObjectMessage,然后接着检查我们的javaBean com.jms.BHR, 也实现了Serializable 接口。

Cause:

原因就出现在 msg.setObjectProperty(key, obj); 上,我相信很多人一看这个方法,就会认为它是把一个Object 对象encapsulate 到 msg 上,然后再 send 出去。看JMS的API:


看红圈的地方,这个方法只针对java的基本数据类型有效,也就是说你可以用这个Object方法去替代 setStringProperty() 、 setIntProperty() 、 setLongProperty() 、setTextProperty()  ,而不是我们自认为的设置 Object 对象。

Action:

发送:

ObjectMessage msg = session.createObjectMessage();
msg.setObject((Serializable) obj);

接收:

ObjectMessage msg = null;
conn.start();
msg = (ObjectMessage) consumer.receive();
obj = msg.getObject();

注意

如果你发送多个Object对象,需要用接受次序来控制到底接受哪一个。

原文地址:https://www.cnblogs.com/orientsun/p/2609866.html