【发布时间】:2021-04-17 15:23:17
【问题描述】:
我目前有一个如下所示的弹簧集成 (v4.3.24) 流程:
|
| 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 |
+----+----+
|
以上所有频道都是DirectChannels - 是的,我知道这是一个糟糕的结构。这对于少量文件来说效果很好。但是现在,我必须处理需要经过相同流程的数千个文件 - 基准测试表明这需要大约 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。
我的一些问题:
-
我希望一个文件的所有“FileProcessor”步骤发生在同一个线程上,同时并行处理多个文件。我怎样才能做到这一点?
我从this answer 看到,ExecutorChannel到MessageHandlerChain流将提供这样的功能。但是,“FileProcessor”中的一些步骤是可选的(使用selector-expression和路由器来跳过一些步骤)- 排除使用MessageHandlerChain。我可以在Filters 内部安装几个MessageHandlerChains,但这或多或少会成为 #2 中提到的方法。 -
如果无法实现#1,是否将所有从拆分器开始的通道类型从
DirectChannel更改为ExecutorChannel有助于引入一些并行性?如果是,我应该为每个频道创建一个新的TaskExecutor,还是可以为所有频道重复使用一个TaskExecutorbean(我不能在TaskExecutorbean 上设置scope="prototype")? -
您认为哪种方法(#1 或 #2)更好?为什么?
-
如果我执行全局错误处理,如here 提到的方法,即使一个文件出错,其他文件是否会继续处理?
【问题讨论】: