我试图在spring.xml文件中使用Apache Camel Interceptor来捕获传入的请求和传出的响应,如下所示:
<bean id="InterceptProcessor" class="CaptureProcessor"/>
<camel:camelContext id="camel">
<camel:jmxAgent id="agent" disabled="true" />
<camel:intercept>
<camel:process ref="InterceptProcessor"></camel:process>
</camel:intercept>
<camel:route id="Resource.rConnect.rconnect" autoStartup="false">
<camel:from
uri="cxfjetty:${Resource.rConnect.rconnect.baseUrl}?urlTemplateRef=#URLTemplateRef.Resource.rConnect.rconnect&
convertAttachments=true" />
<camel:to
uri="sonicesb://Process/rConnect?bindingStrategy=#ExposeBindingStrategy.Resource.rConnect.rconnect&headerFilterStrategy=#ExposeHeaderFilterStrategy.Resource.rConnect.rconnect&esbConfig=#ExposeEsbConfig.Resource.rConnect.rconnect" />
</camel:route>
<camel:route autoStartup="false">
<camel:from
uri="directsonicesb:Resource.rConnect.rconnect?bindingStrategy=#InvokeBindingStrategy.Resource.rConnect.rconnect&headerFilterStrategy=#InvokeHeaderFilterStrategy.Resource.rConnect.rconnect&uriTemplate=#URITemplate.Resource.rConnect.rconnect" />
<camel:to uri="sonicesb://Process/rConnect" />
</camel:route>
</camel:camelContext>
关注this文章。
但是&#34; CaptureProcessor&#34;只在输入周期调用一次。
如何让它也捕获输出?
答案 0 :(得分:3)
根据Camel doc,intercept
无法实现这一点:
在每个处理步骤之前,Exchange会被拦截,这意味着它会在之前被截获
因此,不可能在每个步骤之后拦截处理。但是,这个要求有一个开放的Jira票证:CAMEL-6901
或者,您可以使用onCompletion
,它类似于完成后回调,可以为每个路径定义,也可以全局定义整个Camel上下文:
<onCompletion>
<log message="${body}" />
</onCompletion>
有关此可能性的更多信息,请参阅Camel docs。
答案 1 :(得分:1)
我发现了一种更适合我的方法。
在原始问题中使用截距,然后在流程类中:使用同步并添加onCompletion处理器。
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class CaptureProcessor implements Processor, Synchronization
{
@Override
public void process(Exchange exch) throws Exception
{
if (exch.hasOut())
{
// you won't get here
} else
{
// ==== Add the onCompletion interceptor ====
exch.addOnCompletion(this);
// do in processing
....
}
}
@Override
public void onComplete(Exchange exch)
{
if (exch.hasOut())
{
// do the out procesing
....
} else
{
// you won't get here
}
}
@Override
public void onFailure(Exchange exch)
{
// you get the idea by now
}
}
入站和出站拦截每次只调用一次。
答案 2 :(得分:-1)
谢谢彼得。
这就是诀窍。
虽然有些有趣的结果
我尝试将intercept和onCompletion条目移动到不同的地方,但总是得到相同的结果。我的解决方案是在第一个入站呼叫上添加一个特定的Header,如果标头已经存在则在其他呼叫上绕过处理。
此致 史蒂夫