2017-09-15 64 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