/* * Copyright (C) 2010 - 2012 Interactive Media Management * Copyright (C) 2014 Allan Lykke Christensen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package dk.i2m.converge.ejb.services; import dk.i2m.converge.domain.SystemTimer; import dk.i2m.converge.ejb.facades.OutletFacadeLocal; import dk.i2m.converge.ejb.facades.SearchEngineLocal; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Resource; import javax.ejb.*; /** * Stateless session bean implementing the timer service of the system. * * @author Allan Lykke Christensen */ @Stateless public class TimerServiceBean implements TimerServiceLocal { private static final Logger LOG = Logger.getLogger(TimerServiceBean.class.getName()); @Resource private TimerService timerService; @EJB private ConfigurationServiceLocal cfgService; @EJB private NewswireServiceLocal newswireService; @EJB private OutletFacadeLocal outletFacade; @EJB private SearchEngineLocal searchEngineService; /** * {@inheritDoc} */ @Override public void startTimer(PeriodicTimer timer) { Calendar now = Calendar.getInstance(); now.set(Calendar.HOUR_OF_DAY, 0); now.set(Calendar.MINUTE, 0); now.set(Calendar.SECOND, 0); now.add(Calendar.DATE, -1); boolean foundTimer = false; for (Timer t : (Collection<Timer>) timerService.getTimers()) { if (t.getInfo().equals(timer.name())) { LOG.log(Level.INFO, "{0} is already active, next timeout on {1, date, d. MMMM} at {1, date, h:mm a}", new Object[]{timer.name(), t.getNextTimeout()}); foundTimer = true; } } if (!foundTimer) { String strReloadInterval = cfgService.getString(timer.interval()); Long reloadInterval = Long.valueOf(strReloadInterval) * 60L * 1000L; LOG.log(Level.INFO, "Starting timer [{0}] at {1} repeat every: {2} ms / {3} hrs / {4} mins ", new Object[]{timer.name(), now.getTime().toString(), reloadInterval, reloadInterval / 3600000L, reloadInterval / 60000L}); timerService.createTimer(now.getTime(), reloadInterval, timer.name()); } } /** * {@inheritDoc} */ @Override public void stopTimer(PeriodicTimer timer) { for (Timer t : (Collection<Timer>) timerService.getTimers()) { if (t.getInfo().equals(timer.name())) { LOG.log(Level.INFO, "Stopping timer: {0}", new Object[]{timer.name()}); t.cancel(); } } } /** * {@inheritDoc} */ @Override public void startTimers() { LOG.log(Level.INFO, "Starting timers"); for (PeriodicTimer systemTimer : PeriodicTimer.values()) { startTimer(systemTimer); } } /** * {@inheritDoc} */ @Override public void stopTimers() { LOG.log(Level.INFO, "Stopping timers"); for (PeriodicTimer systemTimer : PeriodicTimer.values()) { stopTimer(systemTimer); } } /** * {@inheritDoc} */ @Override public List<dk.i2m.converge.domain.SystemTimer> getAllTimers() { List<dk.i2m.converge.domain.SystemTimer> timers = new ArrayList<dk.i2m.converge.domain.SystemTimer>(); for (PeriodicTimer sTimer : PeriodicTimer.values()) { dk.i2m.converge.domain.SystemTimer sysTimer = new dk.i2m.converge.domain.SystemTimer(); boolean set = false; for (Timer timer : (Collection<Timer>) timerService.getTimers()) { if (timer.getInfo().equals(sTimer.name())) { sysTimer.setNextTimeout(timer.getNextTimeout()); sysTimer.setTimeRemaining(timer.getTimeRemaining()); sysTimer.setName((String) timer.getInfo()); set = true; break; } } if (!set) { sysTimer.setNextTimeout(null); sysTimer.setTimeRemaining(null); sysTimer.setName(sTimer.name()); } timers.add(sysTimer); } return timers; } /** * {@inheritDoc} */ @Override public List<dk.i2m.converge.domain.SystemTimer> getActiveTimers() { List<dk.i2m.converge.domain.SystemTimer> timers = new ArrayList<dk.i2m.converge.domain.SystemTimer>(); for (Timer timer : (Collection<Timer>) timerService.getTimers()) { dk.i2m.converge.domain.SystemTimer sysTimer = new dk.i2m.converge.domain.SystemTimer(); sysTimer.setNextTimeout(timer.getNextTimeout()); sysTimer.setTimeRemaining(timer.getTimeRemaining()); sysTimer.setName((String) timer.getInfo()); timers.add(sysTimer); } return timers; } /** * Executes a {@link Timer} * * @param timer Timer that initiated the timeout */ @Timeout public void executeTimer(Timer timer) { LOG.log(Level.INFO, "Executing timer [{0}]", new Object[]{timer.getInfo()}); try { if (timer.getInfo().equals(PeriodicTimer.NEWSWIRE.name())) { newswireService.downloadNewswireServices(); } else if (timer.getInfo().equals(PeriodicTimer.NEWSWIRE_PURGE.name())) { newswireService.purgeNewswires(); } else if (timer.getInfo().equals(PeriodicTimer.EDITION.name())) { outletFacade.closeOverdueEditions(); } else if (PeriodicTimer.SEARCH_ENGINE_INDEXING.name().equals(timer.getInfo())) { searchEngineService.processIndexingQueue(); } else if (PeriodicTimer.NEWSWIRE_BASKET.name().equals(timer.getInfo())) { newswireService.dispatchBaskets(); } else { LOG.log(Level.WARNING, "Ignoring unknown timer [{0}]", new Object[]{timer.getInfo()}); } } catch (IllegalStateException ex) { LOG.log(Level.SEVERE, ex.getMessage()); LOG.log(Level.FINEST, null, ex); } catch (EJBException ex) { LOG.log(Level.SEVERE, ex.getMessage()); LOG.log(Level.FINEST, null, ex); } } @Override public SystemTimer getTimer(PeriodicTimer timer) throws TimerException { for (SystemTimer t : getAllTimers()) { if (t.getName().equals(timer.name())) { return t; } } throw new TimerException(timer.name() + " does not exist"); } }