1

我目前是 Spring Integration 的新手。
基本上尝试使用 Java Spring 集成 DSL 异步轮询多个文件位置。我需要获取文件名并使用文件名执行一些操作并将文件最终推送到 S3,我的问题是这些对文件执行操作的任务可以在任务执行器或服务激活器处理程序中执行。我不确定哪个是正确的地方。

@Autowired
private AWSFileManager awsFileManager;

@Bean
public IntegrationFlow inboundChannelFlow(@Value("${file.poller.delay}") long delay,
@Value("${file.poller.messages}") int maxMsgsPerPoll,
TaskExecutor taskExecutor, MessageSource<File> fileSource) 
{
    return IntegrationFlows.from(fileSource,
            c -> c.poller(Pollers.fixedDelay(delay)
                    .taskExecutor(taskExecutor)
                    .maxMessagesPerPoll(maxMsgsPerPoll)))
            .handle("AWSFileManager", "fileUpload")
            .channel(ApplicationConfiguration.inboundChannel)
            .get();
}

@Bean
TaskExecutor taskExecutor(@Value("${file.poller.thread.pool.size}") int poolSize) {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    //Runnable task1 = () -> {this.methodsamp();};
    taskExecutor.setCorePoolSize(poolSize);

    //taskExecutor.execute(task1);
    return taskExecutor;
}
@Async
public void methodsamp()
{
    try
    {
        awsFileManager.fileUpload();
        System.out.println("test");
    }
    catch(Exception ex)
    {

    }

我在这里附上了示例代码。
还有一种方法可以检索通道中文件的文件名,因为我需要将其作为参数传递给 fileUpload 方法。请指教。

4

1 回答 1

1

你的问题不清楚。TaskExecutor用于流中的线程上下文。Service Activator ( .handle()) 完全适合您的业务逻辑方法。这可以在执行程序的线程上执行。而且您确实IntegrationFlow正确地使用了它们。

FileReadingMessageSource生成带有java.io.File的消息payload。所以,这就是获取文件名的方法——就从File.getName()!

于 2017-11-28T20:00:48.353 回答