Запустите Java с основным в проекте WebSphere - PullRequest
0 голосов
/ 01 ноября 2018

Очень новый для WebSphere, а также пакет Java.

Мне нужно взять Java-проект, который мы запускали из командной строки, в качестве исполняемого Jar-файла и заставить его запускаться из WebSphere (поскольку пользователь администратора автоматически выходит из системы в полночь).

Я смотрел на создание файла WAR, но примеры муравьев, на которые я смотрел, вызывали много зависимостей WEB-INF ... но в этом проекте этого нет. Он имеет основную точку входа в код.

EAR, кажется, требуют EJB, которые я не думаю, что этот проект использует. Видя, как EJB уже выходят, я не настолько быстр, чтобы их использовать.

Мои вопросы: как проще всего поместить мой исполняемый JAR-файл в WebSphere?

Бонусные баллы: для файлов EAR требуются EJB в проекте? Если так, как я узнаю, что этот проект вызывает их?

1 Ответ

0 голосов
/ 21 ноября 2018

Простой ответ - создать приложение 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 в миллисекундах).

...