Spring 集成 FileTailingMessageProducer:重新启动时记住当前行
Spring integration FileTailingMessageProducer: Remember current line when restarting
我们正在使用 Spring 集成 FileTailingMessageProducer
(Apache Commons) 远程跟踪文件并将消息发送到 rabbitmq。
很明显,当包含文件tailer的java进程重启时,哪些行已经被处理过的信息就丢失了。我们希望能够重新启动进程并在我们之前处理的最后一行继续拖尾。
我想我们必须将此状态保存在主机上的文件或小型数据库中。存储在这个文件或数据库中的信息可能是一个简单的地图映射文件 ID(文件名不够,因为文件可能会旋转)到行号:
文件 ID -> 行号
我正在考虑子类化 ApacheCommonsFileTailingMessageProducer
。
java 进程将需要不断更新此文件或数据库。有没有JVM退出时更新这个文件的方法?
以前有人做过吗?对如何进行有什么建议吗?
Spring 集成有一个抽象 MetadataStore
- 这是一个简单的 key/value 抽象,因此非常适合此用例。
有几种实现方式。 PropertiesPersistingMetadataStore
保存到属性文件,默认情况下,仅保存在 ApplicationContext
close()
(destroy()
).
上
它实现了 Flushable
,因此可以更频繁地 flush()
ed。
其他实现(Redis、MongoDB、Gemfire)不需要刷新,因为数据是立即写入的。
子类可以工作,文件尾部是一个简单的 bean,可以声明为 <bean/>
- XML 解析器没有其他 "magic" 完成。
但是,如果您对 contributing it to the framework 感兴趣,请考虑直接将代码添加到适配器中。理想情况下,它会进入超类 (FileTailingMessageProducerSupport
),但我认为我们无法查看 OSDelegatingFileTailingMessageProducer
中的文件创建时间戳,因为我们只是将行数据流式传输给我们.
无论如何,请为此功能开一个JIRA Issue。
我们正在使用 Spring 集成 FileTailingMessageProducer
(Apache Commons) 远程跟踪文件并将消息发送到 rabbitmq。
很明显,当包含文件tailer的java进程重启时,哪些行已经被处理过的信息就丢失了。我们希望能够重新启动进程并在我们之前处理的最后一行继续拖尾。
我想我们必须将此状态保存在主机上的文件或小型数据库中。存储在这个文件或数据库中的信息可能是一个简单的地图映射文件 ID(文件名不够,因为文件可能会旋转)到行号:
文件 ID -> 行号
我正在考虑子类化 ApacheCommonsFileTailingMessageProducer
。
java 进程将需要不断更新此文件或数据库。有没有JVM退出时更新这个文件的方法?
以前有人做过吗?对如何进行有什么建议吗?
Spring 集成有一个抽象 MetadataStore
- 这是一个简单的 key/value 抽象,因此非常适合此用例。
有几种实现方式。 PropertiesPersistingMetadataStore
保存到属性文件,默认情况下,仅保存在 ApplicationContext
close()
(destroy()
).
它实现了 Flushable
,因此可以更频繁地 flush()
ed。
其他实现(Redis、MongoDB、Gemfire)不需要刷新,因为数据是立即写入的。
子类可以工作,文件尾部是一个简单的 bean,可以声明为 <bean/>
- XML 解析器没有其他 "magic" 完成。
但是,如果您对 contributing it to the framework 感兴趣,请考虑直接将代码添加到适配器中。理想情况下,它会进入超类 (FileTailingMessageProducerSupport
),但我认为我们无法查看 OSDelegatingFileTailingMessageProducer
中的文件创建时间戳,因为我们只是将行数据流式传输给我们.
无论如何,请为此功能开一个JIRA Issue。