在我使用 JSF 的 Web 应用程序中,我从前端(使用复选框)选择了 100 条记录,单击按钮后,需要启动这些选定的 100 条记录(它将使用 RESTAPI 调用创建调查),它调用 bean 中的一个方法,该方法将进行 REST API 调用。
目前每条记录按顺序处理,每条记录平均耗时20秒。所以如果我选择近 100 条记录,我会收到请求超时。我打算使用线程调用 bean 中的方法。你能告诉我该怎么做吗? bean中的方法是initiatereview,它以引用号为参数。
最佳答案
托管 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
接口(interface)的类,该接口(interface)将保存您想要完成的任务,而不是创建一个匿名类。
请注意,这是一个可能的解决方案。 IMO 最好将记录列表发送到将处理它们的组件,例如通过 JMS 调用。然后该组件将调用您的 restful 服务和它必须执行的其他操作来处理记录。
关于java - 如何在jsf中的bean中使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19610838/