目前,我开发了一个JCA出站适配器(支持LocalTransaction ),并且在连接管理方面遇到了一些问题。我的适配器运行良好,除非服务器(WebLogic 12c)没有将ManagedConnections放回池中。根据JavaDoc,服务器必须调用ManagedConnection.cleanup()来重新初始化连接并将其放回池中,但它没有。
当我从EJB中使用适配器时,服务器会创建一个新的ManagedConnection,开始一个新的事务,提交它,但是不会调用ManagedConnection.cleanup()方法,也不会将它放回池中。
下面可以看到我的测试bean:
@Stateless(mappedName = "TestingBean")
@Local(value = TestingBeanLocal.class)
@Remote(value = TestingBeanRemote.class)
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public class TestingBean implements TestingBeanCommon{
@Resource(mappedName = "eis/myJCA")
private MyDataSource dataSource;
@Override
public void performTestAction(String param1, String param2) {
MyConnection connection = dataSource.getMyConnection();
connection.performAction(ActionFactory.getSomeAction(param1, param2));
}
}经过10次调用后,我得到以下信息:
weblogic.common.resourcepool.ResourceLimitException:获得了初始上下文javax.ejb.EJBException: EJB异常:;嵌套异常是: java.lang.RuntimeException:无法为
= " eis/myJCA“获取连接,weblogic.common.resourcepool.ResourceLimitException:配置了对允许等待池eis/myJCA到达的资源的线程数的最大限制(0)
正如您注意到的,它为每次调用使用一个新事务(REQUIRES_NEW属性)。服务器首先创建一个新的ManagedConnection实例10次,然后连接池达到其最大容量。
通过跟踪日志可以清楚地看到,没有发生ManagedConnection.cleanup()的单个调用,池中的每个连接都很忙。我阅读了JCA规范,发现适配器可以使用回调函数向侦听器发送生命周期事件,但任何使用这些事件侦听器回调的尝试都以一个新的异常结束:
javax.ejb.EJBException: BEA1-001471C1E76DE5A4E067;嵌套异常为: weblogic.transaction.nonxa.NonXAException: java.lang.IllegalStateException:连接器:1995 175- ManagedConnection由容器管理,用于其事务行为,并已由容器登记到JTA事务;应用程序/适配器不能调用本地事务开始/提交/回滚API。从适配器拒绝事件LOCAL_TRANSACTION_COMMITTED。javax.ejb.EJBException: Exception:;嵌套异常是: java.lang.IllegalStateException:连接器:199175该ManagedConnection由容器管理,用于其事务行为,并已被容器登记到ManagedConnection;应用程序/适配器不能调用本地事务开始/提交/回滚API。从适配器拒绝事件LOCAL_TRANSACTION_ROLLEDBACK。
我想WebLogic不会等待任何事件(也许我发错了?)。
那我做错什么了?如何使服务器将连接放回池?
UPD:我发现连接事件对服务器非常重要。服务器根据发送到侦听器的事件信息管理连接,并将其注册到ManagedConnection。现在我支持适配器中的事件,但是WebLogic仍然不想将连接放回池中。目前,我在日志中得到以下事件:
对我来说它看起来很好( CONNECTION_CLOSED事件意味着应用程序关闭了连接,我添加了close方法,它发送这个事件)。提交成功,没有出现异常。我似乎已经按正确的顺序发送了事件(早期的WebLogic抛出异常,但现在停止了),但是服务器仍然没有将连接放回池。
我很困惑。
发布于 2012-03-20 16:01:32
看来我已经重新接受了这个问题。当我查看WebLogic控制台时,我发现ManagedConnection实例有-1个活动处理程序。因此,我决定对MyConnection.close()方法调用进行注释,并将其添加到测试bean中以发送CONNECTION_CLOSED事件。在此之后,连接池开始很好地工作。我试图修改我的测试bean,并将其事务属性设置为NOT_SUPPORTED。之后,池中的ManagedConnections有一个活动处理程序。因此,我将MyConnection.close()线路和连接池放回原处,重新开始工作。
我认为,在事务传播的情况下,发送CONNECTION_CLOSED事件是错误的。另外,我假设在单个事务的情况下应该使用发送CONNECTION_CLOSED事件的方法CONNECTION_CLOSED。但我觉得很奇怪,如果WebLogic有负数的活动处理程序,那么它不想清理ManagedConnections并将它们放回原处。
非常感谢你的帮助。
https://stackoverflow.com/questions/9783140
复制相似问题