Spring integration 如何在spring集成中使用异步流在单个线程中执行一系列步骤?

Spring integration 如何在spring集成中使用异步流在单个线程中执行一系列步骤?,spring-integration,Spring Integration,我目前有一个spring集成(v4.3.24)流程,如下所示: | | list of | filepaths +----v---+ |splitter| +----+---+ | filepath | +----------v----------+ |sftp-outbound-gateway| | "get"

我目前有一个spring集成(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 |
      +----+----+
           |
上面所有的频道都是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部分提到的方法

  • 如果无法实现#1,将从拆分器开始的所有通道类型从
    DirectChannel
    更改为
    ExecutorChannel
    是否有助于引入一些并行性?如果是,我应该为每个通道创建一个新的
    TaskExecutor
    ,还是可以为所有通道重用一个
    TaskExecutor
    bean(我不能在
    TaskExecutor
    bean上设置
    scope=“prototype”

  • 在您看来,哪种方法(1或2)更好?为什么?

  • 如果我像前面提到的方法一样执行全局错误处理,那么即使一个文件出错,其他文件也会继续处理吗


  • 它将根据您的需要使用
    执行器通道
    作为解密器的输入,并将其余所有通道保留为直接通道;剩余的流不必是链,每个组件都将在执行器的一个线程上运行

    您需要确保所有下游组件都是线程安全的


    错误处理应保持原样;每个子流都是独立的。

    谢谢Gary。在分割到 ExtRealOrthChans<代码>之后,在“文件处理器”步骤中间有<代码> QuealChans S有助于缓冲,同时保持问题中所需的流程?我相信一个
    DirectChannel
    会一直阻塞,直到接收者可以自由接收信息。帮助什么?一旦工作交给执行者线程,剩余的工作将在该线程上运行-添加队列通道没有任何好处,您需要另一个执行者来轮询它;您可以控制池大小的并发性,溢出任务将在executor中排队。