Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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 ServiceActivators的Spring集成并发性_Java_Concurrency_Spring Integration - Fatal编程技术网

Java ServiceActivators的Spring集成并发性

Java ServiceActivators的Spring集成并发性,java,concurrency,spring-integration,Java,Concurrency,Spring Integration,这是我先前问题的继续。 总之,我有一个fileIn通道(一个队列),然后是一个ServiceActivator,它处理文件,还有一个出站适配器来保存文件 我想引入并发,在多个线程中处理消息。我正在使用JavaDSL(但不是Java8)。我可以用下面的方法来做 @Bean public MessageChannel fileInChannel() { return MessageChannels.queue("fileIn").get(); } @Bean public Integrat

这是我先前问题的继续。 总之,我有一个fileIn通道(一个队列),然后是一个ServiceActivator,它处理文件,还有一个出站适配器来保存文件

我想引入并发,在多个线程中处理消息。我正在使用JavaDSL(但不是Java8)。我可以用下面的方法来做

@Bean
public MessageChannel fileInChannel() {
    return MessageChannels.queue("fileIn").get();
}

@Bean
public IntegrationFlow fileProcessingFlow() {
    return IntegrationFlows.from(fileInChannel())
            .handle(myFileProcessor, "processFile",
                    new Consumer<GenericEndpointSpec<ServiceActivatingHandler>>() {
                        @Override
                        public void accept(GenericEndpointSpec<ServiceActivatingHandler> t) {
                            t.poller(Pollers.fixedRate(100).maxMessagesPerPoll(1).taskExecutor(Executors.newCachedThreadPool()));
                        }
                    })
            .handle(Files.outboundAdapter(new File(outDir)).autoCreateDirectory(true).get())
            .get();
}
这也奏效了!!我不知道这只是一种风格,还是一种方法比另一种好。如果是,哪种方法更好

其次,在上述情况下,“文件写入”(即最后一步)是连续的还是在不同的线程中工作。如果我也需要并发性,我是否应该在句柄(fileProcessor)和句柄(outBoundAdapter)之间引入另一个taskExecutor通道?
最终outboundadapter将是一个远程文件S3适配器,因此问题是它只是一种样式,尽管我倾向于选择第二种。文件适配器是线程安全的

通常,写操作将并行进行


唯一的例外是,如果您使用
FileExistsMode.APPEND
进行写入,在这种情况下,在写入过程中会保留一个锁,并且如果文件名散列到同一个锁(共有256个锁)作为正在编写的另一个文件,它将在第一个文件完成时运行。

这只是一种风格,尽管我倾向于选择第二个。文件适配器是线程安全的

通常,写操作将并行进行

唯一的例外是,如果您使用
FileExistsMode.APPEND
进行写入,在这种情况下,在写入过程中会保留一个锁,如果文件名散列到与正在写入的另一个文件相同的锁(有256个锁),那么它将在第一次写入完成时运行

public IntegrationFlow fileProcessingFlow() {
    return IntegrationFlows.from(fileInChannel())
            .channel(MessageChannels.executor(Executors.newCachedThreadPool()))
            .handle(myFileProcessor)
            .handle(Files.outboundAdapter(new File(outDir)).autoCreateDirectory(true).get())
            .get();
}