4

我有一些 Quartz 计划的作业,这些作业是 IO 密集型的,并且很容易分解为多个任务。

多亏了 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);
4

2 回答 2

1

是的,你可以这样做。但是在将你的工作放入 tomcat 之前。请注意以下事项。

你在tomcat中有一个网络应用程序吗?如果是,您的 Web 应用程序是高度活跃的高负载门户吗?
如果是,您的线程作业将从 tomcat 服务器中带走有价值的处理

作业是由紧密耦合的线程作业完成的还是需要 tomcat 完成的?
如果你的工作真的很依赖。您最好创建一个单独的批处理服务器并使用它。您可以查看 spring-batch 的实现。

于 2012-08-13T06:27:03.870 回答
1

也许,仔细。

请注意,没有任何线程(除了原来的线程——我们称之为 web-app 线程)能够可靠地与容器交互。通常,不鼓励在 Java EE 运行时中使用线程。不过,这并非闻所未闻。

雄猫选项:

  1. Java EE 有一个 WorkManager API。至少有一种用于 tomcat 的实现。我不能说它的效果如何。 本文对此进行了更多讨论

  2. 开始你自己的线程。如何管理事物的模型可能是 Swing Event Dispatch Loop SwingUtilities.invokeLater(Runnable);在您的情况下,让工作线程将在容器中完成的工作提交回容器安全的 Web 应用程序线程。该线程将在等待工作线程完成时运行句柄工作循环。

  3. 将工作请求发送回 tomcat 服务器:您的 Web 应用现在充当客户端(Web 服务?)。正如 AkhilDev 建议的那样,这样的模型可以很好地扩展以将工作卸载到其他服务器。

于 2012-08-13T09:15:20.120 回答