我们使用Spring集成FileTailingMessageProducer
(Apache Commons)来远程拖尾文件并向rabbitmq发送消息。
显然,当重新启动包含文件分类器的java进程时,已经处理了哪些行的信息将丢失。我们希望能够重新启动该过程并继续拖尾我们之前处理过的最后一行。
我想我们必须将此状态保存在主机上的文件或小型数据库中。存储在此文件或数据库中的信息可能是一个简单的映射映射文件ID(文件名不够,因为文件可以旋转)到行号:
文件ID - >行号
我正在考虑继承ApacheCommonsFileTailingMessageProducer
。
java进程需要不断更新此文件或db。有没有一种方法可以在JVM退出时更新此文件?
以前有人这样做过吗?有没有关于如何进行的建议?
答案 0 :(得分:1)
Spring Integration有一个抽象MetadataStore
- 它是一个简单的键/值抽象,因此对于这个用例来说是完美的。
有几种实现方式。 PropertiesPersistingMetadataStore
会一直存在于属性文件中,默认情况下,只会在ApplicationContext
close()
(destroy()
)上保留。
它实现了Flushable
,因此可以更频繁flush()
。
其他实现(Redis,MongoDB,Gemfire)不需要刷新,因为数据是立即写入的。
一个子类可以工作,文件分类器是一个简单的bean,可以声明为<bean/>
- 没有其他&#34;魔法&#34;由XML解析器完成。
但是,如果您对contributing it to the framework感兴趣,请考虑直接将代码添加到适配器。理想情况下,它会进入超类(FileTailingMessageProducerSupport
),但我认为我们无法查看OSDelegatingFileTailingMessageProducer
中的文件创建时间戳,因为我们只是获取流数据流对我们来说。
在任何情况下,请为此功能打开JIRA Issue。