2017-09-15 7 views
0

私はメッセージ処理のフォローチェーンを持っています。 originalFileNameoriginalFile春の統合。スプリッタを介していくつかのヘッダーを伝播する

<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> 

このチェーンでは、私は2つのメッセージヘッダーを設定しました。 com.my.usual.XMLSplitterでメッセージを分割した後にヘッダーを保持するのが最も簡単な方法のようです。

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

分割されたメッセージに1つのヘッダーが必要な場合はどうすればよいですか?私はどうにかしてoriginalFileNameという値を読んで、分割された各メッセージに書きます。

スプリッターのwillAddHeadersaddHeadersの方法でヘッダーを書くことができると思います。しかし、スプリッタビーンのスコープについてはわかりません。だからもしそれがシングルトンであり、同意しているのであれば、元のヘッダを保持する方法は?

誰かが良い解決策を見つけるのを手助けできますか?

ご回答ありがとうございます。

答えて

0

あなたの質問は不明です。

あなたはの前に<int:header-enricher>を持っています。このようにして、元のメッセージに1回だけ書き込むことができます。

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

関連する問題