Моему приложению, работающему в 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, в системе имеется две версии (одна в JBoss и одна в EAR).
Можно ли таким способом использовать пул потоков JBoss в JBoss-5? Или мне нужно определить свой собственный пул потоков в приложении, может быть, в адаптере JCA?