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