Как заставить этот класс обслуживания таймера обрабатывать «изменение запланированного времени»? - PullRequest
3 голосов
/ 04 ноября 2011

Пример кода:

@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 = новый EBlastScheduler (ScheduleExpression sExp); // эта строка кода должна изменить текущее запланированное время планировщика на вновь установленное время.

Примечание:

Я хотел получить удаленный доступ к этому классу; и передавая новый планировать как параметр / с, этот класс должен изменить свое время ожидания соответственно.

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Вы можете иметь компонент без состояния, который можно использовать в качестве утилиты для управления таймерами в системе. Он будет отвечать за выполнение операций над ними - создавать / отменять таймеры.

Цель состоит в том, чтобы отделить операции таймера от класса запуска, а затем изменить их в определенный момент времени.

Но служебный бин должен быть инициализирован до EBlastScheduler, который является стартовым бином, для этого вы должны аннотировать его аннотацией @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 для управления таймерами из любого места в приложении. Может получить к нему удаленный доступ и сможет передавать новые параметры расписания.

1 голос
/ 04 ноября 2011

вы можете сделать что-то вроде этого (нашел этот код после некоторого онлайн-поиска)

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