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

时间:2011-11-04 02:33:04

标签: java java-ee timer ejb ejb-3.1

示例代码:

@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,此类必须更改其超时   相应

2 个答案:

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