現在、私はJCAアウトバウンドアダプタ(LocalTransactionサポート付き)を開発しましたが、接続管理にいくつか問題があります。サーバ(WebLogic 12c)がManagedConnectionをプールに戻さないことを除いて、アダプタはうまく動作します。 JavaDocによると、サーバーはManagedConnection.cleanup()
を呼び出して接続を再初期化し、プールに戻す必要がありますが、接続は戻されません。JCA ManagedConnectionライフサイクル
EJBからアダプタを使用すると、サーバは新しいManagedConnectionを作成し、新しいトランザクションを開始し、コミットしますが、ManagedConnection.cleanup()
メソッドを呼び出さず、プールに戻しません。私は、次の取得10回の呼び出し後
@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));
}
}
:EJB例外:
は、初期コンテキスト にjavax.ejb.EJBExceptionを手に入れたあなたは私のテストBeanを見ることができます以下
。入れ子になっている例外は次のとおりです。 java.lang.RuntimeException:javax.resource.spi.ApplicationServerInternalException:pool = "eis/myJCA"、weblogic.common.resourcepool.ResourceLimitExceptionの接続を取得できません:プールeis/myJCAに到達したリソースを待つことができるスレッドの数
気づいたように、呼び出すたびに新しいトランザクション(REQUIRES_NEW
属性)が使用されます。サーバーは新しいManagedConnectionインスタンスを最初に10回作成してから、接続プールが最大容量に達します。
ログをトレースして、ManagedConnection.cleanup()
の単一コールが発生せず、プール内のすべての接続がビジー状態であることは明らかです。私は、JCA仕様を読んで、アダプタがコールバック関数を使用してリスナーにライフサイクル・イベントを送ることができることを発見したが、これらのイベントリスナーのコールバックを使用しようとすると、新しい例外で終了しました:
にjavax.ejb.EJBException:BEA1 -001471C1E76DE5A4E067;weblogic.transaction.nonxa.NonXAException:java.lang.IllegalStateException:[Connector:199175]このManagedConnectionは、トランザクション動作のためにコンテナによって管理され、コンテナによってJTAトランザクションに登録されています。アプリケーション/アダプタは、ローカルトランザクションbegin/commit/rollback APIを呼び出さないでください。アダプターからLOCAL_TRANSACTION_COMMITTEDイベントを拒否します。 javax.ejb.EJBException:EJB例外:;コンテナによってJTAトランザクションに登録されています。アプリケーション/アダプタは、ローカルトランザクションbegin/commit/rollback APIを呼び出さないでください。アダプタからイベントLOCAL_TRANSACTION_ROLLEDBACKを拒否します。
WebLogicはイベントを待っていないと思います(間違ったものを送信した可能性もあります)。
私は間違っていますか?サーバが接続をプールに戻す方法を教えてください。
UPD:私は、接続イベントがサーバーにとって非常に重要であることを発見しました。サーバーは、リスナーに送信されたイベント情報に基づいて、ManagedConnectionに登録する接続を管理します。アダプタでイベントをサポートしましたが、WebLogicは接続をプールに戻したくありません。現在、私は、ログ内のイベントを以下の取得:
- LOCAL_TRANSACTION_STARTED
- CONNECTION_CLOSED
をLOCAL_TRANSACTION_COMMITTEDそれが私のために正常に見える(CONNECTION_CLOSEDイベントは、アプリケーションが接続を閉じた状態を意味し、私がいることを、closeメソッドを追加しましたこのイベントを送信します)。コミットは成功し、例外は表示されません。正しい順序でイベントを送信したようですが(以前のWebLogicではExceptionsがスローされていましたが、現在は停止しています)、サーバーはまだ接続をプールに戻しません。
私は混乱しています。
'connection'(実装されている場合)で' close() 'を呼び出しただけではどうですか?コネクションベースのJCA APIは、通常これを必要とします。トピックをオフにすることができますが、 '@ TransactionManagement'と、おそらく' mappedName'を省略することができます。最初はデフォルトであり、2番目はほとんど必要ありません。 –
私は 'close()'メソッドを実装していません。この方法は何をすべきか?私はJCAファイルアダプタの例ではcloseメソッドを見てきましたが、このメソッドはリスナーに 'CONNECTION_CLOSED'イベントを送りますが、WebLogicはイベントを待つことはありません... BTW、' mappedName'と '@TransactionManagement '属性です。 – gkuzmin