Multithreading JSF中的线程?

Multithreading JSF中的线程?,multithreading,jsf,jakarta-ee,Multithreading,Jsf,Jakarta Ee,我是JSF新手,我需要使用GoogleMaps的线程。我正在为谷歌地图使用primefaces,但我需要在后台执行一个线程,从数据库中获取lat和long,然后在地图中绘制标记。JSF与您的问题完全无关。在这种情况下,JSF将仅仅充当HTML生成器。您的具体问题是如何异步准备数据并从web应用程序中使用数据 当应用程序在实现ServletContextListener接口的类上启动时,可以手动创建线程,如下所示: public class ApplicationListener implemen

我是JSF新手,我需要使用GoogleMaps的线程。我正在为谷歌地图使用primefaces,但我需要在后台执行一个线程,从数据库中获取lat和long,然后在地图中绘制标记。

JSF与您的问题完全无关。在这种情况下,JSF将仅仅充当HTML生成器。您的具体问题是如何异步准备数据并从web应用程序中使用数据

当应用程序在实现
ServletContextListener
接口的类上启动时,可以手动创建线程,如下所示:

public class ApplicationListener implements ServletContextListener {
    ExecutorService executor;

    public ApplicationListener() {
        executor = Executors.newSingleThreadExecutor();
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                //process the data here...
            }
        }
        executor.submit(task);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        executor.shutdownNow();
    }
}
改进上述设计以满足您的要求。请注意,只有当您知道自己在做什么时,才应该在应用程序服务器中创建线程


另一个实现是使用另一个应用程序进行处理(我们称之为数据处理器),默认情况下,它将在单独的线程和环境上运行。然后,通过缓存或nosql应用程序(如EhCache、Infinispan或Hazelcast)将您的web应用程序与此数据处理器进行通信。

您的问题不是针对JSF的,而是针对一般的web应用程序。那么,如何在JavaWeb应用程序中异步执行任务呢?当然不是通过创建自己的线程

Java web应用程序在应用程序服务器(例如jBoss)中运行。应用服务器负责为您管理Java线程。例如,它将为传入的每个web请求使用单独的线程。应用程序服务器创建一个线程池并重用这些线程,因为一直创建新的线程有点昂贵。这就是为什么您不应该创建自己的,特别是如果为每个web请求都创建了,因为它将直接影响可伸缩性

为了异步执行任务,您可以使用ejb@Asynchronous注释(假设应用程序运行在jBoss等JavaEE容器中,而不是Tomcat中)

如果应用程序不是在JavaEE容器中运行的,那么请看一看,在web应用程序中,它很好地列出了一些异步处理的其他选项

import javax.ejb.Singleton;

@Singleton
public class AsyncBean {

    @Asynchronous
    public void doSomethingAsynchronously() {
       // when this EJB is injected somewhere, and this method is called, it will return to the caller immediately and its logic will run in the background
    }

}