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

JavaServlet:强制init在Payara服务器上创建数据对象启动?

  •  1
  • ptstone  · 技术社区  · 6 年前

    我正在寻找一种在第一个请求之前在我的java servlet(Payara上)中生成数据对象的方法,因为创建的数据对象需要一些时间来解析其他网站(大约4秒)。

    我以为这就足够了

    @WebServlet(urlPatterns = "/reports/*", loadOnStartup = 1)
    

    在启动payara服务器时强制servlet容器初始化(基于 http://www.codejava.net/java-ee/servlet/webservlet-annotation-examples ).然而,它不起作用。对于第一个请求,我仍然有4秒的延迟,后续请求没有延迟。下面的代码可以工作,问题只是第一个请求的延迟。

    @WebServlet(urlPatterns = "/reports/*", loadOnStartup = 1)
    public class SingleReportServlet extends HttpServlet {
    
        ReportData m_myData;
    
        @Override
        public void init() throws ServletException {        
            m_myData = new ReportData(); //This takes about 4 seconds, once
            System.out.println("My servlet has been initialized");        
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        
            String requestPath = request.getPathInfo();
            String[] components = requestPath.split("/");
            String requestedData = components[components.length-1].trim().toUpperCase();
            String report = m_myData.getFullReport(requestedData, Locale.GERMAN, DisplayType.HTML_PARTIAL);
            String headline = "Report for "+requestedData;
            System.out.println(headline);
            System.out.println(report);         
            request.setAttribute("headline", headline);
            request.setAttribute("report", report); 
            request.getRequestDispatcher("/WEB-INF/singleReport.jsp").forward(request, response);       
        }    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Scary Wombat    6 年前

    而不是 ReportData 正在servlet中初始化 init 我建议你使用 ServletContextListener

    例如

    @WebListener
    public class ServletContextListenerImpl implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            ReportData m_myData = new ReportData ();
            System.out.println("My ServletContextListenerImpl has been initialized");
    
            // then add to your session for later use
            sce.getServletContext().setAttribute("RDATA", m_myData);
        }
        ..
     }