java - 如何在jsf中的bean中使用线程

标签 java multithreading jsf concurrency

在我使用 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/

相关文章:

c - 如果在单独的线程中关闭(2) 文件描述符,select(2) 会做什么?

C代码多线程Pthread

java - java中如何将十六进制字符串更改为4字节?

java - Java 的 fork-and-join 线程池是否适合执行 IO 绑定(bind)任务?

java - 如何以最短的方式在jshell中定义一个空字符串列表?

multithreading - 运行一个产生 N 个线程的进程还是运行 N 个进程更快?

java - 有没有办法从终端启动本地 Java IBM Liberty 服务器?

javascript - 从 javascript 更新 bean

JSF2 i18n bean 验证消息

java - Java EE Web 应用程序的架构