我正在尝试创建一个文件出站通道适配器,以将最后修改日期属性设置为自定义值而不是系统当前时间的文件写入。
根据文档(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)
答案 0 :(得分:1)
如果您的timestamp
是payload
,则会覆盖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
目录如下:
如您所见,我的所有文件都有适当的自定义上次修改。
我错过了什么?
也许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>
定义。