javax.jms.JMSException: Failed to build body from bytes. Reason: java.io.IOException
2013-05-16 14:39
806 查看
使用activeMQ发送ObjectMessage类型时,遇到javax.jms.JMSException: Failed to build body from bytes. Reason: java.io.IOException类型错误,经过一番折腾,终于解决。详情如下:
本项目所用的activeMQ版本为5.8.0,所要实现的publisher与subscriber分属两个不同的application。测试阶段,实现比较简单,publisher实现为java application,subscriber实现为web application。因为发送的消息内容比较复杂,所以采用ObjectMessage类型的消息。自己定义了AlarmMessage类,发送的消息是ArrayList<AlarmMessage>。AlarmMessage类实现比较简单,根据自己的需要,添加所需要传递的field。唯一需要注意的是:需要实现Serializable接口
消息发送端代码:
消息接收端。因为实现了MessageListener接口,所以需要实现OnMessage方法。OnMessage方法的参数为Message类型,为了消息类型的一致而使得activeMQ能够识别,需要进行消息类型转换,具体代码如下:(如果使用了MessageListenerAdapter,需要自定义MessageConverter,实现类似OnMessage方法中的)
javax.jms.JMSException: Failed to build body from bytes. Reason: java.io.IOException: xxx.xxx.xxx.xxx.xxx.bean.AlarmMessage
经过一番google,尤其是在activeMQ官方forum中(http://activemq.2283324.n4.nabble.com/ActiveMQ-User-f2341805.html)终于找到了答案,原来是subscriber端找不到AlarmMessage类。前面已经说过,subscriber端实现为web application,跑在tomcat下,而AlarmMessage类直接作为项目源代码的一部分,为什么会找不到AlarmMessage很不可理解。也没去深究,直接把AlarmMessage编译后的类文件打成jar包,放在subscriber的lib文件夹下。再次运行,竟然可以了。
本项目所用的activeMQ版本为5.8.0,所要实现的publisher与subscriber分属两个不同的application。测试阶段,实现比较简单,publisher实现为java application,subscriber实现为web application。因为发送的消息内容比较复杂,所以采用ObjectMessage类型的消息。自己定义了AlarmMessage类,发送的消息是ArrayList<AlarmMessage>。AlarmMessage类实现比较简单,根据自己的需要,添加所需要传递的field。唯一需要注意的是:需要实现Serializable接口
消息发送端代码:
public void sendMsg(final ArrayList<AlarmMessage> list) { jmsTemplate.send(new MessageCreator() { public Message createMessage(Session session) throws JMSException { ObjectMessage msg=session.createObjectMessage(); msg.setObject(list); return msg; } }); }
消息接收端。因为实现了MessageListener接口,所以需要实现OnMessage方法。OnMessage方法的参数为Message类型,为了消息类型的一致而使得activeMQ能够识别,需要进行消息类型转换,具体代码如下:(如果使用了MessageListenerAdapter,需要自定义MessageConverter,实现类似OnMessage方法中的)
public void onMessage(Message message) { // TODO Auto-generated method stub if(!(message instanceof ObjectMessage)){ throw new MessageConversionException("Message isn't a ObjectMessage"); } try { ObjectMessage msg=(ObjectMessage) message; ArrayList<AlarmMessage> list=(ArrayList<AlarmMessage>) msg.getObject(); // AlarmMessage alarmMsg=(AlarmMessage) msg.getObject(); System.out.println("The first Message Received:"+list.get(0).toString()); } catch (JMSException e) { e.printStackTrace(); } }因为publisher和subscriber端都需要解析AlarmMessage类型的消息,所以把publisher端AlarmMessage的实现类直接复制到subscriber项目下。分别运行publisher和subscriber端,发送端没有问题,然后接收端运行到msg.getObject()方法时,抛出如下异常:
javax.jms.JMSException: Failed to build body from bytes. Reason: java.io.IOException: xxx.xxx.xxx.xxx.xxx.bean.AlarmMessage
经过一番google,尤其是在activeMQ官方forum中(http://activemq.2283324.n4.nabble.com/ActiveMQ-User-f2341805.html)终于找到了答案,原来是subscriber端找不到AlarmMessage类。前面已经说过,subscriber端实现为web application,跑在tomcat下,而AlarmMessage类直接作为项目源代码的一部分,为什么会找不到AlarmMessage很不可理解。也没去深究,直接把AlarmMessage编译后的类文件打成jar包,放在subscriber的lib文件夹下。再次运行,竟然可以了。
相关文章推荐
- javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke
- javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke
- activemq报错:Failed to start ActiveMQ JMS Message Broker. Reason: java.io.EOFException: Chunk stream d
- windows下eclipse远程连接hadoop错误“Exception in thread"main"java.io.IOException: Call to Master.Hadoop/172.20.145.22:9000 failed ”
- activemq 异常 Failed to start ActiveMQ JMS Message Broker. Reason: java.net.SocketException: No such device
- tomcat链接mysql时超时报错java.io.EOFException: Can not read response from server. Expected to read 4 bytes,
- tomcat链接mysql时超时报错java.io.EOFException: Can not read response from server. Expected to read 4 bytes,
- [Nutch]问题解决:Exception in thread "main" java.io.IOException: Failed to set permissions of path
- Exception in thread "main" java.io.IOException: Failed to set permissions of path
- Exception in thread "main" java.io.IOException: Failed to set permissions of path
- Job Submission failed with exception 'java.io.IOException
- Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locat
- java.io.IOException: Unable to parse response from server
- java.net.ConnectException: Call From localhost/127.0.0.1 to localhost:8020 failed on connection
- hadoop错误java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try
- Caused by: java.net.ConnectException: Call From master/192.168.199.130 to master:9000 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.
- MapReduce报错:Error: java.io.IOException: Initialization of all the collectors failed. Error in last collector was :interface javax.xml.soap.Text
- java.net.ConnectException: Call From USER-20160828CP/192.168.2.107 to 192.168.66.8:9000 failed on co
- java.io.IOException: Mkdirs failed to create
- 异常:org.htmlparser.util.ParserException: Error in opening a connection to java.io.IOException: Inv...