1

在我使用 JSF 的 Web 应用程序中,我从前端选择了 100 条记录(使用复选框),并且在单击按钮时,需要启动那些选择的 100 条记录(它将使用 RESTAPI 调用创建调查),其中调用 bean 中的一个方法,该方法将进行 REST API 调用。

目前每条记录按顺序处理,每条记录平均耗时20秒。所以如果我选择近 100 条记录,我会收到请求超时。我打算使用线程调用 bean 中的方法。你能告诉我该怎么做吗?bean中的方法是initialreview,以引用号为参数。

4

1 回答 1

4

托管 bean 归根结底是 POJO。所以,你的问题归结为如何使用多个线程对不同的对象执行类似的任务,所以说到底是Java问题而不是JSF问题。为此,您必须使用ExecutorService界面。一个简单的例子来完成这个:

@ManagedBean
@RequestScoped
public class SomeBean {
    List<String> records;
    //other fields, constructor, getters and setters...
    public void foo() {
        int poolSize = records.size();
        ExecutorService executor = Executors.newFixedThreadPool(poolSize);
        for (final String record : records) {
            executor.execute(new Runnable() {
                public void run() {
                    //tasks to perform in the threads...
                }
            });
        }
        executor.shutdown();
    }
}

这个例子的一些注释:

  • poolSize值不应该是records.size(),我只是用这个作为每个工作创建线程的例子。请注意,您应该创建服务器支持的尽可能多的线程。此变量的实际值将取决于您的测试结果。我建议使用 10 作为初始值,然后更改它来衡量性能结果。
  • 您可以创建一个实现Runnable接口的类,该接口将保存您想要完成的任务,而不是创建一个匿名类。

请注意,这是一个可能的解决方案。IMO 最好将记录列表发送到将处理它们的组件,例如通过 JMS 调用。然后组件会调用你的 restful 服务和它必须做的其他事情来处理记录。

于 2013-10-26T19:24:50.877 回答