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

  • 相关阅读:
    vue项目中兼容ie8以上浏览器的配置
    vue项目中event bus的简单使用
    js中的正则表达式小结1
    sourceTree跳过注册
    日期时间格式化
    阿里矢量图标库的使用
    mySql 常用命令
    php 常用的系统函数
    php mySql常用的函数
    php 关于php创建 json文件 和 对文件增删改查 示例
  • 原文地址:https://www.cnblogs.com/orientsun/p/2609866.html
Copyright © 2020-2023  润新知