【问题标题】:Run Java with a main in a WebSphere project在 WebSphere 项目中使用 main 运行 Java
【发布时间】:2018-11-01 19:50:34
【问题描述】:

对 WebSphere 以及打包 Java 非常陌生。

我需要将我们一直从命令行运行的 Java 项目作为可执行 Jar 并使其从 WebSphere 运行(因为管理员用户已在午夜自动注销)。

我看过创建一个 WAR 文件,但是我看过的 ant 示例调用了很多 WEB-INF 依赖项......但是这个项目没有那个。它在代码中有一个主入口点。

EAR 似乎需要 EJB,我认为这个项目不会使用它。鉴于 EJB 已经有一段时间了,我没有跟上他们的速度。

我的问题是:将可执行 JAR 放入 WebSphere 的最简单方法是什么?

加分项:EAR 文件是否需要项目中的 EJB?如果是,我怎么知道这个项目是否调用了它们?

【问题讨论】:

  • 你想在 WebSphere 启动时运行 main 方法,还是在某个时间间隔,或者当有人访问某个网站时?
  • EAR 不需要 EJB,但需要 WAR 模块或 EJB 模块。您还可以部署普通 WAR。您的应用程序是 Spring Boot 吗?您的应用程序是做什么的?
  • @kgibm: WebSphere 何时启动
  • @Gas:我明白你为什么会猜到 Spring Boot,但我们的堆栈中没有什么现代的。基本上,它监视一个目录,该目录从 sftp 源中获取文件。我希望它一出现就开始观看该目录。
  • 那么,如果 WebSphere 没有 UI 也无法远程访问,那么在 WebSphere 中拥有它有什么意义呢?只需将其添加到corn中,系统启动时它将自动启动。

标签: websphere war executable-jar ear


【解决方案1】:

简单的答案是使用@WebListener 创建一个war 应用程序:

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 来创建特定于WAS 的解决方案。

否则,标准化的方法是使用 EJB @Startup bean,它使用 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 以毫秒为单位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2022-01-25
    相关资源
    最近更新 更多