Java JCA ManagedConnection生命周期

Java JCA ManagedConnection生命周期,java,weblogic,jca,Java,Weblogic,Jca,目前,我开发了一个JCA出站适配器(带有LocalTransaction支持),在连接管理方面遇到了一些问题。我的适配器工作正常,只是服务器(WebLogic 12c)没有将ManagedConnections放回池中。根据JavaDoc,服务器必须调用ManagedConnection.cleanup()来重新初始化连接并将其放回池中,但它不会 当我从EJB使用适配器时,服务器创建一个新的ManagedConnection,开始一个新事务,提交它,但不调用ManagedConnection.c

目前,我开发了一个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次调用后,我得到以下结果:

获得初始上下文 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仍然不希望将连接放回池。目前,我在日志中获得以下事件:

  • 本地\u事务\u已启动
  • 连接已关闭
  • 本地\u事务\u已提交
  • 这对我来说很好(CONNECTION\u CLOSED事件意味着应用程序关闭了发送此事件的连接,我添加了close方法)。提交成功,没有出现异常。似乎我已经按正确的顺序发送了事件(早期的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
    属性的看法。