Сервлет Java: заставить init создавать объект данных при запуске сервера Payara? - PullRequest
0 голосов
/ 01 июня 2018

Я ищу способ создания объекта данных в моем Java-сервлете (на Payara) перед первым запросом, поскольку созданный объект данных занимает некоторое время для анализа других веб-сайтов (около 4 секунд).

Я предположил, что достаточно установить

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

в начале, чтобы принудительно инициализировать контейнером сервлета при запуске сервера payara (на основе 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 Ответ

0 голосов
/ 01 июня 2018

Вместо инициализации ReportData в методе сервлета 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);
    }
    ..
 }
...