Простой ответ - создать приложение 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
).
Что мне не нравится в вышесказанном, так это то, что не стоит выполнять интенсивную работу во время запуска. Это может усложнить определение проблемы, и определенные возможности (например, изменение трассировки диагностики во время выполнения) будут недоступны во время запуска.
Вы можете создать решение для WAS, используя AdminClient для подписки на Server MBean уведомлений о состоянии .
В противном случае стандартным способом было бы иметь компонент 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");
}
}
Укажите задержку с помощью универсального аргумента JVM -DDeferredInitializer.DELAY=X
(X в миллисекундах).