Spring 集成:再次更新 header 值时遇到问题

Spring integration : Facing issue while updating the header value again

尝试使用 spring-integration-file 的单个出站适配器将文件放置在多个目录中。

为了实现这一点,在 file:outbound-gateway 前面有一个循环,以在每次迭代时修改消息 header 目标目录,并一次又一次地将所有消息发送到同一个通道直到目标计数减少到 0.

能够循环回 header enricher channel.but 因为我们再次为相同的 header 名称丰富 header 值。 header 名称 TARGET_DIR 的值未更新。也不例外。

想知道一些解决方案,如果可以为相同的 header 名称一次又一次地更新 header 值,或者是否可以在以下位置提供动态 header 名称运行时间。

已尝试在循环返回时使用 header:filter 删除 TARGET_DIR header。但是没有成功。

 !-- header enricher -->
 <integration:header-enricher input-channel="filesHeaderEnricherChannel" output-channel="filesOut">
<integration:header name="TARGET_COUNT" method="getTargetCount" ref="headerEnricher"/>
<integration:header name="TARGET_DIR" method="getTargetPath" ref="headerEnricher"/>     
</integration:header-enricher>

        <integration:chain id="filesOutChain" input-channel="filesOut" output-channel="filesOutChainChannel">
            <integration:transformer expression="headers.FILE"/>
                <file:outbound-channel-adapter id="fileMover" 
                    auto-create-directory="true"
                    directory-expression="headers.TARGET_DIR"
                    mode="REPLACE">
                    <file:request-handler-advice-chain>
                        <ref bean="retryAdvice" />
                    </file:request-handler-advice-chain>
                </file:outbound-channel-adapter>    
           </integration:chain> 

     <!-- decreasing the count on each loop -->
    <!-- looping to header enricher channel again as output channel to update the target directory -->
  <integration:filter input-channel="filesOutChainChannel"  expression="headers.TARGET_COUNT != 0" output-channel="filesHeaderEnricherChannel"
                        discard-channel="filesArchiveChannel">                       
  </<integration:filter>

您忽略了 header-enricher 有一个额外选项的事实:

    <xsd:attribute name="default-overwrite">
        <xsd:annotation>
            <xsd:documentation>
                Specify the default boolean value for whether to overwrite existing
                header values. This will
                only
                take effect for
                sub-elements that do not provide their own 'overwrite' attribute. If the
                'default-overwrite'
                attribute is not
                provided, then the specified header values will NOT overwrite any
                existing ones with the same
                header
                names.
                </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
            <xsd:union memberTypes="xsd:boolean xsd:string" />
        </xsd:simpleType>
    </xsd:attribute>

还有子元素header有自己的:

    <xsd:attribute name="overwrite">
        <xsd:annotation>
            <xsd:documentation>
                Boolean value to indicate whether this header value should overwrite an
                existing header value for
                the same name.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleType>
            <xsd:union memberTypes="xsd:boolean xsd:string" />
        </xsd:simpleType>
    </xsd:attribute>

另请参阅有关此事的文档:https://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#header-enricher