Como fazer com que essa class de serviço de timer manipule a “alteração no horário programado”?

Código de amostra:

@Singleton @Startup public class EBlastScheduler { @Resource TimerService timerService; EBlastScheduler what = new EBlastScheduler(); @PostConstruct public void initialize(){ if (timerService.getTimers() != null) { for (Timer timer : timerService.getTimers()) { if (timer.getInfo().equals("EBlastScheduler")){ timer.cancel(); } } } ScheduleExpression expression = new ScheduleExpression(); expression.second("*/1").minute("*").hour("*"); timerService.createCalendarTimer(expression); } @Timeout public void execute(Timer timer){ System.out.println("----Invoked: " + System.currentTimeMillis()); } } 

Eu só queria fazer um serviço de timer que pode lidar com a mudança no cronograma de seu tempo limite, cancelando o agendamento anterior, se o novo está definido. No meu caso, não consigo descobrir como fazer isso no EJB 3.1, especialmente porque sou novo nesse framework. Sua ajuda será muito apreciada. : D

Eu quero algo assim:

EBlastScheduler ebs = new EBlastScheduler (ScheduleExpression sExp); // esta linha de código deve alterar a hora atual planejada do agendador para a hora recém-definida.

NOTA:

Eu queria acessar essa class remotamente; e passando novo agendamento como parâmetro / s, essa class deve alterar seu tempo limite de acordo.

Você pode ter um bean sem estado, que pode ser usado como um utilitário para gerenciar timeres no sistema. Ele será responsável por executar operações neles – criar / cancelar timeres.

O objective é dissociar as operações do timer da class de boot, então você pode modificá-las em um determinado ponto do tempo.

Mas o bean de utilitários deve ser inicializado antes do EBlastScheduler , que é um bean de boot, para que você tenha que anotá-lo com a anotação @DependsOn("TimerUtilityBean") .

Abaixo está o código de amostra, pode precisar de algumas modificações.

EBlastScheduler.java

 @Singleton @Startup @DependsOn("TimerUtilityBean") public class EBlastScheduler { @EJB TimerUtilityBean timerBean; @PostConstruct public void initialize(){ timerBean.cancelTimer("EBlastScheduler"); timerBean.createTimer("*/1", "*", "*"); } } 

TimerUtilityBean.java

  @Stateless public class TimerUtilityBean { @Resource TimerService timerService; public void createTimer(String sec, String min, String hour){ ScheduleExpression expression = new ScheduleExpression(); expression.second(sec).minute(min).hour(hour); timerService.createCalendarTimer(expression); } public void cancelTimer(String timerInfo){ if (timerService.getTimers() != null) { for (Timer timer : timerService.getTimers()) if (timer.getInfo().equals(timerInfo)) timer.cancel(); } } @Timeout public void execute(Timer timer){ System.out.println("Invoked: " + System.currentTimeMillis()); } public void reinitializeTimer(String sec, String min, String hour, String timerInfo){ cancelTimer(timerInfo); createTimer(sec, min, hour); } } 

Agora, você pode usar o TimerUtilityBean para gerenciar timers de qualquer lugar dentro do aplicativo. Pode acessá-lo remotamente e será capaz de passar novos parâmetros de programação.

você pode fazer algo assim (encontrou este código depois de alguma pesquisa online)

 package com.test.scheduler; import java.io.Serializable; import java.util.Date; import javax.annotation.Resource; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.TimerService; import org.jboss.seam.annotations.Name; @Stateless @Name("pingImpl") public class PingImpl implements PingLocal, PingRemote, Serializable { private static final long serialVersionUID = 1105969164226368956L; @Resource SessionContext sessionContext; private static final String name = "Ping"; public void doAction() { Long schedule = new Long(5000); //new timeout... TimerService timerService = sessionContext.getTimerService(); System.out.println("++++ Initialize: AppTimers"); removeTimer(); System.out.println("Re-initialize Timers: Setting new timer : " + name); timerService.createTimer(new Date(System.currentTimeMillis()+schedule), schedule, name); System.out.println("++++ Initialize: Completed"); } public void removeTimer() { TimerService timerService = sessionContext.getTimerService(); for (Object obj : timerService.getTimers()) { javax.ejb.Timer timer = (javax.ejb.Timer) obj; String scheduled = (String) timer.getInfo(); System.out.println("-> Timer Found : " + scheduled); if (scheduled.equals(name)) { System.out.println("-> Removing old timer : " + scheduled); timer.cancel(); } } } @Timeout public void timeout(javax.ejb.Timer timer) { System.out.println("Timed event called: " + name); doAction(); } }