Java JCA ManagedConnection生命周期
目前,我开发了一个JCA出站适配器(带有LocalTransaction支持),在连接管理方面遇到了一些问题。我的适配器工作正常,只是服务器(WebLogic 12c)没有将ManagedConnections放回池中。根据JavaDoc,服务器必须调用Java JCA ManagedConnection生命周期,java,weblogic,jca,Java,Weblogic,Jca,目前,我开发了一个JCA出站适配器(带有LocalTransaction支持),在连接管理方面遇到了一些问题。我的适配器工作正常,只是服务器(WebLogic 12c)没有将ManagedConnections放回池中。根据JavaDoc,服务器必须调用ManagedConnection.cleanup()来重新初始化连接并将其放回池中,但它不会 当我从EJB使用适配器时,服务器创建一个新的ManagedConnection,开始一个新事务,提交它,但不调用ManagedConnection.c
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次调用后,我得到以下结果:
获得初始上下文
ejb.EJBException:ejb异常:;嵌套异常是:
java.lang.RuntimeException:javax.resource.spi.ApplicationServerInternalException:无法获取pool=“eis/myJCA”、weblogic.common.resourcepool.ResourceLimitException的连接:已配置允许等待池eis/myJCA达到资源的线程数的最大限制(0)
正如您所注意到的,它为每个调用使用一个新的事务(需要_new
属性)。服务器先创建一个新的ManagedConnection实例10次,然后连接池达到其最大容量
从跟踪日志可以清楚地看出,没有发生对ManagedConnection.cleanup()
的单个调用,并且池中的每个连接都很忙。我已经阅读了JCA规范,发现适配器可以使用回调函数将生命周期事件发送给侦听器,但任何尝试使用这些事件侦听器回调的行为都会导致新的异常:
javax.ejb.EJBException:BEA1-001471C1E76DE5A4E067;嵌套异常是:
weblogic.transaction.nonxa.NonXAException:java.lang.IllegalStateException:[连接器:199175]此ManagedConnection由容器管理其事务行为,并已由容器登记到JTA事务中;应用程序/适配器不得调用本地事务开始/提交/回滚API。拒绝从适配器提交的事件本地\u事务\u。
ejb.EJBException:ejb异常:;嵌套异常是:
java.lang.IllegalStateException:[Connector:199175]此ManagedConnection由容器管理其事务行为,并已由容器登记到JTA事务中;应用程序/适配器不得调用本地事务开始/提交/回滚API。拒绝本地\u事务\u从适配器回滚的事件
我想WebLogic不会等待任何事件(可能我发送了错误的事件?)
那么,我做错了什么?如何使服务器将连接放回池
UPD:我发现连接事件对服务器非常重要。服务器根据发送到侦听器的事件信息管理连接,并将其注册到ManagedConnection。现在我在适配器中支持事件,但WebLogic仍然不希望将连接放回池。目前,我在日志中获得以下事件:
我很困惑。看来我已经解决了这个问题。在WebLogic控制台中查看时,我发现ManagedConnection实例具有-1个活动处理程序。因此我决定注释
MyConnection.close()
method调用,将其添加到测试bean中以发送CONNECTION\u CLOSED
事件。在这一改变之后,连接池开始工作。我试图修改我的测试bean,并将其事务属性设置为不受支持
。在此之后,池中的ManagedConnections
有1个活动处理程序。所以我放回了MyConnection.close()
行,连接池又开始工作了
我假设,在事务传播的情况下,发送连接\u CLOSED
事件是错误的。另外,我假设在单个事务的情况下,应该使用方法ManagedConnection.close()
,该方法发送CONNECTION\u CLOSED
事件。但对我来说似乎很奇怪,WebLogic不想清理ManagedConnections
,如果它们有负数的活动处理程序,就把它们放回pull
非常感谢您的帮助。如果您刚刚在
连接上调用close()
(如果已实现)该怎么办?基于连接的JCA API通常需要这样做。主题外,但您可以省略@TransactionManagement
,最有可能的是mappedName
。第一个是默认的,第二个很少需要。我没有实现close()
方法。这个方法应该做什么?我在JCA文件适配器示例中看到了close方法,该方法只向侦听器发送CONNECTION\u CLOSED
事件,但WebLogic不等待事件。。。顺便说一句,我完全同意你关于mappedName
和@TransactionManagement
属性的看法。