zoukankan      html  css  js  c++  java
  • 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对象,需要用接受次序来控制到底接受哪一个。

  • 相关阅读:
    党务
    平台 大赛 公司
    音乐
    有趣的博主
    C++获取命令行参数命令
    360读全景
    3 海康网络相机官方例程(3)OpenCv + ffmpeg + rtmp 实现摄像头采集数据直播功能(不带cuda加速)
    使用opencv4进行分类器训练
    经典环境(2)OpenCV412+OpenCV-Contrib +vs2015+cuda10.1编译
    经典环境(1)OpenCV3.4.9+OpenCV-Contrib +vs2015+cuda10.1编译
  • 原文地址:https://www.cnblogs.com/orientsun/p/2609866.html
Copyright © 2011-2022 走看看