代码之家  ›  专栏  ›  技术社区  ›  micahhoover

在WebSphere项目中使用main运行Java

  •  1
  • micahhoover  · 技术社区  · 7 年前

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

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

    EARs似乎需要ejb,我不认为这个项目使用它。考虑到ejb已经有一段时间了,我还没有跟上它们的速度。

    1 回复  |  直到 7 年前
        1
  •  1
  •   kgibm    7 年前

    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以毫秒为单位)。

    推荐文章