Spring集成文件出站通道适配器和文件上次修改日期

时间:2017-08-03 08:29:16

标签: spring-integration

我正在尝试创建一个文件出站通道适配器,以将最后修改日期属性设置为自定义值而不是系统当前时间的文件写入。

根据文档(http://docs.spring.io/spring-integration/docs/4.3.11.RELEASE/reference/html/files.html#file-timestamps)我应该在出站时将preserve-timestamp属性设置为true,并将标题file_setModified设置为所需的时间戳消息。

无论如何,我做了几次尝试都没有成功。

这是一个代码片段,用于展示我现在正在做的事情:

<int:inbound-channel-adapter
    channel="msg.channel"
    expression="'Hello'">
    <int:poller fixed-delay="1000"/>
</int:inbound-channel-adapter>

<int:header-enricher
    input-channel="msg.channel"
    output-channel="msgEnriched.channel">

    <int:header
        name="file_setModified"
        expression="new Long(1473897600)"/>
</int:header-enricher>

<int-file:outbound-channel-adapter
    id="msgEnriched.channel"
    preserve-timestamp="true"
    directory="/tmp/foo"/>

那有什么问题?

(使用Spring Integration 4.3.11)

1 个答案:

答案 0 :(得分:1)

如果您的timestamppayload,则会覆盖File值:

Object timestamp = requestMessage.getHeaders().get(FileHeaders.SET_MODIFIED);
...
if (payload instanceof File) {
    resultFile = handleFileMessage((File) payload, tempFile, resultFile);
    timestamp = ((File) payload).lastModified();
}
...
if (this.preserveTimestamp) {
    if (timestamp instanceof Number) {
        resultFile.setLastModified(((Number) timestamp).longValue());
    }
}

要避免覆盖并真正从file_setModified获得收益,您应该将File<int:inbound-channel-adapter>转换为InputStream

<transformer expression="new java.io.FileInputStream(payload)"/>
<int-file:outbound-channel-adapter>之前

文档虽然警告说:

  

对于文件有效负载,这会将时间戳从入站文件传输到出站文件(无论是否需要副本)

<强>更新

我刚刚测试了您的用例,我的/tmp/out目录如下:

enter image description here

如您所见,我的所有文件都有适当的自定义上次修改。

我错过了什么?

也许1473897600(1970年)对您的操作系统有误?

<强>更新

OK!在解析该XML期间preserve-timestamp未配置到目标组件中的问题:https://jira.spring.io/browse/INT-4324

您的用例的解决方法如下:

<int:outbound-channel-adapter id="msgEnriched.channel">
    <bean class="org.springframework.integration.file.FileWritingMessageHandler">
        <constructor-arg value="/tmp/foo"/>
        <property name="preserveTimestamp" value="true"/>
        <property name="expectReply" value="false"/>
    </bean>
</int:outbound-channel-adapter>

而不是<int-file:outbound-channel-adapter>定义。