我正在尝试在Java EE环境中确定“已批准”或最佳实践方法,以执行以下操作:客户端位于网页上并单击按钮。这将启动一个监视进程的线程,即数据库活动,网络等。此过程将继续运行,直到用户单击一个告诉进程结束的按钮。其他客户端和/或同一客户端然后单击按钮以收听从该进程发送的状态,该状态将继续监听,直到用户单击按钮停止收听。
我已经通过使用WebSocket与servlet进行通信来完成上述操作,该servlet注入了一个扩展WebSocketApplication的单例EJB。但是,这个EJB正在产生进程线程来进行监视。虽然它是有效的并且应该继续工作,因为它是一个单身人士,但它并不是“批准”的方式。
我已经回顾过的一些建议讨论了使用JMS来生成线程,但是,除非我误解了某些内容,否则这并没有解决任何问题,因为消息驱动Bean也不应该产生线程。那么,这样做的批准/最佳实践方法是什么?如何在Java EE环境中启动和停止后台进程?同样,要求是,只能生成一个进程,它必须与注册到servlet的所有WebSockets通信,它必须能够在被告知时死掉(尽管这并不意味着服务器关闭套接字,因为它可以开始备份,仍然会与所有以前注册的客户沟通)。
感谢。
答案 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提供对托管线程池的访问。