Java EE 中 ManagedExecutorService 和 ManagedThreadFactory 的区别
Difference between ManagedExecutorService and ManagedThreadFactory in Java EE
我们当前的遗留网络应用程序在其中创建不受应用程序服务器容器管理的线程。我必须用多线程的 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. I found similar kind of description and example for ManagedExecutorService and ManagedThreadFactory。
- ManagedExecutorService: A managed executor service is used by applications to execute submitted tasks asynchronously. Tasks are
executed on threads that are started and managed by the container. The
context of the container is propagated to the thread executing the
task.
- ManagedThreadFactory: A managed thread factory is used by applications to create managed threads. The threads are started and
managed by the container. The context of the container is propagated
to the thread executing the task. This object can also be used to
provide custom factories for specific use cases (with custom Threads)
and, for example, set specific/proprietary properties to these
objects.
在哪种情况下首选哪一种,为什么?
我已经使用 ManagedExecutorService 解决了问题。
ExecutorService框架确实有更多处理线程的方法,而ManagedThreadFactory只能调用newThread()方法
可以使用 ManagedExecutorService 或 ManagedThreadFactory 解决 Websphere 问题。两者都有效。但是对于进一步的线程处理,ManagedExecutorService 结果要好得多。
现在,此解决方案导致相同的 web-app 在 Tomcat 上失败。 JNDI 命名异常。根据我的研发,TomEE 服务器不支持基于容器的并发,Tomcat 所以我们必须使用路由机制根据底层应用程序服务器在代码之间切换。
我们当前的遗留网络应用程序在其中创建不受应用程序服务器容器管理的线程。我必须用多线程的 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. I found similar kind of description and example for ManagedExecutorService and ManagedThreadFactory。
- ManagedExecutorService: A managed executor service is used by applications to execute submitted tasks asynchronously. Tasks are executed on threads that are started and managed by the container. The context of the container is propagated to the thread executing the task.
- ManagedThreadFactory: A managed thread factory is used by applications to create managed threads. The threads are started and managed by the container. The context of the container is propagated to the thread executing the task. This object can also be used to provide custom factories for specific use cases (with custom Threads) and, for example, set specific/proprietary properties to these objects.
在哪种情况下首选哪一种,为什么?
我已经使用 ManagedExecutorService 解决了问题。
ExecutorService框架确实有更多处理线程的方法,而ManagedThreadFactory只能调用newThread()方法
可以使用 ManagedExecutorService 或 ManagedThreadFactory 解决 Websphere 问题。两者都有效。但是对于进一步的线程处理,ManagedExecutorService 结果要好得多。
现在,此解决方案导致相同的 web-app 在 Tomcat 上失败。 JNDI 命名异常。根据我的研发,TomEE 服务器不支持基于容器的并发,Tomcat 所以我们必须使用路由机制根据底层应用程序服务器在代码之间切换。