0

FTP および SFTP 用の JCA リソース アダプタを作成中です。私の目標は、1 つのプロトコルを他のプロトコルから完全に独立して使用できるようにすることなので、プロトコルごとに 1 つずつ、2 つの異なる ManagedConnectionFactory クラスがあります。どちらも異なる ConnectionDefinition アノテーションを持っています。Glassfish の domain.xml には、FTP アダプタのリソース定義が含まれていますが、SFTP アダプタのリソース定義は含まれていません。現在、FTPConnectionFactoryEJB に を注入すると、代わりに WELD が を注入しようとするため、InjectionException が発生することがありSFTPConnectionFactoryます (これはもちろん、アプリケーション サーバーの実行中に一貫しています。一貫して正しいものまたは間違ったものを取得します)。SFTP アダプターの ConnectionDefinition アノテーションを削除すると、問題が解決するようです。

だから、質問:

  • これを修正して、Glassfish に正しいクラスを注入させるにはどうすればよいですか? これは私のコードの問題が原因でしょうか?それとも Glassfish の問題ですか?
  • 仕様によると、RA が複数の ConnectionDefinition アノテーションと、ManagedConnectionFactory を実装するクラスの複数のインスタンスを持つことは合法です。しかし、同じリソース アダプタ内に複数の異なるクラスが ManagedConnectionFactory を実装しているという情報は見つかりませんでした。Glassfish には明らかに問題があるようです。これはどこかで明示的に許可または禁止されていますか?

ConnectionDefinition (SFTP の場合は FTP を SFTP に置き換え):

@ConnectionDefinition(connectionFactory = FTPConnectionFactory.class,
    connectionFactoryImpl = FTPConnectionFactoryImpl.class,
    connection = FTPConnection.class, connectionImpl = FTPConnectionImpl.class)

FTP と SFTP の Factory および ManagedConnection クラスは、共通の祖先を共有していますが、直接関連していません。ただし、実装を完全に分離しても違いがないため、これは問題ではないようです。

domain.xmlスニペット:

<resource-adapter-config resource-adapter-name="ftpconnector" thread-pool-ids="thread-pool-1" />
<connector-connection-pool name="jca/ftpConnectorPool"
    resource-adapter-name="ftpconnector"
    connection-definition-name="foo.bar.ftp.FTPConnection"
    transaction-support="NoTransaction" match-connections="false" />
<connector-resource pool-name="jca/ftpConnectorPool" jndi-name="jca/ftpConnector" />

そして注入されたフィールド:

@Resource(lookup = "jca/ftpConnector")
private FTPConnectionFactory ftpConnectionFactory;
4

1 に答える 1

0

TL;DR: これは、誤って構成された接続プールが原因でした。ここで、connection-definition-nameは を実装するクラスを指していませんConnectionFactory観察された動作は IMO バグであり、ここで報告されています。


Adam Biens connectorzconnector-connection-pool Filesystem Resource Adapter を使用してこの問題を再現しようとしているときに (クラスの 2 番目のセットと別の接続定義を追加することによって)、 domain.xml 内の が正しく定義されていない場合にのみ動作を再現できることがわかりました。connection-definition-name存在しないクラスを指す場合、Glassfish は定義された 2 つのコネクタのいずれかをランダムに使用します。接続プールを再確認したところ、xml で ConnectionFactory クラスではなく誤って Connection クラスを使用していたことがわかりました。そのため、属性がインターフェイスを実装するクラスを指していない場合ConnectionFactory、Glassfish はConnectionFactoryエラー メッセージを出力することなく、実装するリソース アダプタから任意のクラスをランダムに選択するように見えます。

于 2014-05-28T12:01:04.993 に答える