在我使用 JSF 的 Web 应用程序中,我从前端选择了 100 条记录(使用复选框),并且在单击按钮时,需要启动那些选择的 100 条记录(它将使用 RESTAPI 调用创建调查),其中调用 bean 中的一个方法,该方法将进行 REST API 调用。
目前每条记录按顺序处理,每条记录平均耗时20秒。所以如果我选择近 100 条记录,我会收到请求超时。我打算使用线程调用 bean 中的方法。你能告诉我该怎么做吗?bean中的方法是initialreview,以引用号为参数。
在我使用 JSF 的 Web 应用程序中,我从前端选择了 100 条记录(使用复选框),并且在单击按钮时,需要启动那些选择的 100 条记录(它将使用 RESTAPI 调用创建调查),其中调用 bean 中的一个方法,该方法将进行 REST API 调用。
目前每条记录按顺序处理,每条记录平均耗时20秒。所以如果我选择近 100 条记录,我会收到请求超时。我打算使用线程调用 bean 中的方法。你能告诉我该怎么做吗?bean中的方法是initialreview,以引用号为参数。
托管 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 服务和它必须做的其他事情来处理记录。