【问题标题】:Tomcat not starting due to the Java program由于 Java 程序,Tomcat 无法启动
【发布时间】:2015-10-22 15:26:21
【问题描述】:

我有一个调用 MMQ 侦听器的 Java Servlet。我正在 Tomcat 服务器中部署应用程序

AppServlet.java

package com.cisco.cstg.platform;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AppServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    MessageListenerImpl m;

    public void init(ServletConfig config) throws ServletException {
        //super.init(config);
        //MainApp.main(null);
        m = MainApp.init();
        MainApp.start(m);
    }

     public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        PrintWriter out = res.getWriter();
        boolean dbStatus = EMANApi.isDBUpAndRunning();
        if (dbStatus == true) {
            out.print("SUCCESS");
        } else {
            out.print("FAILED");
        }
    }

    public void destroy() {

        MainApp.stop(m);

    }

}

MainApp.java

package com.cisco.cstg.platform;

import com.cisco.cstg.utilities.UtilClass;

public class MainApp {

    public static final org.apache.log4j.Logger log = org.apache.log4j.Logger
            .getLogger(MainApp.class);
    // Input arguments
    public static long keepAliveMinutes = 1L;
    public static boolean debug;

    public static void main(String args[]) {
        MainApp.fetchArgs(args);

        initLogging();
        if (debug)
            log.info(UtilClass.getCurrentDate()
                    + "Run Connector Message App for reading the queue");

        MessageListenerImpl m = MainApp.init();
        MainApp.start(m);
        UtilClass.keepAlive(keepAliveMinutes);
        // MainApp.stop(m);

        if (debug)
            log.info(UtilClass.getCurrentDate()
                    + "Run Connector CSOC Message App");

    }

    private static void fetchArgs(String[] args) {
        debug = log.isDebugEnabled();
        keepAliveMinutes = Integer.MAX_VALUE; // value is 2147483647 ms

        if (debug)
            log.info(UtilClass.getCurrentDate() + "Found keepAliveMinutes: "
                    + keepAliveMinutes + " debug: " + debug);

    }

    private static void initLogging() {

        if (debug)
            log.info(UtilClass.getCurrentDate() + "::initLogging Started");

        if (debug)
            log.info(UtilClass.getCurrentDate()
                    + "::Log level set"
                    + UtilClass.getProperties().getProperty(
                            UtilClass.PropertyKeys.PROP_LOG_LEVEL));

    }

    public static MessageListenerImpl init() {

        if (debug)
            log.info(UtilClass.getCurrentDate()
                    + "::Instantiating MessageListenerImpl");

        MessageListenerImpl m = new MessageListenerImpl();

        if (debug)
            log.info(UtilClass.getCurrentDate()
                    + "::Instantiated MessageListenerImpl");

        return m;
    }

    public static void start(MessageListenerImpl m) {

        if (debug)
            log.info(UtilClass.getCurrentDate() + "::Starting instance");
        m.start();
        if (debug)
            log.info(UtilClass.getCurrentDate() + "::Started instance");
    }

    public static void stop(MessageListenerImpl m) {

        if (debug)
            log.debug(UtilClass.getCurrentDate() + "::Stopping instance");
        m.stop();
        System.exit(1); // to stop the java program
        if (debug)
            log.debug(UtilClass.getCurrentDate() + "::Stopped instance");

    }

}

servlet 基本上调用MainApp 中的init 方法,该方法启动Listener。但是当我直接调用init 方法时,日志记录不起作用。当我直接从AppServlet 调用main 方法时,Tomcat 服务器没有启动。请让我知道这里出了什么问题。

web.xml

<session-config>
    <session-timeout>60</session-timeout>
</session-config>
<display-name>Archetype Created Web Application</display-name>
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>com.cisco.cstg.platform.AppServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/eman</url-pattern>
</servlet-mapping>

Catalina.out

2015 年 7 月 31 日 09:13:40.822 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本: Apache Tomcat/8.0.24 2015 年 7 月 31 日 09:13:40.823 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建:
2015 年 7 月 1 日 20:19:55 UTC 2015 年 7 月 31 日 09:13:40.823 信息 [主] org.apache.catalina.startup.VersionLoggerListener.log 服务器号:
8.0.24.0 2015 年 7 月 31 日 09:13:40.823 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称:
Windows 7 2015 年 7 月 31 日 09:13:40.824 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 操作系统版本:
6.1 2015 年 7 月 31 日 09:13:40.824 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构:
amd64 2015 年 7 月 31 日 09:13:40.824 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log Java 主页:
C:\Program Files\Java\jdk1.8.0_25\jre 2015 年 7 月 31 日 09:13:40.824 信息 [主] org.apache.catalina.startup.VersionLoggerListener.log JVM 版本:1.8.0_25-b18 2015 年 7 月 31 日 09:13:40.824 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log JVM 供应商:
甲骨文公司 2015 年 7 月 31 日 09:13:40.824 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:
C:\apache-tomcat-8.0.24 2015 年 7 月 31 日 09:13:40.825 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:
C:\apache-tomcat-8.0.24 2015 年 7 月 31 日 09:13:40.825 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 争论: -Djava.util.logging.config.file=C:\apache-tomcat-8.0.24\conf\logging.properties 2015 年 7 月 31 日 09:13:40.825 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 争论: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 31-Jul-2015 09:13:40.826 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 参数:-Djava.endorsed.dirs=C:\apache-tomcat-8.0.24\endorsed
2015 年 7 月 31 日 09:13:40.826 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 参数:-Dcatalina.base=C:\apache-tomcat-8.0.24 2015 年 7 月 31 日 09:13:40.827 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 参数:-Dcatalina.home=C:\apache-tomcat-8.0.24 2015 年 7 月 31 日 09:13:40.828 信息 [主要] org.apache.catalina.startup.VersionLoggerListener.log 命令行 参数:-Djava.io.tmpdir=C:\apache-tomcat-8.0.24\temp 2015 年 7 月 31 日 09:13:40.828 信息 [主要] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 已加载 基于 APR 的 Apache Tomcat 本机库 1.1.33,使用 APR 版本 1.5.1。 2015 年 7 月 31 日 09:13:40.829 信息 [主要] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR 能力:IPv6 [true]、sendfile [true]、接受过滤器 [false]、 随机[真]。 2015 年 7 月 31 日 09:13:41.537 信息 [主要] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL 成功初始化(OpenSSL 1.0.1m 2015 年 3 月 19 日)2015 年 7 月 31 日 09:13:41.686 信息 [主] org.apache.coyote.AbstractProtocol.init 初始化 ProtocolHandler ["http-apr-8080"] 2015 年 7 月 31 日 09:13:41.695 信息 [主] org.apache.coyote.AbstractProtocol.init 初始化 ProtocolHandler ["ajp-apr-8009"] 2015 年 7 月 31 日 09:13:41.697 信息 [主] org.apache.catalina.startup.Catalina.load 初始化在 1342 毫秒内处理 31-Jul-2015 09:13:41.726 信息 [主] org.apache.catalina.core.StandardService.startInternal 启动 服务 Catalina 2015 年 7 月 31 日 09:13:41.727 信息 [主要] org.apache.catalina.core.StandardEngine.startInternal 启动 Servlet 引擎:Apache Tomcat/8.0.24 2015 年 7 月 31 日 09:13:41.756 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR 部署 web 申请档案 C:\apache-tomcat-8.0.24\webapps\CSPC_greenfield.war 2015 年 7 月 31 日 09:13:43.653 信息 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个 JAR 已扫描 TLD,但未包含 TLD。为此启用调试日志记录 记录器以获取已扫描但没有 TLD 的 JAR 的完整列表 在他们身上找到。在扫描期间跳过不需要的 JAR 可以改善 启动时间和 JSP 编译时间。 2015 年 7 月 31 日 09:13:43.907 信息 [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 使用创建用于会话 ID 生成的 SecureRandom 实例 [SHA1PRNG] 耗时 [222] 毫秒。

【问题讨论】:

  • 我不会尝试回答,因为缺少太多关键信息(例如您的 web.xml)。但我可以告诉你,如果你从它的main() 方法运行MainApp 类,那么你正在运行一个Java 控制台应用程序,而不是一个Web 应用程序。您需要让 servlet 容器为您处理。
  • 嗨 TimBiegeleisen 添加了 web.xml
  • 您的预期输出是什么?您看到的是什么?这段代码非常混乱。
  • 可能您的方法之一 MainApp.init()MainApp.start(m) 永远不会返回(在这种情况下,请尝试在线程中运行 start(m))。现在,我不能 100% 确定你在做什么,你确定 Listener 是按照你的方式运行的吗?另外,您似乎正在记录所有内容,日志告诉您什么?你能复制/粘贴 catalina.out 的相关部分吗?
  • 这里的预期功能是从 servlet 调用 MainApp 的 main() 方法并启动 tomcat。在较早的情况下,只有 init() 方法是 MainApp 被调用并且日志记录不参与并且 tomcat 服务器启动。在后一种情况下,main 方法被调用,但 tomcat 服务器没有启动。我对 servlet 概念非常陌生,我正在尝试为现有应用程序创建一个 servlet 层以进行监控。

标签: java tomcat servlets listener


【解决方案1】:

当我在 MainApp.init() 方法中调用 MainApp 中的调试和其他方法时,问题解决了。

【讨论】:

    最近更新 更多