2012-03-20 10 views
1

現在、私は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は接続をプールに戻したくありません。現在、私は、ログ内のイベントを以下の取得:

  1. LOCAL_TRANSACTION_STARTED
  2. CONNECTION_CLOSED

をLOCAL_TRANSACTION_COMMITTEDそれが私のために正常に見える(CONNECTION_CLOSEDイベントは、アプリケーションが接続を閉じた状態を意味し、私がいることを、closeメソッドを追加しましたこのイベントを送信します)。コミットは成功し、例外は表示されません。正しい順序でイベントを送信したようですが(以前のWebLogicではExceptionsがスローされていましたが、現在は停止しています)、サーバーはまだ接続をプールに戻しません。

私は混乱しています。

+0

'connection'(実装されている場合)で' close() 'を呼び出しただけではどうですか?コネクションベースのJCA APIは、通常これを必要とします。トピックをオフにすることができますが、 '@ TransactionManagement'と、おそらく' mappedName'を省略することができます。最初はデフォルトであり、2番目はほとんど必要ありません。 –

+0

私は 'close()'メソッドを実装していません。この方法は何をすべきか?私はJCAファイルアダプタの例ではcloseメソッドを見てきましたが、このメソッドはリスナーに 'CONNECTION_CLOSED'イベントを送りますが、WebLogicはイベントを待つことはありません... BTW、' mappedName'と '@TransactionManagement '属性です。 – gkuzmin

答えて

1

私はこの問題を非難したようです。 WebLogicコンソールを見ると、ManagedConnectionインスタンスに-1アクティブハンドラがあることがわかりました。だから、MyConnection.close()メソッド呼び出しをコメントすることにしました。これをCONNECTION_CLOSEDイベントを送信するテストBeanに追加しました。このチャージが行われた後、接続プーリングはうまく動作し始めました。テストBeanを変更してトランザクション属性をNOT_SUPPORTEDに設定しようとしました。その後、プール内のManagedConnectionsには1つのアクティブハンドラがありました。そこで、私はMyConnection.close()行を戻して、接続プーリングが再び開始されます。

トランザクションの伝播の場合、CONNECTION_CLOSEDイベントの送信が間違っているとします。また、CONNECTION_CLOSEDイベントを送信するメソッドManagedConnection.close()は、単一のトランザクションの場合に使用する必要があります。しかし、WebLogicはManagedConnectionsをクリーンアップして、アクティブハンドラが負の数であれば元の状態に戻すことを望まないことは私にとっては奇妙なことです。

ありがとうございました。

+0

+1努力してください!問題は暗いことがあります。 – ewernli