繁体   English   中英

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

[英]how to use thread in bean in jsf

在我使用JSF的Web应用程序中,我有100条记录从前端选中(使用复选框),点击按钮时,需要启动那些选定的100条记录(它将使用RESTAPI调用创建调查),调用bean中的一个方法来调用REST API。

目前,每个记录按顺序处理,每条记录平均需要20秒。 所以,如果我选择近100条记录,我的请求超时..我打算用bean调用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值不应该是poolSize records.size() ,我只是将其作为每个工作要创建的线程的示例。 请注意,您应该创建服务器支持的多个线程。 此变量的实际值取决于测试结果。 我建议使用10作为初始值,然后将其更改为测量性能结果。
  • 您可以创建一个实现Runnable接口的类,该接口将保存您要完成的任务,而不是创建匿名类。

请注意,这是一种可能的解决方案。 IMO最好将记录列表发送到将处理它们的组件,例如通过JMS调用。 然后组件将调用您的restful服务以及处理记录所必须执行的其他操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM