EJB3创建Timer

最近因为工作需要,要和其他的接口通过数据库来做mapping.通过一个timer不断的去轮询这些表.

time service参考url:

http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html


1.轮询timer的配置,默认设为1分钟一次.

<ScheduleExp>
	<enabled>True</enabled>
	<hour>*</hour>
	<minute>*</minute>
	<second>0</second>
	<month>*</month>
	<year>*</year>
	<timezone>Asia/Singapore</timezone>
	<dayOfMonth>*</dayOfMonth>
	<dayOfWeek>*</dayOfWeek>
</ScheduleExp>

如果通配符是"*"表示所有时间都可匹配.

如果时间是0表示该时间必须是0.

比如上面配置把second设为0,其他都为*,表示是其他时间都可以任意匹配,但秒必须等于0.就是说每分钟执行的意思.


2.调用TimerService创建timer.

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicLong;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.DependsOn;
import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Singleton
@Lock(LockType.READ)
@DependsOn("EntCedaBasicDataSingleton")
@TransactionManagement(TransactionManagementType.CONTAINER)
@Interceptors(HpPerformanceMonitor.class)
@Startup
public class HpUfisAppTimer {

    private static final Logger LOG = LoggerFactory.getLogger(HpUfisAppTimer.class);
    @Resource
    private TimerService timerService;
    @EJB
    private IPtsInstanceFacadeLocal _ptsInstanceFacade;
    @EJB
    private IFltTimingTimeFacadeRemote _fltTimingTimeFacade;
    @EJB
    private EntDbMonitorBean _dbMonitorBean;
    private AtomicLong _dbMonitorCount = new AtomicLong();
    private HashMap<String, EntTimers> _timerTimes = new HashMap<>();
    @EJB
    private EntCedaBasicDataSingleton _basicDataSingleton;
    @EJB
    private EntPtsInstanceDTOSingleton _ptsInstanceDTOSingleton;

    @PostConstruct
    private void construct() {

        // create timers
        createTimers();
    }

    @PreDestroy
    public void initClear() {
        LOG.info("Clear Timers ");
        for (Object obj : timerService.getTimers()) {
            Timer t = (Timer) obj;
            t.cancel();
        }
    }

    public void createTimers() {
        List<EntTimers> timers = _basicDataSingleton.getTimers();
        for (Iterator<EntTimers> it = timers.iterator(); it.hasNext();) {
            EntTimers entTimers = it.next();
            //Enable the timer
            if (_timerTimes.get(entTimers.getTimerName()) == null && entTimers.getIsEnabled().equalsIgnoreCase("True")) {
                final TimerConfig tmpTimer = new TimerConfig(entTimers.getTimerName(), false);
                //创建timer
                timerService.createCalendarTimer(entTimers.getSchedule(), tmpTimer);
                _timerTimes.put(entTimers.getTimerName(), entTimers);
                LOG.info("Timer {} created {} ", entTimers.getTimerName(), entTimers.getSchedule().toString());
                //Disable the timer
            } else if (_timerTimes.get(entTimers.getTimerName()) != null && entTimers.getIsEnabled().equalsIgnoreCase("False")) {
                 //停止timer
                 stopTimer(entTimers.getTimerName());
                _timerTimes.remove(entTimers.getTimerName());
                LOG.info("Timer {} removed {} ", entTimers.getTimerName(), entTimers.getSchedule().toString());
                //Recreate the timer
            } else if (_timerTimes.get(entTimers.getTimerName()) != null) {
                //重启timer
                stopTimer(entTimers.getTimerName());
                final TimerConfig tmpTimer = new TimerConfig(entTimers.getTimerName(), false);
                timerService.createCalendarTimer(entTimers.getSchedule(), tmpTimer);
                LOG.info("Timer {} recreated {} ", entTimers.getTimerName(), entTimers.getSchedule().toString());
            }

        }


    }

    public void stopTimer(String timerName) {
        for (Object obj : timerService.getTimers()) {
            Timer t = (Timer) obj;
            if (t.getInfo().equals(timerName)) {
                t.cancel();
            }
        }

    }

    @Timeout
    public void timeout(Timer timer) {
        EntTimers entTimer = _timerTimes.get(timer.getInfo());
        //通过timer调用不同的功能
        genericTimer(entTimer);
    }

    @Lock(LockType.WRITE)
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    synchronized private void genericTimer(EntTimers entTimer) {
        try {
            TimeZone tz = TimeZone.getTimeZone(entTimer.getFilterTimeZone());

            HpUfisCalendar fromDate = new HpUfisCalendar(tz);
            HpUfisCalendar toDate = new HpUfisCalendar(tz);
            HpUfisCalendar uDate = null;
            String uDateStr = "";

            fromDate.DateAdd(Integer.parseInt(entTimer.getFrom()), EnumTimeInterval.Hours);
            toDate.DateAdd(Integer.parseInt(entTimer.getTo()), EnumTimeInterval.Hours);

            // Last Time it was ecexuted (exclude schedule timer)
            if (entTimer.getTimesExecuted() > 0) {
            	uDate = new HpUfisCalendar(entTimer.getLastExecuted());
            	uDate.setTimeZone(tz);
            } 

            /**
             * Timer: only process the latest update record
             *
             * Schedule Timer: process the record within the time range
             */
            switch (entTimer.getTimerName()) {
                case "ptsTimingTimer":
                	//调用其他class监控需要用的表
                default:
                    LOG.info("Please check the timer configuration file to make sure the timer can start correctly.");
                    break;
            }
        } catch (HpServiceException ex) {
            LOG.debug(ex.getMessage());
        }
    }


    public void clearExpiredInstanceCache() {
        Object duration = _basicDataSingleton.getCacheExpiryMap().get("PtsInstanceDTO");
        if (duration != null) {
            _ptsInstanceDTOSingleton.removeExpiredCache(Integer.parseInt(duration.toString()));
        }
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值