示例代码:
@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); // 这行代码必须将调度程序的当前调度时间更改为新设置的 时间。
注意:
我想远程访问这个类;通过新的 调度为参数/ s,此类必须更改其超时 相应
答案 0 :(得分:7)
您可以拥有无状态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
从应用程序中的任何位置管理计时器。可以远程访问它&amp;将能够传递新的计划参数。
答案 1 :(得分:1)
你可以做这样的事情(在一些在线搜索后找到这个代码)
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();
}
}