Поиск JNDI с @Resource без имени или атрибута поиска - PullRequest
0 голосов
/ 04 июля 2018

Я видел следующий код в приложении Java EE, развернутом в Payara:

public class MyClass {
    @Resource
    ManagedScheduledExecutorService scheduler;

    <...>
}

Это было приложение с поддержкой CDI, если это имеет значение. В Payara существует ресурс для ManagedScheduledExecutorService с именем JNDI concurrent/__defaultManagedScheduledExecutorService и логическим именем JNDI java:comp/DefaultManagedScheduledExecutorService.

Имя ресурса JNDI создается из имени класса и поля. Это не будет соответствовать именам выше.

Мое понимание внедрения ресурсов до сих пор заключалось в том, что вы используете атрибут поиска для ссылки на существующую запись JNDI исключительно по имени. Но, как вы можете видеть, атрибут не используется, и он все еще работает.

Почему? Существует ли какой-то механизм отката, специфичный для контейнера, или некоторые спецификации Java определяют это поведение?

1 Ответ

0 голосов
/ 05 июля 2018

Действительно, «некоторые спецификации Java определяют это поведение».

Фактически, §EE.5.21. Объекты утилит параллелизма по умолчанию в спецификациях Java EE 7/8 дают именно такое определение:

Поставщик продуктов Java EE должен сделать утилиты параллелизма по умолчанию для объектов Java EE доступными для приложения под следующими именами JNDI:

  • java:comp/DefaultManagedExecutorService для предварительно сконфигурированной службы управляемого исполнителя
  • java:comp/DefaultManagedScheduledExecutorService для предварительно настроенной службы управляемого запланированного исполнителя
  • java:comp/DefaultManagedThreadFactory для предварительно сконфигурированной фабрики управляемых потоков
  • java:comp/DefaultContextService для предварительно сконфигурированной контекстной службы

Поставщик прикладных компонентов или Deployer может явно связать ссылку на ресурс с объектом утилит параллелизма по умолчанию, используя элемент lookup аннотации Resource или элемент lookup-name элемента desourceor развертывания resource-ref. Например,

@Resource(name="myManagedExecutorService, 
          lookup="java:comp/DefaultManagedExecutorService")
ManagedExecutorService myManagedExecutorService;`  

При отсутствии такой привязки сопоставление ссылки по умолчанию будет соответствовать службе по умолчанию для управляемого исполнителя продукта.

...