为了账号安全,请及时绑定邮箱和手机立即绑定

Java EE 中 ManagedExecutorService 和 ManagedThread

Java EE 中 ManagedExecutorService 和 ManagedThread

慕哥6287543 2023-01-05 16:45:59

我们当前的遗留 Web 应用程序在其中创建不受应用程序服务器容器管理的线程。我必须用多线程的 JavaEE 标准修改它。

我的网络应用程序在 Tomcat 上运行良好,但在 Websphere 上运行失败。

Websphere 上的错误:


... ... Caused by: javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component.  This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request.  Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application.  Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names.

    at com.ibm.ws.naming.java.javaURLContextImpl.throwExceptionIfDefaultJavaNS(javaURLContextImpl.java:534) ~[com.ibm.ws.runtime.jar:?]

    at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:564) ~[com.ibm.ws.runtime.jar:?]

    at com.ibm.ws.naming.java.javaURLContextImpl.lookupExt(javaURLContextImpl.java:485) ~[com.ibm.ws.runtime.jar:?]

    at com.ibm.ws.naming.java.javaURLContextRoot.lookupExt(javaURLContextRoot.java:485) ~[com.ibm.ws.runtime.jar:?]

为了解决这个问题,我指的是Concurrency Utilities in Java EE。我为ManagedExecutorService和ManagedThreadFactory找到了类似的描述和示例。


ManagedExecutorService:应用程序使用托管执行器服务来异步执行提交的任务。任务在容器启动和管理的线程上执行。容器的上下文被传播到执行任务的线程。

ManagedThreadFactory:应用程序使用托管线程工厂来创建托管线程。线程由容器启动和管理。容器的上下文被传播到执行任务的线程。此对象还可用于为特定用例(使用自定义线程)提供自定义工厂,例如,为这些对象设置特定/专有属性。

在哪种情况下首选哪一种?为什么?


查看完整描述

1 回答

?
MMTTMM

TA贡献1615条经验 获得超4个赞

我已经通过使用 ManagedExecutorService 解决了问题。

ExecutorService框架确实有更多处理线程的方法,而ManagedThreadFactory只能调用newThread()方法。

Websphere 问题可以通过使用 ManagedExecutorService 或 ManagedThreadFactory 来解决。两者都有效。但是对于进一步的线程处理,ManagedExecutorService 结果要好得多。

现在,此解决方案导致相同的 Web 应用程序在 Tomcat 上失败。JNDI 命名异常。根据我的研发,基于容器的并发在 TomEE 服务器中受支持,而不是在 Tomcat 中,因此我们必须使用路由机制根据底层应用程序服务器在代码之间切换。


查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信