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數據格式一起使用?
任何人都可以幫忙嗎? :|
你的POJO是否可串行化?你可以通過JMS發送POJO,使用ObjectMessage作爲JMS消息(Camel會爲你做),但它必須實現Serializable(Active MQ實際上允許不可序列化的Java對象作爲消息,但只有當你使用VM傳輸如果您設置了禁用對象序列化的選項)。 –
所以如果你的一個端點有效,那另一個呢?您可以刪除多播並將其發送到JMS隊列並查看是否通過。正如前面的評論者所說,它可能是你的POJO不可序列化的。 –
嗨,沒有POJO的不是Serialiazable。它們是使用wsdl2java工具自動生成的。是否有一項工作可以使它適用於非可序列化的POJO。我使用的嵌入式AMQ使用虛擬機運輸順便說一句。 – dnzdlklc