在Java EE Web应用程序中实现并发

ary*_*rya 5 multithreading java-ee

我们正在创建一个Web应用程序,我们需要为一些业务案例提供并发性.此应用程序将部署在tomcat容器中.我知道在Web容器中创建用户定义的线程是一个坏主意,我正在尝试探索我拥有的选项.

  1. 让我的多线程库用作JCA组件.由于可能涉及的学习曲线,我们反对使用这种方法.
  2. 我知道有可用的WorkManager API,但我想这不是tomcat实现的,所以这个选项就出来了.
  3. 我做了一些研究,发现CommonJ库被推荐用于Tomcat.有人用过吗?
  4. 此外,我看到有ManagedExecutorService可用,但我不知道如何使用它,它是否与WorkManager API(和commonJ库)不同?

对此有任何帮助表示赞赏.顺便说一句,由于部署环境,使用JMS是不可能的.我倾向于第3点和第4点,但我对此并不了解.有人可以指导.

Wil*_*ung 4

既然你使用的是Tomcat,那就不用担心它,做你想做的事。Java EE 的 Servlet 部分没有提及线程等。这主要在 EJB 部分下。

Tomcat 本身在管理线程方面根本不需要做太多事情,它是一个非常非侵入性的容器。

最好将您的线程绑定到 ServletContextListener,以便您可以关注应用程序生命周期,并在应用程序关闭时关闭您的东西,但除此之外,不要过度关心它并使用您满意的任何内容。

附录 -

简单的事实是 Tomcat 并不关心,而且它也没有那么复杂。Tomcat 为每个 HTTP 侦听器都有一个线程池,这大约是其管理级别的末端。例如,Tomcat 不会从安静的 HTTP 侦听器中获取线程并将其专用于繁忙的侦听器。如果 Tomcat 真正对您如何创建线程感兴趣,它会阻止您这样做——但事实并非如此。

这意味着 HTTP 上下文之外的线程管理完全落在了作为实现者的肩上。Java EE 公开了这些类型的工具,并且这些接口非常适合阅读。但简单的事实是,Java EE API 文档所支持的理论功能与现代实现的现实有很大不同,特别是在 Tomcat 等低端系统上。

并不是要贬低Tomcat。Tomcat 是一个很棒的软件。但对于大多数用例来说,额外的管理功能根本没有必要。

设置您自己的线程池(使用 JDK 提供的工具)并使用您自己的线程生命周期模型可能会帮助您成功完成您正在处理的任何项目。这真的不是什么大不了的事。