2

我的骆驼路线如下(示例)

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

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

to(cxf:hij) --- 基于 SMSC 响应作为成功调用 web 服务

我面临的问题如下

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

4

2 回答 2

5

您可以考虑为 SMPP 部分使用名为Content Enricher的企业集成模式,使用自定义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;
    }
}
于 2014-01-09T07:17:06.917 回答
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>

根据您的要求,您可能希望保留第三个元素,即交易所的附件。

于 2014-01-09T08:26:48.323 回答