最近因为工作需要,要和其他的接口通过数据库来做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()));
}
}
}