Java EE là giải pháp. Bạn sẽ cần phải làm theo các bước thoses:
xây dựng một ứng dụng Java EE, một lọ chứa EJB:
1.1 bạn sẽ cần một IDE: Eclipse Juno là favorit của tôi, 1.2 Nhiều tuto tồn tại trên Trang web. Tìm kiếm EJB3 và bạn sẽ tìm thấy,
- có một máy chủ ứng dụng để chạy EJB của bạn. JBoss là một lựa chọn tốt, Glassfish là một lựa chọn tốt khác. Với JBoss và plugin JBoss Tools cho Eclipse được cài đặt, bạn sẽ có thể xây dựng và chạy nhanh một ứng dụng cơ bản.
EDIT: một lớp Timer EJB đầy đủ (với tải lại tự động nếu cần thiết)
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
}
Tôi hy vọng điều này sẽ giúp.
Đánh giá cao câu trả lời của bạn, nhưng tôi đã hy vọng một cách cơ bản hơn để thực hiện nó, giải pháp bạn đề xuất trông giống như một mẹo. Có một giải pháp cơ bản nào khác, phù hợp với một phạm vi rộng hơn của các vấn đề của các quy trình liên tục và thao tác của chúng. –
Không, không phải là một thủ thuật, 'TimerService' và' Timer' (s) là cách tiêu chuẩn trong JEE để kiểm soát và thực thi các tiến trình lặp đi lặp lại. Họ không buộc bạn vào một loại vấn đề cụ thể. Bạn thấy những giới hạn nào trong cách tiếp cận này? Như bạn đã nói câu hỏi có vẻ là một trận đấu hoàn hảo. – dcernahoschi
+1 Không có hỗ trợ trực tiếp cho các quy trình nền dài chạy trong Java EE. Thay vào đó, chúng có các bộ định thời hỗ trợ định kỳ, với 'TimerService'. – ewernli