Можно ли настроить EJB 3.1 @Schedule вне кода приложения? - PullRequest
22 голосов
/ 17 октября 2010

Как настроить интервалы расписания:

@Schedule(persistent=true, minute="*", second="*/5", hour="*")

вне кода приложения?

  1. Как я могу настроить его в ejb-jar.xml?
  2. Можно ли настроить его вне приложения (тип файла свойств)?

Ответы [ 3 ]

18 голосов
/ 07 марта 2011

Вот пример планирования в дескрипторе развертывания:

    <session>
         <ejb-name>MessageService</ejb-name>
         <local-bean/>
         <ejb-class>ejb.MessageService</ejb-class>
         <session-type>Stateless</session-type>
         <timer>
            <schedule>
                <second>0/18</second>
                <minute>*</minute>
                <hour>*</hour>
            </schedule>
            <timeout-method>
                <method-name>showMessage</method-name>
            </timeout-method>
         </timer>
    </session>

Другой способ настройки таймеров - с помощью программного планирования.

@Singleton
@Startup
public class TimedBean{
    @Resource
    private TimerService service;

    @PostConstruct
    public void init(){
        ScheduleExpression exp=new ScheduleExpression();
        exp.hour("*")
            .minute("*")
            .second("*/10");
        service.createCalendarTimer(exp);
    }

    @Timeout
    public void timeOut(){
        System.out.println(new Date());
        System.out.println("time out");
    }

}
9 голосов
/ 17 октября 2010

В соответствии со спецификацией EJB 3.1 автоматические таймеры можно настроить с помощью аннотаций или дескриптора развертывания ejb-jar.xml.

18.2.2 Автоматическое создание таймера

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

И мое понимание схемы XLM дескриптора развертывания состоит в том, что вы определяете ее, используя элемент <timer> внутри элемента <session>.

<xsd:element name="timer"
             type="javaee:timerType"
             minOccurs="0"
             maxOccurs="unbounded"/>

Подробности см. В определении комплексного типа timerType (в частности, элементов schedule и timeout-method).

Ссылки

  • EJB 3.1 Технические характеристики
    • Раздел 18.2.2 «Автоматическое создание таймера»
    • Раздел 19.5 «XML-схема дескриптора развертывания» (стр. 580, p583-p584)
0 голосов
/ 23 июня 2015
  1. ejb-jar.xml

Для меня вариант ejb-jar.xml начал работать только на TomEE. Я передаю параметр javax.ejb.Timer в методе тайм-аута:

<session>
  <ejb-name>AppTimerService</ejb-name>
  <ejb-class>my.app.AppTimerService</ejb-class>
  <session-type>Singleton</session-type>
  <timer>
    <schedule>
      <second>*/10</second>
      <minute>*</minute>
      <hour>*</hour>
    </schedule>
    <timeout-method>
      <method-name>timeout</method-name>
      <method-params>
        <method-param>javax.ejb.Timer</method-param>
      </method-params>
   </timeout-method>
 </timer>

public class AppTimerService {
    public void timeout(Timer timer) {
        System.out.println("[in timeout method]");
    }
}

Спасибо https://blogs.oracle.com/arungupta/entry/totd_146_understanding_the_ejb сообщение.

Вариант файла свойств

Вы можете прочитать файл .properties и программно создать Timer

ScheduleExpression schedule = new ScheduleExpression();
schedule.hour(hourProperty);//previously read property from .properties file
schedule.minute(minuteProperty);//previously read property from .properties file
Timer timer = timerService.createCalendarTimer(schedule);

Но я не могу найти, можем ли мы использовать выражения cron в EJB.

...