我是Spring集成的新手。我正在研究解決方案,但在使用入站文件適配器(FileReadingMessageSource)時,我遇到了特定問題。 我必須從不同目錄讀取文件並處理它們,並將這些文件保存在不同的目錄中。據我所知,目錄名稱在流程開始時是固定的。 有人可以幫助我更改不同請求的目錄名稱。春季集成文件閱讀
我嘗試了以下方法。首先,我不確定這是否是正確的方法,儘管它只適用於一個目錄。我認爲Poller正在等待更多的文件,並且再也沒有回來閱讀另一個目錄。
@SpringBootApplication
@EnableIntegration
@IntegrationComponentScan
public class SiSampleFileProcessor {
@Autowired
MyFileProcessor myFileProcessor;
@Value("${si.outdir}")
String outDir;
@Autowired
Environment env;
public static void main(String[] args) throws IOException {
ConfigurableApplicationContext ctx = new SpringApplication(SiSampleFileProcessor.class).run(args);
FileProcessingService gateway = ctx.getBean(FileProcessingService.class);
boolean process = true;
while (process) {
System.out.println("Please enter the input Directory: ");
String inDir = new Scanner(System.in).nextLine();
if (inDir.isEmpty() || inDir.equals("exit")) {
process=false;
} else {
System.out.println("Processing... " + inDir);
gateway.processFilesin(inDir);
}
}
ctx.close();
}
@MessagingGateway(defaultRequestChannel="requestChannel")
public interface FileProcessingService {
String processFilesin(String inputDir);
}
@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata poller() {
return Pollers.fixedDelay(1000).get();
}
@Bean
public MessageChannel requestChannel() {
return new DirectChannel();
}
@ServiceActivator(inputChannel = "requestChannel")
@Bean
GenericHandler<String> fileReader() {
return new GenericHandler<String>() {
@Override
public Object handle(String p, Map<String, Object> map) {
FileReadingMessageSource fileSource = new FileReadingMessageSource();
fileSource.setDirectory(new File(p));
Message<File> msg;
while((msg = fileSource.receive()) != null) {
fileInChannel().send(msg);
}
return null; // Not sure what to return!
}
};
}
@Bean
public MessageChannel fileInChannel() {
return MessageChannels.queue("fileIn").get();
}
@Bean
public IntegrationFlow fileProcessingFlow() {
return IntegrationFlows.from(fileInChannel())
.handle(myFileProcessor)
.handle(Files.outboundAdapter(new File(outDir)).autoCreateDirectory(true).get())
.get();
}
}
編輯:根據Gary的響應更換了一些方法,如
@MessagingGateway(defaultRequestChannel="requestChannel")
public interface FileProcessingService {
boolean processFilesin(String inputDir);
}
@ServiceActivator(inputChannel = "requestChannel")
public boolean fileReader(String inDir) {
FileReadingMessageSource fileSource = new FileReadingMessageSource();
fileSource.setDirectory(new File(inDir));
fileSource.afterPropertiesSet();
fileSource.start();
Message<File> msg;
while ((msg = fileSource.receive()) != null) {
fileInChannel().send(msg);
}
fileSource.stop();
System.out.println("Sent all files in directory: " + inDir);
return true;
}
現在按預期工作。
謝謝你,作爲工作預期。我已經用你的建議編輯了這篇文章。但需要澄清。對於類似的需求(即閱讀不同的目錄),如果源代碼是S3,我們該怎麼辦? – pkm
@pkm mount s3作爲一個文件系統並監聽它的變化,或者你可以使用帶有觸發器的aws微服務流在s3上放置/發佈,並且你對它採取適當的行動 –
[spring-integration-aws](https:// github.com/spring-projects/spring-integration-aws)項目提供了一個消息源,但它更復雜一點,它將遠程目錄與本地同步,然後對本地目錄使用「FileReadingMessageSource」。您應該使用'S3RemoteFileTemplate'代替。 –