骆驼 - 保留邮件的副本

时间:2014-01-09 05:49:41

标签: apache-camel jbossfuse apache-servicemix

我的骆驼路线如下(样本)

from(activemq:xyz)---从队列接收消息

to(smpp:abc)---将消息提交给SMSC

to(cxf:hij)---基于SMSC响应成功调用webservice

我面临的问题如下

我从队列收到的交换属性/标头很少,但是在收到SMPP的响应后,我发送的交换标头/属性被清除,我无法调用web服务。我能做些什么来保持这些值,直到我到达路线的尽头。我无法控制SMSC实施,也无法更改SMSC响应。我正在使用SPRING dsl

2 个答案:

答案 0 :(得分:4)

您可以考虑将名为Content Enricher的企业集成模式用于SMPP部分,使用自定义AggregationStrategy来“保留”您的原始交换(包含所有标题和属性),并将您带到无论SMSC做什么,需要(身体,我推测?)。

from (activemq:xyz)
    .enrich(smpp:abc, new PreserveHeadersAndPropertiesAggregationStrategy())
    .to(cxf:hij)
;

public class PreserveHeadersAndPropertiesAggregationStrategy implements AggregationStrategy {
    @Override
    public Exchange aggregate(Exchange original, Exchange resource) {
         // use body from getIn() or getOut() depending on the exchange pattern...
        original.getIn().setBody(resource.getIn().getBody());
        original.getOut().setBody(resource.getOut().getBody());
        return original;
    }
}

答案 1 :(得分:0)

您可以使用bean并将要保留的标头和属性存储在线程本地成员中。保留和恢复所有标头/属性的简单示例可能如下所示:

public class BeanToHoldHeadersAndProps {
    ThreadLocal<Map<String,Object>> headers = new ThreadLocal<>();
    ThreadLocal<Map<String,Object>> props = new ThreadLocal<>();

    public void saveHeaders(Exchange exchange) {
        headers.set(exchange.getIn().getHeaders());
        props.set(exchange.getProperties());
    }

    public void restoreHeaders(Exchange exchange) {
        exchange.getIn().setHeaders(headers.get());
        exchange.getProperties().putAll(props.get());
    }
}

路线:

<camel:route id="header_preserving_route">
    <camel:from url="activemq:xyz" />
    <camel:bean ref="headerPreserver" method="saveHeaders" />
    <camel:to url="smpp:abc" />
    <camel:bean ref="headerPreserver" method="restoreHeaders" />
    <camel:to url="cxf:hij" />
</camel:route>

根据您的要求,您可能需要携带第三个元素,即交换的附件。