Ger*_*ler 8 java multithreading ejb java-ee ejb-3.0
EJB 3.0规范不允许无状态会话bean的业务方法创建新线程.这是为什么?创建仅执行原始计算并且从不调用应用程序服务器的其他工作线程有什么问题?
比如说,我的会话bean实现了一个允许用户上传图像的服务,而业务方法对这些图像进行了cpu密集型图像处理.那么即使机器有8个或更多核心,它也只能使用一个cpu核心来完成这项工作?如果我利用第三方图像处理库,在内部创建工作线程,我也会违反EJB规范,即使该库和这些线程根本不与EJB容器有关.这似乎不对.
如果我忽略EJB规则并仍然创建一些工作线程来进行cpu密集处理会发生什么?当然这些线程永远不会触及任何app服务器对象,bean线程会在返回之前加入它们.还能发生什么不好的事吗?
Pas*_*ent 18
EJB 3.0规范不允许无状态会话bean的业务方法创建新线程.这是为什么?
简短版本:不允许从EJB管理线程,因为它会损害资源管理,事务管理,安全性(技术原因),也因为这是EJB模型不想推广的东西(哲学原因).
EJB规范如下所示:
21.1.2编程限制
...
- 企业bean不得尝试管理线程.企业bean不得尝试启动,停止,暂停或恢复线程,或更改线程的优先级或名称.企业bean不得尝试管理线程组.
这些函数是为EJB容器保留的.允许企业bean管理线程会降低容器正确管理运行时环境的能力.
(...)如果我利用第三方图像处理库,在内部创建工作线程,我也会违反EJB规范,即使该库和这些线程根本与EJB容器无关.这似乎不对.
我能说什么,如果你不喜欢这样,就不要使用EJB.
如果我忽略EJB规则并仍然创建一些工作线程来进行cpu密集处理会发生什么?当然这些线程永远不会触及任何app服务器对象,bean线程会在返回之前加入它们.还能发生什么不好的事吗?
这些线程是否正在触摸app服务器对象无关紧要.规则是规则,你不想跟随它们,你是独立的,行为是未定义的.一些容器可能更宽松并允许它,其他一些不会,你的应用程序将无法移植等等.但它仍然是明确禁止的.
如果要以标准方式"生成"线程,请使用WorkManager API或使用JMS.
| 归档时间: |
|
| 查看次数: |
11922 次 |
| 最近记录: |