Java EE jest rozwiązaniem. Trzeba będzie śledzić thoses etapy:
zbudować aplikację Java EE, słoik zawierający EJB:
1.1 trzeba będzie IDE: Eclipse Juno jest mój ulubiony, 1,2 Wiele tuto istnieje na sieć. Wyszukaj EJB3, a znajdziesz,
- mieć serwer aplikacji do uruchamiania EJB. JBoss to dobry wybór, Glassfish to kolejny dobry wybór. Dzięki JBoss i zainstalowanej wtyczce JBoss Tools dla Eclipse, będziesz w stanie szybko zbudować i uruchomić podstawową aplikację.
EDIT: kompletna Klasa Timer EJB (z Autoprzeładowanie razie potrzeby)
package clouderial.saas.commons.utils;
import java.util.Map;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.ScheduleExpression;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
import javax.inject.Inject;
import jmcnet.libcommun.exception.ExceptionTechnique;
import jmcnet.libcommun.utilit.mail.MailException;
import org.apache.commons.configuration.event.ConfigurationEvent;
import org.apache.commons.configuration.event.ConfigurationListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import clouderial.saas.commons.email.EmailSender;
import clouderial.saas.commons.jpamongo.JPAMongoBasePersistenceContextAccessor;
/**
* A base class for a periodic process
* @author jmc
*
*/
public abstract class PeriodicProcessBase extends JPAMongoBasePersistenceContextAccessor implements ConfigurationListener {
private static Logger log = LoggerFactory.getLogger(PeriodicProcessBase.class);
@Resource
private TimerService timerService;
@Inject
protected GlobalConfiguration _config;
@Inject
protected EmailSender _emailSender;
private Timer _timer=null;
private String _processName=null;
private Logger _log = null;
protected void initTimer(String processName, Logger log) {
if (processName != null) _processName = processName;
if (log != null) _log = log;
String second = _config.getString("timer."+_processName+".second","0");
String minute = _config.getString("timer."+_processName+".minute","0");
String hour = _config.getString("timer."+_processName+".hours","4");
String dayOfWeek = _config.getString("timer."+_processName+".dayOfWeek","*");
ScheduleExpression scheduleExp =
new ScheduleExpression().second(second).minute(minute).hour(hour).dayOfWeek(dayOfWeek);
cancelTimer();
if (timerService != null) {
_timer = timerService.createCalendarTimer(scheduleExp, new TimerConfig(_processName, false));
_log.info("{} : timer programmed for '{}'h, '{}'m, '{}'s for days '{}'.", _processName, hour, minute, second, dayOfWeek);
}
else _log.error("{} : no timer programmed because timerService is not initialized. (Normal during tests)", _processName);
// Listen to change
_config.addModificationListener(this); // on timer modification, configurationChanged is called
}
@PreDestroy
private void cancelTimer() {
if (_log != null) _log.info("Stopping timer for '{}'", _processName);
if (_timer != null) _timer.cancel();
_timer = null;
}
@Override
public void configurationChanged(ConfigurationEvent event) {
if (_log != null) _log.info("Configuration have change. Reloading config for ProcessBilling.");
_config.removeModificationListener(this);
initTimer(null, null);
}
@Timeout
private void run(Timer timer) {
runProcess(timer);
}
/**
* The entry point for runner the process. Must be overriden by super class
* @param timer
*/
protected abstract void runProcess(Timer timer); // do the job here
}
Mam nadzieję, że to pomaga.
Doceń swoją odpowiedź, ale miałem nadzieję na bardziej fundamentalny sposób robienia tego, rozwiązanie, które sugerujesz, wygląda bardziej na podstęp. Czy istnieje inne, bardziej fundamentalne rozwiązanie, które byłoby odpowiednie dla szerszego zakresu problemów ciągłych procesów i ich manipulacji. –
Nie, to nie podstęp, 'TimerService' i' Timer' (s) są standardowym sposobem w JEE do sterowania i wykonywania powtarzalnych procesów. Nie wiążą cię z konkretnym rodzajem problemów. Jakie ograniczenia widzisz w tym podejściu? Jak stwierdziłeś, pytanie wydaje się idealnie pasować. – dcernahoschi
+1 Nie ma bezpośredniego wsparcia dla długo działających procesów w tle w Java EE. Zamiast tego mają wsparcie okresowych timerów, z 'TimerService'. – ewernli