【问题标题】:Start Listener AFTER Tomcat startup? [duplicate]Tomcat启动后启动监听器? [复制]
【发布时间】:2015-12-29 18:32:35
【问题描述】:

我使用this 代码在 Tomcat 初始化之前启动了一个监听器,但它有一个 while 循环,它将每 5 秒检查一次数据库是否有更改。有什么方法可以跳过循环部分,直到我的 Web 服务完全启动,然后触发循环开始检查?

编辑:意思是listener,而不是Servlet

EDIT2:下面的代码

public class DatabaseChecker implements ServletContextListener {

final static String URL = "redacted";
final static String USER = "redacted";
final static String PASS = "redacted";

@Override
public void contextInitialized(ServletContextEvent event) {

    Vector<String> completedJobs = new Vector<String>();

    try {
        while(true) {   // loop to always check & notify
            Thread.sleep(5000);
            System.out.println("Checker running ...");
            // completedJobs = selectCompletedJobs();

        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

@Override
public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("ServletContextListener destroyed");

}

}

【问题讨论】:

  • 那是错误的。 while 循环将阻止上下文侦听器完成,因此您的应用程序可能会保持未初始化状态。 sleep-busy while 循环可能应该在单独的后台线程中发生。像这样:stackoverflow.com/questions/4691132/…
  • @Gimby 成功了!!!想要回答这个问题,以便我可以给你打勾吗? ;)
  • 另一个问题+答案完全回答了您的问题这一事实使您的问题重复。因此,BalusC 正确地完成了文书工作。

标签: java tomcat jakarta-ee listener


【解决方案1】:

是的。 ServletContext 允许您添加属性,这是在 ServletContextListener 和 servlet 中运行的服务之间共享的全局上下文。

您可以通过轮询属性让ServletContextListener 等待网络服务。

当您的网络服务准备就绪时,它可以将属性添加到ServletContext

现在当您的ServletContextListener 找到该属性时,它可以继续。

【讨论】:

  • 我编辑了 OP 以反映我的代码。我应该在那里或我的web.xml 中进行更改吗?
  • 这些是代码更改。您必须将投票添加到DatabaseChecker
猜你喜欢
  • 2011-06-14
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2017-08-28
  • 2020-04-27
  • 2011-07-17
相关资源
最近更新 更多