2017-09-15 88 views
0

我有一个如下的消息处理链。春季整合。通过分离器传播一些头文件

<int:header-enricher input-channel="acceptFileChannel" output-channel="validateMessageChannel"> 
    <int:error-channel ref="validateSplitTransformErrorChannel"/> 
    <int:header name="originalFileName" expression="payload.getName()"/> 
    <int:header name="originalFile" expression="payload"/> 
</int:header-enricher> 

<int:service-activator input-channel="validateMessageChannel" output-channel="splitMessageChannel"> 
    <bean class="com.my.usual.ValidationService"> 
     <property name="schemaResource" value="classpath:/META-INF/xsd/locals_final_version.xsd"/> 
    </bean> 
</int:service-activator> 

<int:splitter id="staxXmlSplitter" input-channel="splitMessageChannel" 
       output-channel="payloadTypeRoutingChannel"> 
    <bean class="com.my.usual.XMLSplitter"/> 
</int:splitter> 

<int:payload-type-router input-channel="payloadTypeRoutingChannel"> 
    <int:mapping type="org.w3c.dom.Node" channel="afterSplitChannel"/> 
    <int:mapping type="com.my.usual.SequenceSizeMessage" channel="barrier"/> 
</int:payload-type-router> 

<int:channel id="afterSplitChannel"> 
    <int:dispatcher task-executor="taskExecutor"/> 
</int:channel> 

<si-xml:xpath-router id="afterSplitRouter" input-channel="afterSplitChannel" evaluate-as-string="true"> 
    <si-xml:xpath-expression expression="local-name(/Act | /Partner)"/> 
    <si-xml:mapping value="Act" channel="transformActChannel"/> 
    <!--todo: for example of extending--> 
    <si-xml:mapping value="Partner" channel="nullChannel"/> 
</si-xml:xpath-router> 

在此链我设置两个消息头:originalFileNameoriginalFile和。 似乎最简单的方式来保留标头后分裂消息com.my.usual.XMLSplitter是重写方法的东西。

@Override 
protected boolean shouldCopyRequestHeaders() { 
    return true; 
} 

但是,如果我只需要在分离消息中使用一个头文件呢?我不知何故读取originalFileName的值,并将其写入每个分离的消息。

我想我可以用willAddHeadersaddHeaders的方法写分隔符。但我不确定分割器bean的范围。所以,如果它是一个单身人士,并将用户concurrenly,如何保持原始标题?

有人能帮我找到好的解决方案吗?

感谢您的回答。

回答

0

你的问题不清楚。

看,你有<int:header-enricher>之前<int:splitter>。通过这种方式,您的确只会将其写入原始邮件一次。分离器的性质,所有的请求头复制到每个分裂项目:

Map<String, Object> messageHeaders = message.getHeaders(); 
    if (willAddHeaders(message)) { 
     messageHeaders = new HashMap<>(messageHeaders); 
     addHeaders(message, messageHeaders); 
    } 

    final Map<String, Object> headers = messageHeaders; 
    final Object correlationId = message.getHeaders().getId(); 
    final AtomicInteger sequenceNumber = new AtomicInteger(1); 

    Function<Object, AbstractIntegrationMessageBuilder<?>> messageBuilderFunction = 
      object -> createBuilder(object, headers, correlationId, sequenceNumber.getAndIncrement(), sequenceSize); 

所以,你正在寻找的是那里出的现成功能和你对payloadTypeRoutingChannel所有的消息都会有那些originalFileNameoriginalFile标题!

+0

是的。是真的。所有标题都被复制。问题在其他地方。我忘了描述变压器的参数。感谢您的回答。 – gooamoko