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对象,需要用接受次序来控制到底接受哪一个。