2

Spring3.1.1.RELEASEおよびActiveMQ5.5.1でCamel2.9.1を使用しています。

@InOutCamelJMSを使用してサーバー上のKaraf/FelixOSGiコンテナー内のバンドルで実行されているデータサービスに対して要求/応答呼び出しを行うSwingGUIクライアントがあります。

このサービスは、特定の状況で、クライアントで処理したい例外をスローします。

これらの例外がスローされると、CamelはそれらをaRuntimeCamelExceptionでラップされたクライアントに戻し、すべて正常に機能します。

しかし、ここで、例外がクライアントに返されるときにCamelが自動的にログに記録するように見えるスタックトレースを抑制したいと思います。サーバーのログからの抜粋は次のとおりです。

2012-11-01 13:04:13,463 | ERROR | org.apache.camel.util.CamelLogger | Failed delivery for (MessageId: ID-pc01-48122-1351720826468-9-121549 on ExchangeId: ID-pc01-48122-1351720826468-9-121547). Exhausted after delivery attempt: 1 caught:org.apache.camel.RuntimeCamelException: our.own.SomethingException: Some explanation of exception here
org.apache.camel.RuntimeCamelException: our.own.SomethingException: Some explanation of exception here
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1221)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanInvocation.invoke(BeanInvocation.java:87)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:128)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:101)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
... etc.

これは、ログですぐに次のように続きます。

2012-11-01 13:04:13,517 | WARN  | org.apache.camel.util.CamelLogger | Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - our.own.SomethingException: Some explanation of exception here]
org.apache.camel.RuntimeCamelException: our.own.SomethingException: Some explanation of exception here
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1221)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanInvocation.invoke(BeanInvocation.java:87)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:128)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:101)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110)[120:org.apache.camel.camel-core:2.9.1]
...etc

これで、クライアントのSpringファイルの定義は次のようになります。

<bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="brokerURL" value="tcp://${current.host}:${current.port}?jms.prefetchPolicy.queuePrefetch=0"/>
    <property name="transacted" value="false"/>
    <property name="requestTimeout" value="60000"/>
    <property name="transferException" value="true"/>
    <property name="errorHandlerLogStackTrace" value="false"/>
    <property name="concurrentConsumers" value="1"/>
    <property name="maxConcurrentConsumers" value="1"/>
</bean>

プロパティが「errorHandlerLogStackTracefalse」に設定されているため、スタックトレースがまだログに記録されている理由がわかりません。

サーバー側で同様のプロパティ設定を行う必要がありますか(これはスタックトレースを含むサーバーログであるため)?

ちなみに、これらのもののほとんどは、私たちのためにもう働いていない前の従業員によって設定されました。私は何が起こっているのかをかなりよく理解していますが、それのいくつかはまだ私には謎です。

更新:5/11/12-クラウスの答えの後

OK、Spring DSL XMLファイルをもう少し掘り下げてみると、JMSコンポーネントが、他のサーバーバンドルが参照している「ブローカー」と呼ばれる別のOSGiバンドルのサーバーで定義されていることがわかりました。このバンドルには、クライアントが持っていたのと同じ「jms」BeanのXML定義がありました(上記)。

この定義に「errorHandlerLogStackTrace」プロパティを追加しました。これにより、スタックトレースの1つを取り除くことができました。私が今得ているのは、スタックトレースを伴うエラーであり、その直後にスタックトレースを伴わない警告が続きます。より完全なスニペットは次のとおりです。

2012-11-05 10:44:35,323 | ERROR | org.apache.camel.util.CamelLogger | Failed delivery for (MessageId: ID-pc01-38192-1352065125718-9-62 on ExchangeId: ID-pc01-38192-1352065125718-9-60). Exhausted after delivery attempt: 1 caught: org.apache.camel.RuntimeCamelException: our.own.SomethingException: Some explanation of exception here
org.apache.camel.RuntimeCamelException: our.own.SomethingException: Some explanation of exception here
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1221)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanInvocation.invoke(BeanInvocation.java:87)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:128)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:101)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86)[120:org.apache.camel.camel-core:2.9.1]
    at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:104)[147:org.apache.camel.camel-jms:2.9.1]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:562)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:500)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:468)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:326)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063)[63:org.springframework.jms:3.1.1.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960)[63:org.springframework.jms:3.1.1.RELEASE]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)[:1.6.0_24]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)[:1.6.0_24]
    at java.lang.Thread.run(Thread.java:662)[:1.6.0_24]
Caused by: our.own.SomethingException: Some explanation of exception here
    at uniworks.ServiceManagers.SuperDataManager.createInUseForEntity(SuperDataManager.java:2156)[220:uniworks-ejb:1.1.4.SNAPSHOT]
    at uniworks.ServiceManagers.SuperDataManager.findForEdit(SuperDataManager.java:913)[220:uniworks-ejb:1.1.4.SNAPSHOT]
    at uniworks.ServiceManagers.SuperDataManager.findForEdit(SuperDataManager.java:853)[220:uniworks-ejb:1.1.4.SNAPSHOT]
    at uniworks.ServiceManagers.SuperDataManager.findForEdit(SuperDataManager.java:843)[220:uniworks-ejb:1.1.4.SNAPSHOT]
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_24]
    at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_24]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)[65:org.springframework.transaction:3.1.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)[55:org.springframework.aop:3.1.1.RELEASE]
    at $Proxy221.findForEdit(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_24]
    at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_24]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
    at org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:56)
    at org.springframework.osgi.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:39)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)[90:org.springframework.osgi.core:1.2.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[55:org.springframework.aop:3.1.1.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)[55:org.springframework.aop:3.1.1.RELEASE]
    at $Proxy1044.findForEdit(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)[:1.6.0_24]
    at java.lang.reflect.Method.invoke(Method.java:597)[:1.6.0_24]
    at org.apache.camel.component.bean.BeanInvocation.invoke(BeanInvocation.java:83)[120:org.apache.camel.camel-core:2.9.1]
    ... 46 more
2012-11-05 10:44:35,335 | WARN  | org.apache.camel.util.CamelLogger | Execution of JMS message listener failed. Caused by: [our.own.SomethingException: Some explanation of exception here]

ここでこれらを複雑にしているのは、このメソッド呼び出しがとる「パス」です。

クライアントは、JMS要求/応答メッセージを使用して、次のルート定義を使用してサーバーを呼び出します。

<bean id="animalTypeDataManager" class="org.apache.camel.spring.remoting.CamelProxyFactoryBean">
    <property name="serviceUrl" value="jms:animalTypeDataManager"/>
    <property name="serviceInterface" value="uniworks.ServiceManagers.a.Animal.AnimalTypeDataInterface"/>
</bean>

そのルートのサーバー側は、次のように1つのOSGiバンドル(「BundleA」と呼びます)で定義されます。

<camel:route>
    <camel:from uri="jms:animalTypeDataManager"/>
    <camel:to uri="bean:osgi_animalTypeDataManager"/>
</camel:route>

このルートで参照されるBeanは、実際にはOSGi'サービス'として別のバンドル('BundleB')にあります。BundleAは、次のように定義されたこのBeanへの参照を持っています。

<reference id="osgi_animalTypeDataManager" 
           interface="uniworks.ServiceManagers.a.Animal.AnimalTypeDataInterface"/>

また、BundleBのサービスは次のように定義されています。

<service id="osgi_animalTypeDataManager" ref="animalTypeDataManager" 
         interface="uniworks.ServiceManagers.a.Animal.AnimalTypeDataInterface"/>

例外をスローしているのは、この最後のサービスBeanです。

これらのルートの各サーバー側に(BundleAで)配置することもできerrorHandlerますが、これを一般的に1か所で実行できるようにしたいと思います。

BundleAで( Camelのドキュメントに従って)ロギングエラーハンドラーを次のように定義してみました。

<camel:errorHandler id="loggingErrorHandler" type="LoggingErrorHandler" logName="mylogger.name" level="DEBUG"/>

<camel:camelContext id="bundleA_camel" errorHandlerRef="loggingErrorHandler">

..... [jms routes defined in here]

</camel:context>

しかし、それは何の違いももたらさなかったようです。

4

3 に答える 3

4

スタックトレースを含む 1 番目のログは Camel のエラー ハンドラからのもので、デフォルトではスタックトレースを使用して ERROR レベルで使い果たされた障害をログに記録します。これは好みに合わせて構成できます。詳細については、Camel のエラー ハンドラ ドキュメントを参照してください。 http://camel.apache.org/error-handling-in-camel.html

2 番目のログは JmsConsumer とオプション errorHandlerLogStackTrace=false からのもので、強制的にスタック トレースを記録しないようにする必要があります。Camel 2.9.1 にこの領域のバグがあるかどうかはわかりません。最新の Camel を試してみましたが、問題なく動作します。

http://svn.apache.org/viewvc?rev=1405307&view=revに役立つ単体テストを次に示します。

于 2012-11-03T08:26:01.320 に答える
1

OK、Clausのヒントと、ここにあるCamel Docsのセクションの後、私はついにスタックトレースを取り除くことができました。

JMSメッセージを受け取り、それらを参照に渡すルートを含むCamelコンテキストのSpring DSL定義の前に、次のようbeanにaのインスタンスを定義しました。noErrorHandler

<camel:errorHandler id="noErrorHandler" type="NoErrorHandler"/>

次に、そのエラーハンドラーをCamelコンテキスト自体に追加しました。

<camel:camelContext id="bundle_camel" errorHandlerRef="noErrorHandler">

これで、Beanによってスローされた例外は、Camelがスタックトレースをログに記録せずに呼び出し元に伝播します。

于 2012-11-09T03:03:51.857 に答える