java - 使用jboss5线程池启动线程

标签 java multithreading classloader threadpool jboss5.x

我的应用程序在 JBoss 5 中运行,需要启动一个线程来异步执行一些工作。该代码使用“ThreadPoolMBean”来使用来自 JBoss 自己的线程池的线程——这在 JBoss 4 中有效,但现在似乎遇到了类加载器问题,因为我得到了这个异常:

14:52:15,918 WARN [org.jboss.util.threadpool.RunnableTaskWrapper] (JBoss System Threads(1)-413:) Unhandled throwable for runnable: application.NSP@4c80c3ab () 
    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from class loader
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:596)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:127)
    at application.NSP.run(NotfallStopperProzess.java:105)
    at org.jboss.util.threadpool.RunnableTaskWrapper.run(RunnableTaskWrapper.java:147)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from class loader
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
    at org.hibernate.jdbc.BorrowedConnectionProxy.generateProxy(BorrowedConnectionProxy.java:67)
    at org.hibernate.jdbc.ConnectionManager.borrowConnection(ConnectionManager.java:163)
    at org.hibernate.jdbc.JDBCContext.borrowConnection(JDBCContext.java:111)
    at org.hibernate.impl.SessionImpl.connection(SessionImpl.java:360)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:507)
    ... 8 more

启动线程的代码如下:

MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName objName;
objName = new ObjectName("jboss.system:service=ThreadPool");
ThreadPoolMBean poolMBean =
   (ThreadPoolMBean) MBeanServerInvocationHandler.newProxyInstance(server, objName, ThreadPoolMBean.class, false);
poolMBean.getInstance().run(runnable)

我假设问题是 JBoss 线程池和我的应用程序 (EAR) 之间的不同类加载器。引用Hibernate出现问题,Hibernate在系统中有两个版本(一个在JBoss,一个在EAR)。

在JBoss-5中可以这样使用JBoss线程池吗?或者我是否需要在应用程序中定义我自己的线程池,也许是在 JCA 适配器中?

最佳答案

你耳边有没有jboss-app.xml?查看此站点以了解 JBoss 类加载隔离问题 http://community.jboss.org/wiki/ClassLoadingConfiguration

关于java - 使用jboss5线程池启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7912162/

相关文章:

java - 进口报关

java - 如果 EDT 是一个单独的线程,为什么在这个例子中 invokeLater 等待主线程完成?

c++ opencv图像不显示在boost线程内

java自定义类加载器: some classes are not loaded by my classloader

java - 如何使用 Javassist 将抽象类变为非抽象类?

java - 如何使用 eclipse kepler 创建 EJB 3.1 项目?

java - Android - 根据按下的按钮添加到 ListView

java - 进度条属性变化事件不触发

java - Android 我使用了多个 ClassLoader/PathClassLoaders 吗?

c# - BackgroundWorker中的同步工作