Spring Integration Service Activator处理程序业务逻辑

时间:2017-11-28 19:32:23

标签: java-8 spring-integration dsl spring-integration-dsl spring-integration-aws

我目前刚接触Spring Integration 基本上尝试使用Java Spring集成DSL异步轮询到多个文件位置。我需要获取文件名并使用filename执行一些操作并最终将文件推送到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方法。 请指教。

1 个答案:

答案 0 :(得分:1)

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

FileReadingMessageSource生成的消息java.io.Filepayload。所以,这是获取文件名的方法 - 仅来自File.getName()