O EJB 3.1 @Schedule pode ser configurado fora do código do aplicativo?

Como posso configurar um intervalo de agendamento:

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

fora do código do aplicativo?

  1. Como posso configurá-lo no ejb-jar.xml?
  2. Posso configurá-lo fora do aplicativo (tipo de arquivo de propriedades)?

Aqui está um exemplo de um agendamento no descritor de implantação:

   MessageService  ejb.MessageService Stateless   0/18 * *   showMessage    

Outra maneira de configurar timeres é com um agendamento programático.

 @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"); } } 

De acordo com a especificação EJB 3.1, os timeres automáticos podem ser configurados por meio de annotations ou por meio do descritor de implementação ejb-jar.xml .

18.2.2 Criação automática de timer

O Serviço de Timer suporta a criação automática de um timer baseado em metadados na class do bean ou no descritor de implementação . Isso permite que o desenvolvedor do bean agende um timer sem depender de uma chamada de bean para invocar programaticamente um dos methods de criação do timer do Serviço de Timer. Timers criados automaticamente são criados pelo contêiner como resultado da implantação do aplicativo.

E meu entendimento do esquema do descritor de implementação XLM é que você o define usando um elemento dentro de um elemento .

  

Veja a definição do tipo complexo timerType para os detalhes (em particular os elementos schedule e timeout-method ).

Referências

  • Especificação EJB 3.1
    • Seção 18.2.2 “Criação Automática de Temporizadores”
    • Seção 19.5 “Esquema XML do Descritor de Implementação” (p. 580, p583-p584)
  1. ejb-jar.xml

Para mim, a variante ejb-jar.xml começou a funcionar no TomEE, apenas eu passo o parâmetro javax.ejb.Timer no método timeout:

  AppTimerService my.app.AppTimerService Singleton   */10 * *   timeout  javax.ejb.Timer    

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

Obrigado https://blogs.oracle.com/arungupta/entry/totd_146_understanding_the_ejb post.

  1. Variante do arquivo de propriedades

Você pode ler o arquivo .properties e criar programaticamente o 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); 

Mas não consigo encontrar, podemos usar expressões cron no EJB.

    Intereting Posts