GlassFish случайным образом выбирает неверный JCA ConnectionFactory для инъекции

Я нахожусь в процессе написания адаптера ресурсов JCA для FTP и SFTP. Поскольку моя цель — иметь возможность использовать один протокол, полностью независимый от другого, у меня есть два разных класса ManagedConnectionFactory, по одному для каждого протокола. Оба имеют разные аннотации ConnectionDefinition; Домен Glassfish.xml содержит определение ресурса для адаптера FTP, но не для адаптера SFTP. Теперь, когда я внедряю FTPConnectionFactory в EJB, я иногда получаю InjectionException, так как WELD вместо этого пытается внедрить SFTPConnectionFactory (конечно, это согласуется во время работы сервера приложений; я постоянно получаю правильный или неправильный результат). Удаление аннотации ConnectionDefinition для адаптера SFTP, похоже, решает проблему.

Итак, Вопросы:

  • Как я могу исправить это и заставить Glassfish ввести правильный класс? Может ли это быть вызвано проблемой в моем коде или это проблема Glassfish?
  • Согласно спецификации, RA может иметь несколько аннотаций ConnectionDefinition, а также несколько экземпляров класса, реализующего ManagedConnectionFactory; но я не смог найти никакой информации о наличии нескольких разных классов, реализующих ManagedConnectionFactory внутри одного и того же адаптера ресурсов. У Glassfish явно есть проблемы с этим - это где-то явно разрешено или запрещено?

ConnectionDefinition (с заменой FTP на SFTP для случая 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;

person l4mpi    schedule 26.05.2014    source источник


Ответы (1)


TL;DR: это было вызвано неправильно настроенным пулом соединений, где connection-definition-name не указывает на класс, реализующий ConnectionFactory. Наблюдаемое поведение является ошибкой, о которой сообщалось здесь.


При попытке воспроизвести эту проблему с помощью connectorz адаптера ресурсов файловой системы Адама Биенса (путем добавления второго набора классов и другого определение соединения), я обнаружил, что могу воспроизвести поведение только в том случае, если connector-connection-pool в domain.xml определен неправильно: если я изменил connection-definition-name так, чтобы он указывал на несуществующий класс, Glassfish случайным образом выберет один из двух определенных соединителей. Дважды проверив свой пул соединений, я обнаружил, что по ошибке использовал класс Connection вместо класса ConnectionFactory в xml. Поэтому, когда атрибут не указывает на класс, реализующий интерфейс ConnectionFactory, кажется, что Glassfish случайным образом выбирает любой класс из адаптера ресурсов, который реализует ConnectionFactory, даже не выводя сообщение об ошибке.

person l4mpi    schedule 28.05.2014