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

Java 如何在jsf中使用bean中的线程,java,multithreading,jsf,concurrency,Java,Multithreading,Jsf,Concurrency,在我使用JSF的web应用程序中,我有100条记录是从前端选择的(使用复选框),单击一个按钮,这些选择的100条记录需要启动(它将使用RESTAPI调用创建调查),这将调用bean中的一个方法来进行RESTAPI调用 目前,每条记录按顺序处理,每条记录平均需要20秒。因此,如果我选择近100条记录,我将获得请求超时。。我计划使用线程调用bean中的方法。。你能告诉我怎么办吗?bean中的方法是InitiateView,它将引用号作为参数。托管bean最终是POJO。因此,您的问题归结为如何使用多

在我使用JSF的web应用程序中,我有100条记录是从前端选择的(使用复选框),单击一个按钮,这些选择的100条记录需要启动(它将使用RESTAPI调用创建调查),这将调用bean中的一个方法来进行RESTAPI调用


目前,每条记录按顺序处理,每条记录平均需要20秒。因此,如果我选择近100条记录,我将获得请求超时。。我计划使用线程调用bean中的方法。。你能告诉我怎么办吗?bean中的方法是InitiateView,它将引用号作为参数。

托管bean最终是POJO。因此,您的问题归结为如何使用多个线程在不同对象上执行类似的任务,因此最终是Java问题而不是JSF问题。为此,您必须使用接口。实现这一点的一个简单示例:

@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();
    }
}
@ManagedBean
@请求范围
公共类SomeBean{
列出记录;
//其他字段、构造函数、getter和setter。。。
公共图书馆{
int poolSize=records.size();
ExecutorService executor=Executors.newFixedThreadPool(池大小);
for(最终字符串记录:记录){
executor.execute(新的Runnable(){
公开募捐{
//要在线程中执行的任务。。。
}
});
}
executor.shutdown();
}
}
此示例的一些注释:

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

请注意,这是一种可能的解决方案。在我看来,最好将记录列表发送给将处理它们的组件,例如通过JMS调用。然后组件将调用restful服务以及处理记录所必须做的其他事情。

托管bean最终是POJO。因此,您的问题归结为如何使用多个线程在不同对象上执行类似的任务,因此最终是Java问题而不是JSF问题。为此,您必须使用接口。实现这一点的一个简单示例:

@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();
    }
}
@ManagedBean
@请求范围
公共类SomeBean{
列出记录;
//其他字段、构造函数、getter和setter。。。
公共图书馆{
int poolSize=records.size();
ExecutorService executor=Executors.newFixedThreadPool(池大小);
for(最终字符串记录:记录){
executor.execute(新的Runnable(){
公开募捐{
//要在线程中执行的任务。。。
}
});
}
executor.shutdown();
}
}
此示例的一些注释:

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

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

您能为我提供一个JMS示例吗?单击commndbutton,我正在一个bean中调用InitiateView方法,该bean也有其他方法。InitiateView方法接受一个被选为参数的obj。initiatereview方法依次调用类中的另一个方法,该方法进行RESTAPI调用并发送电子邮件。我需要在一个线程中执行此操作。如何将参数传递给运行中的方法。。我可以使用一个实现runnable并在构造函数中传递参数的类吗?@hemsush检查这里:还可以查看如何正确关闭:@ChristopherRoussy您可以使用
shutdown
shutdownNow
关闭执行器,这只是两种不同的方法,问题是你不关闭它会导致应用程序泄漏。@LuiggiMendoza我不是说你的解决方案不正确,而是要展示其他现有的解决方案。你能给我举个JMS的例子吗?单击commndbutton,我正在一个bean中调用InitiateView方法,该bean也有其他方法。InitiateView方法接受一个被选为参数的obj。initiatereview方法依次调用类中的另一个方法,该方法进行RESTAPI调用并发送电子邮件。我需要在一个线程中执行此操作。如何将参数传递给运行中的方法。。我可以使用一个实现runnable并在构造函数中传递参数的类吗?@hemsush检查这里:还可以查看如何正确关闭:@ChristopherRoussy您可以使用
shutdown
shutdownNow
关闭执行器,这只是两种不同的方法,问题是当您不关闭它时,会导致应用程序泄漏。@LuiggiMendoza我不是说您的解决方案不正确,而是要显示其他现有的解决方案。