Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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集成-spillter处理大列表_Java_Multithreading_Spring Integration - Fatal编程技术网

Java Spring集成-spillter处理大列表

Java Spring集成-spillter处理大列表,java,multithreading,spring-integration,Java,Multithreading,Spring Integration,在我的项目中,我们有一个 -spring集成轮询器,每五分钟获取一组记录 -将其发送到拆分器,拆分器使用taskexector在输出通道以多线程方式(池大小为4)拆分记录,并发送每条记录以供进一步处理 这一切都很好。但是,问题在于拆分器阻塞,直到它完全处理通过的列表 我们的要求是,如果另一个列表被传递到splitter,那么它需要并行处理它,而不必等待第一个列表处理完成。我试图将另一个任务执行器放到spillter的输入通道,但它并没有解决问题 对于两个给定的输入列表,如何获得拆分器工作是并行的

在我的项目中,我们有一个 -spring集成轮询器,每五分钟获取一组记录 -将其发送到拆分器,拆分器使用taskexector在输出通道以多线程方式(池大小为4)拆分记录,并发送每条记录以供进一步处理

这一切都很好。但是,问题在于拆分器阻塞,直到它完全处理通过的列表

我们的要求是,如果另一个列表被传递到splitter,那么它需要并行处理它,而不必等待第一个列表处理完成。我试图将另一个任务执行器放到spillter的输入通道,但它并没有解决问题

对于两个给定的输入列表,如何获得拆分器工作是并行的,每个inturn为其各自传递的列表运行多线程

配置:

使用SpringIntegration2.2.0.RELEASE和Spring3.1.1.RELEASE版本

<integration:channel id="splitterChannel"/>
    <integration:channel id="serviceRequestChannel"/>
    <integration:channel id="aggregatorChannel"/>

    <integration:channel id="routerChannel" >
        <integration:dispatcher task-executor="taskExecutor"/>
    </integration:channel>

    <task:executor id="taskExecutor" pool-size="4"/>


   <integration:inbound-channel-adapter
            id="inboundAdapter"
            method="retrieveReadyRecords"
            channel="splitterChannel"
            ref="inboundChannelAdapter" auto-startup="true">
       <integration:poller
                trigger="batchtrigger"/>
    </integration:inbound-channel-adapter>


    <integration:splitter
            input-channel="splitterChannel"
            expression="payload"
            output-channel="routerChannel"/>


  <integration:recipient-list-router input-channel="routerChannel">
        <integration:recipient channel="aggregatorChannel"      selector-expression="!payload.state.equals('Y')"/>
        <integration:recipient channel="serviceRequestChannel"  selector-expression="payload.state.equals('N')"/>
    </integration:recipient-list-router>


--- also further configuration for below service requests sending to aggretor

---此外,还将进一步配置发送到AGGTER的以下服务请求

您将
执行器频道
放在拆分器之后。在拆分器将其输出发送到切换发生的路由通道之前,不会再次触发轮询器

我建议您从
routerChannel
中删除dispatcher,并将
taskExecutor
添加到轮询器中

这样,轮询器在拆分器之前进行切换,并可用于下一次触发


您还应该使用最新的2.2.x版本(2.2.6)。

请显示您的配置和拆分器代码(如果它使用自定义的
)。无状态拆分器没有理由阻止多线程消息并行处理。尽管在3.0.Hi中解决了
组件的问题,但请更新配置。请您查看并提出建议谢谢。问题似乎不在轮询器上。根据现有配置,我看到正在执行轮询器,并将下一个记录列表发送到拆分器,之后它将等待上一个列表完成处理。让我试试你建议的配置,看看是否有什么不同。我试过你提到的配置。它工作得很好,但是在拆分器级别,我希望多线程也能让它更快。如果我在上面提到的spliiter路由器级别添加任务执行器,即使我在轮询器级别添加任务执行器,我也会遇到同样的问题。是否有一个配置,通过它我们可以在轮询器级别和溢出器lveve上获得多线程?您是指拆分器内的
(对于每条消息)?我的建议将使发送到拆分器的每个入站消息在其自己的线程上运行。非常感谢您的回复。对我希望spillter的每个入站消息都在单独的线程中运行(这是您建议的,运行良好),并且我希望Spliter溢出的每个消息也在其自己的线程中运行(这在我最初给出的上述配置中运行良好)。当我组合这两种配置时,它不工作,等待spillter完成传递的初始列表,然后由splitter处理第二个列表(whcih看起来与我面临的初始问题相同)。Ok;因此,您需要将任务执行器也保持在
routerChannel
通道中。这样,拆分器生成的每条消息都将在自己的线程上运行。也就是说,池大小只有4,并行性将受到限制。您可能希望在每种情况下使用不同的执行器。