GlassFish随机选择错误的JCA ConnectionFactory进行注入

时间:2014-05-26 15:45:43

标签: java glassfish glassfish-4 jca

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

所以,问题:

  • 如何修复此问题并使Glassfish注入正确的类?这可能是由我的代码中的问题引起的,还是这是一个Glassfish问题?
  • 根据规范,RA具有多个ConnectionDefinition注释以及实现ManagedConnectionFactory的类的多个实例是合法的;但我无法找到有关在同一资源适配器中实现ManagedConnectionFactory的多个不同类的任何信息。 Glassfish显然似乎有问题 - 这是明确允许还是不允许的?

ConnectionDefinition(SFTP替换为SFTP的FTP):

@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;

1 个答案:

答案 0 :(得分:0)

TL; DR:这是由配置不正确的连接池引起的,其中connection-definition-name未指向实现ConnectionFactory的类。观察到的行为是IMO的一个错误,并且已经报告here


在尝试使用Adam Biens connectorz文件系统资源适配器(通过添加第二组类和另一个连接定义)重现此问题时,我发现如果connector-connection-pool in {},我只能重现该行为domain.xml的定义不正确:如果我将connection-definition-name更改为指向不存在的类,Glassfish将随机选择两个定义的连接器之一。双重检查我的连接池,我发现我错误地使用了Connection类而不是xml中的ConnectionFactory类。因此,当该属性未指向实现ConnectionFactory接口的类时,Glassfish似乎会从资源适配器中随机选择实现ConnectionFactory的任何类,甚至不会打印错误消息。