/*
* Copyright (c) 2015 Felix Husse under MIT License
* see LICENSE file
*/
package de.fatalix.bookery.bl.background;
import de.fatalix.bookery.bl.dao.BatchJobConfigurationDAO;
import de.fatalix.bookery.bl.model.BatchJobConfiguration;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import javax.ejb.ScheduleExpression;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.inject.Inject;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.log4j.Logger;
/**
*
* @author felix.husse
*/
@Stateless
public class BatchJobService {
@Resource
private TimerService timerService; //Resource Injection
@Inject private Logger logger;
@Inject private BatchJobConfigurationDAO batchJobConfigurationDAO;
@Timeout
public void timeout(Timer timer) {
try {
logger.debug("Executing Timer ");
BatchJobConfiguration jobConfig = (BatchJobConfiguration)timer.getInfo();
logger.debug("Executing Batch Job " + jobConfig.getType().getDisplayName());
BatchJobInterface batchJob = (BatchJobInterface)InitialContext.doLookup(jobConfig.getType().getModuleName());
batchJob.executeJob(timer); //Asynchronous method
} catch(NamingException ex) {
logger.error(ex,ex);
}
}
public BatchJobConfiguration saveJob(BatchJobConfiguration batchJobConfiguration) {
BatchJobConfiguration result = batchJobConfigurationDAO.save(batchJobConfiguration);
result = fireUpTimer(result);
return result;
}
public BatchJobConfiguration updateJob(BatchJobConfiguration batchJobConfiguration) {
Timer timer = getTimer(batchJobConfiguration);
if (timer != null) {
BatchJobConfiguration jobConfig = (BatchJobConfiguration)timer.getInfo();
logger.debug("Canceling Timer " + jobConfig.getType().getDisplayName());
timer.cancel();
}
BatchJobConfiguration result = batchJobConfigurationDAO.update(batchJobConfiguration);
result = fireUpTimer(result);
return result;
}
public void deleteJob(BatchJobConfiguration batchJobConfiguration) {
Timer timer = getTimer(batchJobConfiguration);
if (timer != null) {
BatchJobConfiguration jobConfig = (BatchJobConfiguration)timer.getInfo();
logger.debug("Delete Timer " + jobConfig.getType().getDisplayName());
timer.cancel();
}
batchJobConfigurationDAO.delete(batchJobConfiguration.getId());
}
public void cancelJob(BatchJobConfiguration batchJobConfiguration) {
Timer timer = getTimer(batchJobConfiguration);
if (timer != null) {
BatchJobConfiguration jobConfig = (BatchJobConfiguration)timer.getInfo();
logger.debug("Canceling Timer " + jobConfig.getType().getDisplayName());
timer.cancel();
}
batchJobConfiguration.setActive(false);
batchJobConfigurationDAO.update(batchJobConfiguration);
}
public List<BatchJobConfiguration> getAllJobs() {
List<BatchJobConfiguration> jobConfigs = batchJobConfigurationDAO.findAll();
for (BatchJobConfiguration config : jobConfigs) {
Timer timer = getTimer(config);
if (timer!=null) {
config.setNextTimeout(timer.getNextTimeout());
config = batchJobConfigurationDAO.update(config);
}
}
return jobConfigs;
}
public BatchJobConfiguration fireUpTimer(BatchJobConfiguration jobConfig) {
if (jobConfig.isActive()) {
logger.debug("Configured batch job " + jobConfig.getType().getDisplayName());
TimerConfig timerConf = new TimerConfig(jobConfig, false);
String[] splittedCronJob = jobConfig.getCronJobExpression().split(" ");
ScheduleExpression schedExp = new ScheduleExpression();
schedExp.second(splittedCronJob[0]);
schedExp.minute(splittedCronJob[1]);
schedExp.hour(splittedCronJob[2]);
schedExp.dayOfMonth(splittedCronJob[3]);
schedExp.month(splittedCronJob[4]);
schedExp.year(splittedCronJob[5]);
schedExp.dayOfWeek(splittedCronJob[6]);
Timer timer = timerService.createCalendarTimer(schedExp, timerConf);
jobConfig.setNextTimeout(timer.getNextTimeout());
jobConfig = batchJobConfigurationDAO.update(jobConfig);
}
return jobConfig;
}
private Timer getTimer(BatchJobConfiguration jobConfig) {
Collection<Timer> timers = timerService.getTimers();
for(Timer timer : timers) {
BatchJobConfiguration config = (BatchJobConfiguration)timer.getInfo();
if (Objects.equals(config.getId(), jobConfig.getId())) {
return timer;
}
}
return null;
}
public Collection<Timer> getAllTimer() {
return timerService.getTimers();
}
}