如何让这个定时器服务类处理“预定时间的变化”?

示例代码:

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

我只想创建一个计时器服务,通过取消以前的计划(如果设置了新计划),可以处理其超时计划的更改。 就我而言,我无法弄清楚如何在EJB 3.1中这样做,特别是因为我是这个框架的新手。 我们将非常感谢您的帮助。 :d

我想要这样的东西:

EBlastScheduler ebs = new EBlastScheduler(ScheduleExpression sExp); //这行代码必须将调度程序的当前计划时间更改为新设置的时间。

注意:

我想远程访问这个类; 并且通过将新计划作为参数传递,此类必须相应地更改其超时。

您可以拥有无​​状态bean,它可以用作管理系统中计时器的实用程序。 它将负责对它们执行操作 – 创建/取消计时器。

目的是将计时器操作与启动类分离,然后您可以在特定时间点修改它们。

但是必须在EBlastScheduler (它是一个启动bean)之前初始化实用程序bean,因为必须使用注释@DependsOn("TimerUtilityBean")对其进行注释。

下面是示例代码,可能需要一些修改。

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

现在,您可以使用TimerUtilityBean从应用程序中的任何位置管理计时器。 可以远程访问它并且能够传递新的计划参数。

你可以做这样的事情(在一些在线搜索后找到这个代码)

 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(); } }