使用Camel拆分ArrayList并并行处理每一项,最多10个线程。以下是配置。线程池配置文件设置为最大线程数=10。
<camel:route id="ReportsRoute">
<camel:from uri="direct:processReportsChannel" />
<camel:to uri="bean:reportRepository?method=getPendingTransactions" />
<camel:split parallelProcessing="true" executorServiceRef="ReportThreadPoolProfile">
<camel:simple>${body}</camel:simple>
<camel:doTry>
<camel:to uri="direct:processReportChannel" />
<camel:doCatch>
<camel:exception>java.lang.Exception</camel:exception>
<camel:handled>
<camel:constant>true</camel:constant>
</camel:handled>
<camel:to uri="bean:ReportRepository?method=markAsFailed"/>
<camel:wireTap uri="direct:loggingAndNotificationChannel" />
</camel:doCatch>
</camel:doTry>
</camel:split>
</camel:route>
bean:reportRepository?method=getPendingTransactions
获取数组列表并传递给拆分器。processReportChannel
是处理项的处理器。
**问题:**作业开始时启动了10个线程,但有些线程选择的是同一个项目。例如,如果ArrayList中有item_no_1到10个项目,thread_no_1和thread_no_2或有时更多线程选择的是item_no_2。这是因为Array List不是线程安全的,而且Splitter不管理它吗?
我不是这方面的Maven,需要帮助指出问题所在。
1条答案
按热度按时间qlvxas9a1#
我使用以下(更简单的)设置进行了测试:
测试:
在这种设置下,没有条目被处理两次。因此,在您的处理器中一定有什么东西导致了这个问题,即同一个列表项被多个线程拾取。