【问题标题】:Display Default page until server starts在服务器启动之前显示默认页面
【发布时间】:2013-12-21 04:06:01
【问题描述】:

我想在我的服务器完全启动之前显示一个默认的自定义页面。

问题说明:服务器启动时我做的设置很少,所以服务器启动需要很长时间。因此,与此同时,如果某个用户点击主页 url,服务器统计信息,那么他应该会看到一些默认页面显示服务器正在启动..blah blah ...

现在的问题是,如果服务器没有完全启动,我的应用程序上下文也没有完全加载,并且命中的响应是“中止”,这不是 HTTP 响应,那么我怎样才能捕获这个响应并显示一些错误页面。

服务器可以是jetty,tomcat 任意

【问题讨论】:

  • 如果服务器没有完全初始化,它就不能处理请求。
  • 是的正确..但是有没有办法我可以做一些事情来显示一些默认页面,直到服务器启动......
  • 肯定有。例如,Artifactory 就是这样做的。但是,您将不得不将较长的设置代码从 servlet 初始化中移出并移到其他一些后台工作线程中。 servlet 初始化应该只是启动您的工作线程。然后,您应该有一个 servlet 来检查您的应用程序是否已初始化并正确响应。

标签: java tomcat servlets spring-mvc jetty


【解决方案1】:

一个快速而肮脏的例子:

public class DeferringServlet extends HttpServlet {

  private static final Logger logger = Logger.getLogger(DeferringServlet.class);

  private MyApp myApp;
  private Thread appInitializerThread;

  public void init() {
    myApp = new MyApp();
    appInitializerThread = new Thread(new Runnable() {
      public void run() {
        myApp.init();
      }
    });
    appInitializerThread.start();
  }

  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    if(myApp.isInitialized()) {
      myApp.doGet(req, resp);
    } else {
      myApp.setStatus(503); //Service unavailable
      myApp.getWriter.println("Please wait.  App is loading");
    }
  }

  public void destroy() {
    if(appInitializerThread.isAlive()) {
      appInitializerThread.interrupt();
    }
    try {
      appInitializerThread.join();
    } catch (InterruptedException ex) {
      logger.warn("Interrupted before app initializer could finish");
    }
  }

}

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2015-03-09
    • 2018-10-07
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多