我想轮询目录中的文件并在找到文件后停止轮询。我对 Spring 框架非常陌生,其中很多内容仍然非常令人困惑。经过一些研究后,我发现了几种方法可以做到这一点,但没有任何运气。
其中一种方法是使用控制总线,如下所示。然而,轮询似乎在 2 秒后就停止了。我不确定如何包含仅在收到文件时停止的条件。
另一种方法是使用此处回答的“智能轮询” 。答案中的链接很旧,但它指向此处的官方 Spring 文档:Smart Polling。通过这篇文章,我了解了AbstractMessageSourceAdvice和SimpleActiveIdleMessageSourceAdvice。后者似乎适合我的目标,并且是最容易实现的,所以我决定尝试一下。我的代码如下:
集成配置.java
package com.example.springexample;
import java.io.File;
import org.aopalliance.aop.Advice;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.InboundChannelAdapter;
import org.springframework.integration.annotation.Poller;
import org.springframework.integration.aop.SimpleActiveIdleMessageSourceAdvice;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.core.MessageSource;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.file.FileReadingMessageSource;
import org.springframework.integration.file.filters.SimplePatternFileListFilter;
import org.springframework.integration.util.DynamicPeriodicTrigger;
import org.springframework.messaging.MessageChannel;
@Configuration
@EnableIntegration
public class IntegrationConfig {
@Bean
public IntegrationFlow advised() {
return IntegrationFlows.from("fileInputChannel")
.handle("runBatchScript", "run", c -> c.advice(stopPollingAdvice()))
.get();
}
@Bean
public MessageChannel fileInputChannel() …Run Code Online (Sandbox Code Playgroud)