Java EE和后台线程

时间:2012-03-16 13:22:50

标签: multithreading java-ee jms ejb-3.1

我正在尝试在Java EE环境中确定“已批准”或最佳实践方法,以执行以下操作:客户端位于网页上并单击按钮。这将启动一个监视进程的线程,即数据库活动,网络等。此过程将继续运行,直到用户单击一个告诉进程结束的按钮。其他客户端和/或同一客户端然后单击按钮以收听从该进程发送的状态,该状态将继续监听,直到用户单击按钮停止收听。

我已经通过使用WebSocket与servlet进行通信来完成上述操作,该servlet注入了一个扩展WebSocketApplication的单例EJB。但是,这个EJB正在产生进程线程来进行监视。虽然它是有效的并且应该继续工作,因为它是一个单身人士,但它并不是“批准”的方式。

我已经回顾过的一些建议讨论了使用JMS来生成线程,但是,除非我误解了某些内容,否则这并没有解决任何问题,因为消息驱动Bean也不应该产生线程。那么,这样做的批准/最佳实践方法是什么?如何在Java EE环境中启动和停止后台进程?同样,要求是,只能生成一个进程,它必须与注册到servlet的所有WebSockets通信,它必须能够在被告知时死掉(尽管这并不意味着服务器关闭套接字,因为它可以开始备份,仍然会与所有以前注册的客户沟通)。

感谢。

4 个答案:

答案 0 :(得分:1)

  

这个EJB正在产生流程线程

EJB是not permitted to start threads。标准:

  

企业bean不得尝试管理线程。企业bean不得尝试   启动,停止,暂停或恢复线程,或更改线程的优先级或名称。进入 -   奖金bean不得试图管理线程组。

     

这些函数是为EJB容器保留的。允许企业bean管理线程   会降低容器正确管理运行时环境的能力。

这是设计上的;规范说明如下

  

Enterprise JavaBeans架构可以轻松编写应用程序:应用程序   开发人员不必了解低级别的事务和状态管理细节,   多线程,连接池或其他复杂的低级API。

您是否考虑过使用有状态会话bean?单击该按钮会使bean进入“已启动”状态。单击第二个按钮使bean进入“已停止”状态。

答案 1 :(得分:1)

要在企业环境中创建线程,您应该使用ManagedThreadFactory或ManagedExecutorService。

请参阅here

答案 2 :(得分:0)

答案是异步EJB 3.1 bean。谢谢你的回复。

答案 3 :(得分:0)

从Java EE 7开始,您可以使用ManagedExecutorService为EJB提供对托管线程池的访问。