Apache Camel Intercept - 捕获输出。

时间:2014-05-09 02:55:27

标签: apache-camel interceptor

我试图在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&amp;
            convertAttachments=true" />
        <camel:to
            uri="sonicesb://Process/rConnect?bindingStrategy=#ExposeBindingStrategy.Resource.rConnect.rconnect&amp;headerFilterStrategy=#ExposeHeaderFilterStrategy.Resource.rConnect.rconnect&amp;esbConfig=#ExposeEsbConfig.Resource.rConnect.rconnect" />
    </camel:route>
    <camel:route autoStartup="false">
        <camel:from
            uri="directsonicesb:Resource.rConnect.rconnect?bindingStrategy=#InvokeBindingStrategy.Resource.rConnect.rconnect&amp;headerFilterStrategy=#InvokeHeaderFilterStrategy.Resource.rConnect.rconnect&amp;uriTemplate=#URITemplate.Resource.rConnect.rconnect" />
        <camel:to uri="sonicesb://Process/rConnect" />
    </camel:route>
</camel:camelContext>

关注this文章。

但是&#34; CaptureProcessor&#34;只在输入周期调用一次。

如何让它也捕获输出?

3 个答案:

答案 0 :(得分:3)

根据Camel docintercept无法实现这一点:

  

在每个处理步骤之前,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)

谢谢彼得。

这就是诀窍。

虽然有些有趣的结果

  • 仍需要拦截条目来捕获传入的请求。
  • 一旦我将onCompletion条目添加到我的Spring配置中,处理器将被调用四次,三次进入和一次出局。

我尝试将intercept和onCompletion条目移动到不同的地方,但总是得到相同的结果。我的解决方案是在第一个入站呼叫上添加一个特定的Header,如果标头已经存在则在其他呼叫上绕过处理。

此致 史蒂夫