0

我正在为 FTP 和 SFTP 编写 JCA 资源适配器。由于我的目标是能够使用一种完全独立于另一种协议的协议,因此我有两个不同的 ManagedConnectionFactory 类,每个协议一个。两者都有不同的 ConnectionDefinition 注释;Glassfish domain.xml 包含 FTP 适配器的资源定义,但不包含 SFTP 适配器的资源定义。现在,当我将 注入FTPConnectionFactoryEJB 时,有时会收到 InjectionException,因为 WELD 会尝试注入SFTPConnectionFactory(这在应用服务器运行期间当然是一致的;我始终得到正确的或错误的)。删除 SFTP 适配器的 ConnectionDefinition 注释似乎可以解决问题。

所以,问题:

  • 我该如何解决这个问题并让 Glassfish 注入正确的类?这可能是由我的代码中的问题引起的,还是 Glassfish 问题?
  • 根据规范,RA 具有多个 ConnectionDefinition 注释以及实现 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 connectorz文件系统资源适配器重现此问题时(通过添加第二组类和另一个连接定义),我发现只有connector-connection-pool在 domain.xml 中的定义不正确时才能重现该行为:如果我更改了connection-definition-name为了指向一个不存在的类,Glassfish 会随机选取两个定义的连接器之一。仔细检查我的连接池,我发现我错误地使用了 Connection 类而不是 xml 中的 ConnectionFactory 类。因此,当属性不指向实现ConnectionFactory接口的类时,Glassfish 似乎会从实现的资源适配器中随机选择任何类ConnectionFactory,甚至不会打印错误消息。

于 2014-05-28T12:01:04.993 回答