我正在使用Spring Integration应用程序,它应该遍历目录的内容,处理其中的文件,然后退出。
我已经设置了下面的XML来每秒轮询一次目录,但这并不是我所追求的。如何更改此选项以读取目录中的所有文件,然后在消息完成流经系统后退出程序?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int-file="http://www.springframework.org/schema/integration/file"
xmlns:int="http://www.springframework.org/schema/integration"
xsi:schemaLocation="http://www.springframework.org/schema/integration/xml http://www.springframework.org/schema/integration/xml/spring-integration-xml-2.1.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.1.xsd
http://www.springframework.org/schema/integration/file http://www.springframework.org/schema/integration/file/spring-integration-file-2.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd >
<int-file:inbound-channel-adapter
directory="inputDir"
channel="inputChannel">
<int:poller fixed-rate="1000"></int:poller>
</int-file:inbound-channel-adapter>
<!-- more components to read from inputChannel, write to output adapter -->
</beans>
答案 0 :(得分:1)
稍微hacky,我过去曾经使用过这种方法,而且干净利落。
该方法是定义一个shutdown
队列通道,从主线程等待消息到达此通道,并且一旦可用于关闭应用程序上下文。
<int:channel id="shutdownChannel"><int:queue/></int:channel>
在主线程中 - :
PollableChannel pollableChannel = applicationContext.getBean("shutdownChannel",PollableChannel.class);
pollableChannel.receive();
applicationContext.close();
只有当消息进入关闭通道时,主代码才会通过receive
调用。现在问题是如何将消息发送到关闭通道。
你可以在文件消息的最终处理器中保留一些状态,比如说自上次处理任何文件以来的时间,以下可能是一个稻草人:
public class FileContentProcessor {
private long lastProcessedTime = System.currentTimeMillis();
public void processContent(String content){
this.lastProcessedTime = System.currentTimeMillis();
System.out.println("Processed content: " + content);
}
public long msSinceLastProcessed(){
return System.currentTimeMillis() - this.lastProcessedTime;
}
}
根据此状态定义入站通道适配器:
<int:inbound-channel-adapter ref="fileProcessor" method="msSinceLastProcessed" channel="shutdownFilterChannel">
<int:poller fixed-rate="3000"/>
</int:inbound-channel-adapter>
<int:filter input-channel="shutdownFilterChannel" output-channel="shutdownChannel" expression="payload>20000"></int:filter>
在这里,我基本上得到了自上次处理以来的时间,通过过滤器传递它,检查自上次处理时间以来是否超过20秒并将该消息传递给关闭通道。
答案 1 :(得分:0)
假设您使用的是独立的java程序,那么当您在一定时间间隔内没有收到消息时,您可能会将消息发送到输出通道和System.exit。
final AbstractApplicationContext context =
new ClassPathXmlApplicationContext("classpath:META-INF/spring/integration/*-context.xml");
// initiates poller to poll files
// do your processing and then send to a channel say output ..
PollableChannel output = (PollableChannel) context.getBean("output");
Object msg = null;
while((msg = output.receive(1000)) != null)
{
msg = output.receive().getPayload();
System.out.println("payload - " + msg);
}
System.exit(0);
另一种选择可能是向服务激活器发送消息,然后启动jvm shutdown。
只需注意:EAI模式实际上是处理文件然后 移至已处理的目录。