2015-06-03 119 views
0

我有一個通用Camel路由,它偵聽帶有DataFormat:POJO的CXF:Bean(SOAP)請求。駱駝組播; Direct和AMQ

我希望這條路線將組播傳入交換到AMQ JMS隊列,稍後將由另一條內部路由使用,另一個端點是直接的:將用於回覆SOAP的端點消息說,即 「成功」

不過,我得到了下面的錯誤與堆棧跟蹤:

015-06-03 16:56:49.645 INFO 4992 --- [qtp110495750-79] XxToYyyAsynchronizerRoute    : An error has occurred. java.lang.RuntimeException: xxx.zzz.yyy.xx_to_zzz.RequestType 
at org.apache.activemq.command.ActiveMQObjectMessage.storeContent(ActiveMQObjectMessage.java:118) 
at org.apache.activemq.command.ActiveMQObjectMessage.setObject(ActiveMQObjectMessage.java:169) 
at org.apache.camel.component.jms.JmsBinding.createJmsMessageForType(JmsBinding.java:561) 
at org.apache.camel.component.jms.JmsBinding.createJmsMessage(JmsBinding.java:473) 
at org.apache.camel.component.jms.JmsBinding.makeJmsMessage(JmsBinding.java:289) 
at org.apache.camel.component.jms.JmsProducer$2.createMessage(JmsProducer.java:297) 
at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:274) 
at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access$100(JmsConfiguration.java:217) 
at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate$1.doInJms(JmsConfiguration.java:231) 
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:493) 
at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:228) 
at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:431) 
at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:385) 
at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:153) 
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:129) 
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.component.cxf.CxfConsumer$1.asyncInvoke(CxfConsumer.java:95) 
at org.apache.camel.component.cxf.CxfConsumer$1.invoke(CxfConsumer.java:75) 
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$2.run(ServiceInvokerInterceptor.java:126) 
at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:131) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:251) 
at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:234) 
at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70) 
at org.eclipse.jetty.server.handler.ContextHandler.__doHandle(ContextHandler.java:1129) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1065) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
at org.eclipse.jetty.server.Server.handle(Server.java:497) 
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 
at java.lang.Thread.run(Thread.java:745) 

我的路線被定義爲每如下:

 onException(Exception.class) 
      .handled(true) 
      .log(LoggingLevel.INFO, "An error has occurred. ${exception.stacktrace}"); 

    from("{{xyz.route.zzz.soap.endpoint}}") 
     .routeId(xx_TO_zz_ROUTE_ID) 
     .log(LoggingLevel.INFO, "Placing messages into generic queue!") 
     .multicast().parallelProcessing().to("{{xxx.yy.to.zzz.jms.queue}}", "{{aaaa.xxx.generic.route}}"); 
} 

爲了測試的目的,如果我刪除了QueueEndpoint並且只將它發送到GenericRoute,我得到了一個帶有「SUCCESS」的SOAP響應。我懷疑我沒有正確使用多播,或者AMQ(JMS)隊列不能與POJO數據格式一起使用?

任何人都可以幫忙嗎? :|

+0

你的POJO是否可串行化?你可以通過JMS發送POJO,使用ObjectMessage作爲JMS消息(Camel會爲你做),但它必須實現Serializable(Active MQ實際上允許不可序列化的Java對象作爲消息,但只有當你使用VM傳輸如果您設置了禁用對象序列化的選項)。 –

+0

所以如果你的一個端點有效,那另一個呢?您可以刪除多播並將其發送到JMS隊列並查看是否通過。正如前面的評論者所說,它可能是你的POJO不可序列化的。 –

+0

嗨,沒有POJO的不是Serialiazable。它們是使用wsdl2java工具自動生成的。是否有一項工作可以使它適用於非可序列化的POJO。我使用的嵌入式AMQ使用虛擬機運輸順便說一句。 – dnzdlklc

回答

0

好吧,我從Cyaegha(謝謝)帶領了我,並使用下面的答案生成了POJO的wsdl2java。

Solution for wsdl2java serialization

使用這些POJO的其中實現Serializable接口,現在的作品!

歡樂時光! =)