Как javax.ejb.TimerService (Glassfish 3.1.2.2) знаете, какой компонент необходимо выполнить?Как javax.ejb.TimerService знает, какой компонент будет вызывать?
В Java EE 6 tutorial мы узнаем, что мы можем определить функции обратного вызова таймера в бина:
@Timeout
public void timeout(Timer timer) {
System.out.println("TimerBean: timeout occurred");
}
Тогда мы можем планировать программные таймеры, как это:
@Resource
TimerService timerService;
...
// Sets a programmatic timer that will expire in 1 minute (6,000 milliseconds):
long duration = 6000;
Timer timer = timerService.createSingleActionTimer(duration, new TimerConfig());
Каким образом TimeService знать, какой bean позвонить? В компоненте может быть только один аннотированный метод, но как он узнает, какой bean-код для вызова? this
не является параметром createSingleActionTimer
.
Я проверяю исходный код Glassfish прямо сейчас, чтобы посмотреть на реализацию TimerService, но для меня это представляет интересный вопрос, поэтому я расскажу об этом здесь для получения экспертной оценки. – DavidS
При дальнейших размышлениях, вероятно, это получение ссылки на объект во время инъекции '@ Resource' из [InjectionPoint] (https://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/injection. html # d0e1624) объект. Я посмотрю, смогу ли я найти его в исходном коде, если эта проверка когда-либо закончится. – DavidS
История происхождения длинная и скучная, но это сводится к следующему: в контейнере DI ничто действительно не скрыто, и ничто не похоже на то, что кажется. Контейнер имеет более чем несколько механизмов для инъекций, и все они являются контекстно-зависимыми. Все в контейнере точно знает, где оно находится. Возьмите ['EJBContext'] (http://docs.oracle.com/javaee/6/api/javax/ejb/EJBContext.html), например: предоставление контекстной информации в EJB. Опять же, в контейнере ничего не скрывается. – kolossus