Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用多线程运行spring集成_Java_Spring_Spring Integration_Spring Integration Sftp - Fatal编程技术网

Java 如何使用多线程运行spring集成

Java 如何使用多线程运行spring集成,java,spring,spring-integration,spring-integration-sftp,Java,Spring,Spring Integration,Spring Integration Sftp,我想用spring集成做以下工作 从sftp获取文件 将下载的文件发送到http和s3 这是我到目前为止所拥有的 @Bean @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3")) public MessageSource<File> sftpMessageSource() { SftpI

我想用spring集成做以下工作

  • 从sftp获取文件
  • 将下载的文件发送到http和s3
  • 这是我到目前为止所拥有的

    @Bean
    @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3"))
        public MessageSource<File> sftpMessageSource() {
            SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
            source.setLocalDirectory(new File("sftp-inbound"));
            source.setAutoCreateLocalDirectory(true);
            source.setMaxFetchSize(2);
            return source;
        }
    

    如何在单独的线程上运行文件进程并释放轮询器线程,以便轮询器可以继续从sftp中提取文件?

    您可以使用
    @Async
    注释在单独的线程中运行任何方法。您只需在任何
    @Configuration
    文件中添加
    @EnableAsync
    ,当您调用它时,它将异步运行。您可以在这里找到更多信息。

    您可以使用
    @Async
    注释在单独的线程中运行任何方法。您只需在任何
    @Configuration
    文件中添加
    @EnableAsync
    ,当您调用它时,它将异步运行。您可以在这里找到更多信息。

    类似以下内容:

    @Bean
    public ThreadPoolTaskExecutor executor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(5);
        return executor; 
    }
    
    并在
    @InboundChannelAdapter
    @Poller
    中使用该
    executor
    作为bean名称:

    @Bean
    @InboundChannelAdapter(channel = "sftpChannel", 
            poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3", taskExecutor="executor"))
    
    请参见
    @Poller
    JavaDocs:

    /**
     * @return The {@link org.springframework.core.task.TaskExecutor} bean name.
     */
    String taskExecutor() default "";
    
    另请参见参考手册中的文档:

    重要提示:异步切换

    此建议基于
    receive()
    结果修改触发器。只有在轮询器线程上调用通知时,这才有效。如果轮询器有
    任务执行器
    ,则它将不起作用。若要在轮询结果之后使用异步操作时使用此建议,请稍后使用
    执行器通道执行异步切换

    大概是这样的:

    @Bean
    public ThreadPoolTaskExecutor executor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(5);
        return executor; 
    }
    
    并在
    @InboundChannelAdapter
    @Poller
    中使用该
    executor
    作为bean名称:

    @Bean
    @InboundChannelAdapter(channel = "sftpChannel", 
            poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3", taskExecutor="executor"))
    
    请参见
    @Poller
    JavaDocs:

    /**
     * @return The {@link org.springframework.core.task.TaskExecutor} bean name.
     */
    String taskExecutor() default "";
    
    另请参见参考手册中的文档:

    重要提示:异步切换

    此建议基于
    receive()
    结果修改触发器。只有在轮询器线程上调用通知时,这才有效。如果轮询器有
    任务执行器
    ,则它将不起作用。若要在轮询结果之后使用异步操作时使用此建议,请稍后使用
    执行器通道执行异步切换


    @Poller
    接受您可以配置为异步运行的
    taskExecutor
    。请将您的评论作为答案。这是非常正确的。谢谢@tsolakp。在taskExecutor中,我是否只执行任务?但是我该如何配置线程呢<代码>ThreadPoolTaskExecutor executor=新的ThreadPoolTaskExecutor();执行器setMaxPoolSize(5)例如:
    pool.execute(()->进程(有效负载,时间戳),1000
    你有一个示例吗?我没有示例,但@Artem Bilan的这篇文章可能会有所帮助:
    @Poller
    使用
    taskExecutor
    ,你可以将其配置为异步运行。请将你的评论作为答案。这是非常正确的。谢谢@tsolakp。在taskExecutor中,我是否只执行任务?但是我该如何配置线程呢<代码>ThreadPoolTaskExecutor executor=新的ThreadPoolTaskExecutor();执行器setMaxPoolSize(5)例如:
    pool.execute(()->进程(有效负载,时间戳),1000你有样本吗?我没有示例,但@Artem Bilan的这篇文章可能会有所帮助:我尝试了你的示例,但轮询器似乎只在一个线程上运行:'(
    ThreadPoolTaskExecutor-executor
    在task1Poller上继续运行-true,因为您使用的是固定延迟,因此新任务在当前时间加上100000毫秒后才能开始。另一方面,您应该并行处理3条消息。可能我不理解此入站通道。因此轮询器是just从sftp中提取文件,对吗?它一次提取2个文件。因此,在这种情况下,我应该为service activator创建另一个线程,以便我可以处理我的文件(发送到http和S3)当轮询器将它们拉到不同的线程上时,我想你需要考虑使用一个执行代码< <代码> PuxSudiScript频道> /Cult>作为并行执行器,那些HTTP和S3作为订阅服务器尝试了你的例子,但是Payor似乎只在1个线程上运行:(
    ThreadPoolTaskExecutor-executor
    在task1Poller上继续运行-true,因为您使用的是固定延迟,因此新任务在当前时间加上100000毫秒后才能开始。另一方面,您应该并行处理3条消息。可能我不理解此入站通道。因此轮询器是just从sftp中提取文件,对吗?它一次提取2个文件。因此,在这种情况下,我应该为service activator创建另一个线程,以便我可以处理我的文件(发送到http和S3)当轮询器将它们拉到不同的线程上时,我想您需要考虑使用一个执行代码> <代码> PuxSudiScript通道>代码>,以执行并行性,而那些HTTP和S3作为订阅服务器。