2

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

我有 web 服务,它会根据输入编号返回响应,但我不知道应该使用什么技术来实现另一部分。

我研究了以下内容:

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

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

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

这是我的第一篇文章,如果有任何错误,我深表歉意。

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

祝大家感恩节快乐。放假后会更新帖子

4

3 回答 3

1

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

于 2012-11-20T19:49:13.837 回答
1

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

于 2012-11-20T19:49:20.717 回答
0

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

实际上使用ThreadPoolTask​​Executor你可以很容易地实现这一点。

<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 Using a TaskExecutor

于 2012-11-21T11:58:22.120 回答