package fi.arcusys.koku.common.soa; import javax.ejb.Stateless; import javax.jws.WebService; import javax.naming.InitialContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import fi.arcusys.koku.common.service.ScheduledTaskExecutor; /** * Service implementation for calling all registered scheduled tasks executors. Service should be called by external scheduler. * * @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi) * Dec 21, 2011 */ @Stateless @WebService(serviceName = "KokuScheduledTasksService", portName = "KokuScheduledTasksServicePort", endpointInterface = "fi.arcusys.koku.common.soa.KokuScheduledTasksService", targetNamespace = "http://soa.common.koku.arcusys.fi/") public class KokuScheduledTasksServiceImpl implements KokuScheduledTasksService { private static final Logger logger = LoggerFactory.getLogger(KokuScheduledTasksServiceImpl.class); private String scheduledTaskNames = "arcusys-koku-0.1-SNAPSHOT/MessageServiceFacadeImpl/local-fi.arcusys.koku.common.service.ScheduledTaskExecutor"; private String skipProcessingJndiKey = "koku/arcusys-common/skip-scheduled-tasks"; /** * */ @Override public void perform() { if (skipProcessing()) { logger.info("Execution of scheduled processes is explicitly disabled. Skipping execution."); return; } for (final String taskExecutorJndiName : scheduledTaskNames.split(";")) { processSingleTask(taskExecutorJndiName.trim()); } } /** * @return */ private boolean skipProcessing() { try { final InitialContext ctx = new InitialContext(); try { final String skipProcessing = (String)ctx.lookup(skipProcessingJndiKey); return Boolean.parseBoolean(skipProcessing); } finally { ctx.close(); } } catch(javax.naming.NamingException e) { logger.error(e.getMessage()); } return false; } private void processSingleTask(final String taskExecutorJndiName) { try { final InitialContext ctx = new InitialContext(); try { logger.info("Start scheduled task processing: " + taskExecutorJndiName); final ScheduledTaskExecutor taskExecutor = (ScheduledTaskExecutor)ctx.lookup(taskExecutorJndiName); final long startTime = System.currentTimeMillis(); taskExecutor.performTask(); final long endTime = System.currentTimeMillis(); logger.info("Task [" + taskExecutor.getTaskDescription() + "], processing finished in: " + (endTime - startTime) + "ms" ); } finally { ctx.close(); } } catch(javax.naming.NamingException e) { logger.error(e.getMessage()); } } }