2017-06-05 57 views
-1

我试图从使用骆驼路由的队列读取消息并将其发送给消息监听器的bean,但它以异常结束。难道我做错了什么。在ActiveMQ的如何在骆驼路由中读取消息形式activemq

<bean class="com.herman.cxf.incident.ReportIncidentRequestConsumer" 
      id="requestConsumer" /> 
     <camelContext id="camelContext-32616f27-d786-4ed8-9f75-2d208cd14b40" 
      trace="false" xmlns="http://camel.apache.org/schema/blueprint"> 
      <route id="report_amq"> 
       <from uri="activemq:queue:INCIDENT_REQUEST" /> 
       <to uri="bean:requestConsumer" /> 
      </route> 
     </camelContext> 

消息听者类 我已经序列化对象:

public class ReportIncidentRequestConsumer implements MessageListener { 

     Logger _log = Logger.getLogger(ReportIncidentRequestConsumer.class); 

     @Override 
     public void onMessage(Message arg0) { 
      _log.info("================== IM HERE IN REQUEST CONSUMER ==============="); 
     } 

    } 

错误时抛出: 产生的原因:javax.jms.JMSException异常:无法从内容构建体。不可用于经纪商的可序列化类。原因:java.lang.ClassNotFoundException:禁止的类org.apache.cxf.message.MessageContentsList!这个类不被信任被序列化为ObjectMessage有效载荷。

+0

请参阅消息传递/ JMS示例:https://github.com/apache/camel/tree/master/examples#examples并阅读/学习JMS消息传递/骆驼如此多。错误是关于通过JMS使用Java对象,这是BAD设计要做的。 –

+0

非常感谢@ClausIbsen。我一定会考虑这个...... –

回答

1

使用camel时,不需要MessageListener来处理消息。

您可以使用Processor来处理消息。

首先写它实现这样的处理器一类...

public class MyProcessor implements Processor { 
    public void process(Exchange exchange) throws Exception { 
    // do something... 
    } 
} 

然后你就可以很容易通过声明Spring的bean使用此路线中,通过XML说(或在JNDI注册它如果这是你的注册表)

<bean id="myProcessor" class="com.acme.MyProcessor"/> 

然后在骆驼,你可以做

from("activemq:myQueue").to("myProcessor"); 
1

跳过不同的方法来处理骆驼中的ActiveMQ,你的异常是由于“不可信的包”而引发的。 ActiveMQ使用可序列化/反序列化对象的可信程序包列表(更多详细信息:http://activemq.apache.org/objectmessage.html)。 为了能够发送/接收你的对象,你需要作为一个ActiveMq客户端,告诉你信任他们。以下是一些示例:https://github.com/apache/activemq/blob/master/activemq-camel/src/test/resources/org/apache/activemq/camel/jms-object-message.xml

+0

谢谢@Vyacheslav Enis。 –