2012-03-16 123 views
0

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

我已经通过使用WebSocket与一个servlet进行通信,该servlet获得了一个注入了扩展WebSocketApplication的单例EJB。但是,这个EJB产生了进程线程来执行监控。虽然它是有效的,并且应该继续工作,因为它是一个单例,但它不是“批准”的方式。

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

谢谢。

回答

1

这个EJB正在孕育过程中的线程

EJB是not permitted to start threads。请参考标准:

企业bean不能尝试管理线程。企业bean不得尝试 来启动,停止,挂起或恢复线程,或者更改线程的优先级或名称。 enter- 获奖bean不得尝试管理线程组。

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

这是设计;该规范规定了以下

企业JavaBeans体系结构将可以很容易地编写应用程序:申请 开发人员不必理解低级事务和状态管理细节, 多线程,连接池,或其他复杂的低级API。

您是否考虑过使用有状态会话bean?点击按钮会导致bean进入“开始”状态。点击第二个按钮会导致bean进入“停止”状态。

0

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

1

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

请参阅here

0

从Java EE的7可以使用ManagedExecutorService给你的EJB访问管理线程池。