2017-06-05 98 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。 –