Web应用程序中的多线程和并行处理 - 需要建议

时间:2012-11-20 19:46:26

标签: spring multithreading parallel-processing spring-batch

问题:在webapp中,我们必须使用Input作为N(100)号码来调用Web服务,以便web服务从队列中获取响应。一旦我得到100个响应,我必须将它分成5个线程并相应地划分每个线程的响应(每个20个)。 一旦线程处理完成,它就应该再次调用webservice。

我有web服务,它会根据输入数量返回响应,但我不知道应该用什么技术来实现其他部分。

我研究了以下内容:

  1. Spring任务执行:http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html - 但这不合适,因为我无法指定需要启动多少个线程。

  2. 分区:第7.4节:http://static.springsource.org/spring-batch/reference/html/scalability.html - 我刚刚遇到过这个问题,但之前没有使用过。

  3. 如果你们中的任何一个人能指引我朝着正确的方向前进,那就太棒了。

    这是我的第一篇文章,所以如果有任何错误我会道歉。

    更新:2012年11月21日:我已经使用ThreadPoolTask​​Executor实现了。我会在假期后发布我的代码片段。但有一件事让我感到困惑的是,我必须将100个结果分成20个组并拥有taskExecutor.submit();在For循环中循环5次,这将创建5个线程。如果有一个直截了当的方式提交这100个请求并且可以选择我想要产生多少个线程,那将是很好的。

    感恩节快乐的家伙们。会在假期后更新帖子

3 个答案:

答案 0 :(得分:1)

您可以尝试查看google guava是否适合http://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained,或者http://akka.io/框架是否符合您的需求。两者都易于封装线程处理和回调实现。

答案 1 :(得分:1)

如果您还没有使用Spring,那么我不会仅仅将Spring用于其任务执行框架:我会使用标准Java。看看executors

答案 2 :(得分:0)

对于使用Spring Task Execution,你提到“但这不合适,因为我无法指定我需要启动多少个线程。”

实际上使用ThreadPoolTaskExecutor可以很容易地实现这一点。

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="5" />
  <property name="maxPoolSize" value="10" />
  <property name="queueCapacity" value="25" />
</bean>

<bean id="taskExecutorExample" class="TaskExecutorExample">
  <constructor-arg ref="taskExecutor" />
</bean>

此处的corePoolSize属性设置最初开始的线程数。

您可以在http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html

中阅读 25.2.2使用TaskExecutor