war
应用程序
@WebListener
:
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ServletInitializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println(toString() + " contextInitialized started");
String[] args = new String[] {};
MainClass.main(args);
System.out.println(toString() + " contextInitialized finished");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
MainClass.main(args);
使用应用程序调用(并将任何JAR依赖项添加到
WEB-INF/lib
).
我不喜欢上面提到的一点是,在创业期间进行高强度的工作并不好。这可能会使确定问题更加困难,并且某些功能(例如运行时诊断跟踪修改)在启动期间不可用。
AdminClient
订阅
Server MBean's Stateful notifications
否则,一个标准化的方法就是使用EJB
@Startup
TimerService
在经过一段时间的延迟后开始工作,这是根据经验确定的应用程序服务器的平均启动时间。例如:
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;
@Singleton
@Startup
public class DeferredInitializer {
public static final int DELAY = Integer.getInteger("DeferredInitializer.DELAY", 60000);
@Resource
TimerService timerService;
@PostConstruct
private void init() throws Throwable {
System.out.println(toString() + " init entry");
TimerConfig timerConfig = new TimerConfig();
timerConfig.setPersistent(false);
timerService.createSingleActionTimer(DELAY, timerConfig);
Calendar c = new GregorianCalendar();
c.add(Calendar.MILLISECOND, DELAY);
System.out.println(toString() + " timer estimated to pop in (" + DELAY + "ms) ~@ " + c.getTime());
System.out.println(toString() + " init exit");
}
@Timeout
public void timeout(Timer timer) {
System.out.println(toString() + " timeout entry");
String[] args = new String[] {};
MainClass.main(args);
System.out.println(toString() + " timeout exit");
}
}
使用指定延迟
generic JVM argument
-DDeferredInitializer.DELAY=X
(X以毫秒为单位)。