2016-11-15 8 views
0

Apache Camel(2.15.2)の無限ループに問題があります。以下に示すルートは、通常の状態で正常に動作します。ただし、まれに、すべてのCPUを消費する無限ループが作成されます。私はこれを引き起こす原因はわかりませんが、ルート上のメッセージを生成しているリモートアプリケーションがシャットダウンしているときに関連していると感じています。 (RouteBuilderを使用して)ルートを設定するにはApache Camelエラー時に無限ループ

コード:

@Override 
public void configure() throws Exception { 
    errorHandler(deadLetterChannel(
     "file:messages/myRoute?fileName=${date:now:yyyyMMdd-HHmm-ssSSS}.xml") 
     .useOriginalMessage() 
     .maximumRedeliveries(10) 
     .delayPattern("1:5000"); 
    onException(java.net.ConnectException.class).handled(true); 

    fromF("myEndpoint") 
     .routeId("myRoute") 
     .bean(messageHandler, "process"); 
} 

メッセージを扱うBeanは:

public void process(final String message) { 
    final MyMessage message = (MyMessage) marshaller.getXStream().fromXML(message); 
    ...some processing... 
    producer.sendBody("anotherEndpoint", marshaller.getXStream().toXML(message)); 
} 

私はいくつかのスレッドダンプを作った、それらはすべてこれに似たものを示しています。

at com.thoughtworks.xstream.core.DefaultConverterLookup.lookupConverterForType(DefaultConverterLookup.java:56) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:56) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50) 
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134) 
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32) 
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1206) 
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1190) 
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1061) 
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1052) 
at com.example.message.MessageHandler.process(MessageHandler.java:58) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408) 
at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279) 
at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252) 
at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:171) 
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.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) 
at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87) 
at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:103) 
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:746) 
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:684) 
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:651) 
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:315) 
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:253) 
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1164) 
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1156) 
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1053) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

おそらく、私のerrorHandlerおよび/またはonExceptionが間違っていますか?ありがとうございました!

+0

どのエンドポイントの種類が** anotherEndpoint **ですか?通常のCamelを使用する代わりに、手動で非マーシャリング、整列化、 'process'メソッド内で送信するのはなぜですか? –

+0

"MyEndpoint"はどのエンドポイントですか? –

+0

@SoucianceEqdamRashti両方のエンドポイントはActiveMQです。 – user5806139

答えて

0

無限ループは、基になるxストリームライブラリの並行性の問題に関連している可能性があります。 https://github.com/x-stream/xstream/issues/2と関連する問題を参照してください。

+0

ありがとうございます。はい、これは実際にはx-streamライブラリの並行性/初期化の問題が原因であることを確認できます。私は自分自身でこの質問を更新する必要があります。 – user5806139