我有几个Quartz预定作业,这些作业非常密集,并且很容易破解成多个任务。
由于Spring,这些作业在tomcat web容器中被实例化和调度。
如果我在Job类和Java EE容器中使用 java.util.concurrent API,这样可以吗?
我是否可以通过使用 FixedThreadPool 并分配几个核心(在此示例中为两个核心)来与Tomcat共享逻辑处理器?
int numberOfCores = Runtime.getRuntime().availableProcessors();
final int poolSize = numberOfCores - 2 // Give away Two slots for TOMCAT
final ExecutorService executorPool = Executors.newFixedThreadPool(poolSize);
答案 0 :(得分:1)
你在tomcat中有一个网络应用程序吗?如果是,您的网络应用程序是一个高度活跃的高负载门户吗? 如果是,您的线程作业将从tomcat服务器中删除有价值的处理
作业是通过线程作业紧密耦合还是需要tomcat完成的? 如果你的工作真的依赖。您应该更好地创建一个单独的批处理服务器并使用它。您可以查看spring-batch的实现。
答案 1 :(得分:1)
也许,小心。
请注意,没有任何线程(除了原始线程 - 让我们称之为web-app线程)将能够可靠地与容器交互。通常,不鼓励在Java EE运行时中使用线程。但这并不是闻所未闻。
Java EE has a WorkManager API。至少one implementation of it for tomcat。我不能说它有多好。 This article talks more about it
开始自己的主题。如何管理事物的模型可能是带有SwingUtilities.invokeLater(Runnable)
的Swing事件调度循环;在您的情况下,工作线程将容器中的工作量提交回容器安全的Web应用程序线程。该线程将在等待工作线程完成时运行一个句柄工作循环。
将工作人员请求发送回tomcat服务器:您的网络应用程序现在充当客户端(Web服务?)。正如AkhilDev建议的那样,这样的模型可以很好地扩展到将工作卸载到其他服务器上。