Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法停止使用Camel ActiveMQ JMS记录stacktrace_Java_Exception_Activemq_Apache Camel - Fatal编程技术网

Java 无法停止使用Camel ActiveMQ JMS记录stacktrace

Java 无法停止使用Camel ActiveMQ JMS记录stacktrace,java,exception,activemq,apache-camel,Java,Exception,Activemq,Apache Camel,我将Camel 2.9.1与spring3.1.1.RELEASE和activemq5.5.1一起使用 我有一个Swing GUI客户端,它使用Camel JMS对数据服务进行@InOut请求-应答调用,该数据服务在服务器上的Karaf/Felix OSGi容器中捆绑运行 在某些情况下,此服务抛出我们希望在客户端中处理的异常 当抛出这些异常时,Camel将它们传递回封装在runtimecameleexception中的客户机,并且一切正常 但是现在我想抑制stacktrace,当异常传递回客户机

我将Camel 2.9.1与spring3.1.1.RELEASE和activemq5.5.1一起使用

我有一个Swing GUI客户端,它使用Camel JMS对数据服务进行
@InOut
请求-应答调用,该数据服务在服务器上的Karaf/Felix OSGi容器中捆绑运行

在某些情况下,此服务抛出我们希望在客户端中处理的异常

当抛出这些异常时,Camel将它们传递回封装在
runtimecameleexception
中的客户机,并且一切正常

但是现在我想抑制stacktrace,当异常传递回客户机时,它似乎会自动记录。以下是服务器日志中的一个片段:

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>
现在,可能使这些复杂化的是这个方法调用所采用的“路径”

客户端使用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>

但这似乎没有任何区别。

带有stacktrace的第一个日志来自Camel的错误处理程序,默认情况下,该处理程序使用stacktrace在错误级别记录失败。您可以根据自己的喜好进行配置。请参阅Camel的错误处理程序文档中的详细信息。

第二个日志来自JmsConsumer,选项errorHandlerLogStackTrace=false应该强制它不记录堆栈跟踪。我不确定骆驼2.9.1在这方面是否有缺陷。我试了一下最新的骆驼,在那里效果很好

这里有一个单元测试可以帮助您

好的,在克劳斯的提示和驼峰文档部分之后,我终于摆脱了堆栈跟踪

在Spring DSL定义包含接收JMS消息并将其传递到
bean
引用的路由的驼峰上下文之前,我定义了
noErrorHandler
的一个实例,如下所示:

<camel:route>
    <camel:from uri="jms:animalTypeDataManager"/>
    <camel:to uri="bean:osgi_animalTypeDataManager"/>
</camel:route>
<reference id="osgi_animalTypeDataManager" 
           interface="uniworks.ServiceManagers.a.Animal.AnimalTypeDataInterface"/>
<service id="osgi_animalTypeDataManager" ref="animalTypeDataManager" 
         interface="uniworks.ServiceManagers.a.Animal.AnimalTypeDataInterface"/>
<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>
<camel:errorHandler id="noErrorHandler" type="NoErrorHandler"/>

然后,我将该错误处理程序添加到Camel上下文本身,因此:

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


现在,bean抛出的任何异常都将传播回调用方,而无需骆驼记录堆栈跟踪。

您也可以使用logdefined(false)


你能提供更多的信息吗,比如你的路线,错误处理程序等等?@Petter,请看我上面的编辑。目前没有定义errorHandler(除了我上面描述的尝试之外),因此它应该使用默认的errorHandler。您给了我更多关于要查找的内容的建议,我已经取得了一些进展(请参阅问题的编辑),但是我只成功地去除了一个堆栈跟踪。您可以尝试在每个堆栈跟踪上指定errorHandlerRef吗。这曾经是一个bug,在XML DSL中,errorHandlerRef的工作不正常。引用去了哪里?在
上?或者这无关紧要?我在camel上下文之外定义了
loggingerrohandler
,在上下文中定义的路由上,将受影响的bean作为
端点,我添加了
errorHandlerRef=“loggingerrohandler”
属性,并且堆栈跟踪仍然显示在日志中。是否有方法使用
doTry。。。doCatch
围绕所有允许异常传播回客户端但不记录堆栈跟踪的路由定义?
<camel:camelContext id="bundle_camel" errorHandlerRef="noErrorHandler">
onException(Exception.class)
            .handled(true)
            .logExhausted(false)