我的骆驼路线如下(样本)
from(activemq:xyz)---从队列接收消息
to(smpp:abc)---将消息提交给SMSC
to(cxf:hij)---基于SMSC响应成功调用webservice
我面临的问题如下
我从队列收到的交换属性/标头很少,但是在收到SMPP的响应后,我发送的交换标头/属性被清除,我无法调用web服务。我能做些什么来保持这些值,直到我到达路线的尽头。我无法控制SMSC实施,也无法更改SMSC响应。我正在使用SPRING dsl
答案 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>
根据您的要求,您可能需要携带第三个元素,即交换的附件。