Spring Integration:只遍历一次目录内容

时间:2012-11-28 14:23:30

标签: java spring spring-integration

我正在使用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>

2 个答案:

答案 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模式实际上是处理文件然后   移至已处理的目录。