Spring integration 如何在spring集成中使用异步流在单个线程中执行一系列步骤?
我目前有一个spring集成(v4.3.24)流程,如下所示:Spring integration 如何在spring集成中使用异步流在单个线程中执行一系列步骤?,spring-integration,Spring Integration,我目前有一个spring集成(v4.3.24)流程,如下所示: | | list of | filepaths +----v---+ |splitter| +----+---+ | filepath | +----------v----------+ |sftp-outbound-gateway| | "get"
|
| list of
| filepaths
+----v---+
|splitter|
+----+---+
| filepath
|
+----------v----------+
|sftp-outbound-gateway|
| "get" |
+----------+----------+
| file
+---------------------+
| +----v----+ |
| |decryptor| |
| +----+----+ |
| | |
| +-----v------+ | set of transformers
| |decompressor| | (with routers before them
| +-----+------+ | because some steps are optional)
| | | that process the file;
| +--v--+ | call this "FileProcessor"
| | ... | |
| +--+--+ |
+---------------------+
|
+----v----+
|save file|
| to disk |
+----+----+
|
上面所有的频道都是DirectChannel,是的,我知道这是一个糟糕的结构。对于小数量的文件来说,这很好。但是现在,我必须处理数千个文件,这些文件需要经过相同的流程-基准测试显示,这需要大约1天的时间来完成处理。所以,我计划在这个流程中引入一些并行处理。我想修改我的流程以实现以下目标:
|
|
+----------v----------+
|sftp-outbound-gateway|
| "mget" |
+----------+----------+
| list of files
|
+----v---+
|splitter|
+----+---+
one thread one | thread ...
+------------------------+---------------+--+--+--+--+
| file | file | | | | |
+---------------------+ +---------------------+
| +----v----+ | | +----v----+ |
| |decryptor| | | |decryptor| |
| +----+----+ | | +----+----+ |
| | | | | |
| +-----v------+ | | +-----v------+ | ...
| |decompressor| | | |decompressor| |
| +-----+------+ | | +-----+------+ |
| | | | | |
| +--v--+ | | +--v--+ |
| | ... | | | | ... | |
| +--+--+ | | +--+--+ |
+---------------------+ +---------------------+
| |
+----v----+ +----v----+
|save file| |save file|
| to disk | | to disk |
+----+----+ +----+----+
| |
| |
对于并行处理,我使用ThreadPoolTaskExecutor
将文件从拆分器输出到ExecutorChannel
我有一些问题:
我从中看到,
ExecutorChannel
到MessageHandlerChain
流将提供这样的功能。但是,“FileProcessor”中的某些步骤是可选的(通过路由器使用选择器表达式来跳过某些步骤)-排除了使用MessageHandlerChain
的可能性。我可以在MessageHandlerChain
s中安装几个Filter
s,但这或多或少成为了第2部分提到的方法
DirectChannel
更改为ExecutorChannel
是否有助于引入一些并行性?如果是,我应该为每个通道创建一个新的TaskExecutor
,还是可以为所有通道重用一个TaskExecutor
bean(我不能在TaskExecutor
bean上设置scope=“prototype”
它将根据您的需要使用
执行器通道
作为解密器的输入,并将其余所有通道保留为直接通道;剩余的流不必是链,每个组件都将在执行器的一个线程上运行
您需要确保所有下游组件都是线程安全的
错误处理应保持原样;每个子流都是独立的。谢谢Gary。在分割到
DirectChannel
会一直阻塞,直到接收者可以自由接收信息。帮助什么?一旦工作交给执行者线程,剩余的工作将在该线程上运行-添加队列通道没有任何好处,您需要另一个执行者来轮询它;您可以控制池大小的并发性,溢出任务将在executor中排队。