【问题标题】:How to cause static block to run?如何使静态块运行?
【发布时间】:2012-11-18 03:24:30
【问题描述】:

我已经看到了很多关于这个主题的答案,但仍然找不到一个干净的解决方案。

public class ProcessScheduler {
    static {
        Timer timer=new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                LogProcessorServiceImpl.processPageRequestsLogs();
            }
        }, 0, 120);
    }
} 

如何执行此操作并对高质量的解决方案感到满意?我的应用程序基于 Spring(不幸的是),我知道我可以在我的一个控制器中引用这个类,它可能会工作。但这很愚蠢。必须有更好的方法。我在没有 EJB 支持的 Tomcat 上,所以计时器注释对我不起作用。另外,我不想做 CRON。我想在这个调度程序类中安排我的所有维护任务。

Servlet 类可以通过 web.xml (1) 加载。我们可以在非 servlet 类上做类似的事情吗?

【问题讨论】:

  • 静态块在类加载时执行。它将在加载时执行,如果您不想要,可能需要执行方法和调用之类的操作,这就是您想要的。
  • 方法调用仍需要在其他地方引用此类。这同样肮脏。这个调度器应该是完全自治的。
  • @jacekn,为什么你的应用程序在春季运行很不幸? Spring 提供了健壮的调度
  • 至少你应该在你的程序的某个地方加载这个类来让静态块运行。有没有一种方法可以在你的环境中自动加载这个类?

标签: java timer


【解决方案1】:

与其在静态块中写这个,我更愿意

【讨论】:

  • 好吧,我打算为此使用一个简单的 servlet,但我正在尝试你的监听器。 servlet 实现 ServletContextListener 并被加载。但是 contextInitialized() 方法没有运行。我想我需要阅读这个,除非你能更快地解释。
  • 您是否在 web.xml 中将该类添加为侦听器?我刚刚用潜在的条目更新了我的答案。
  • 是的,我确实将监听器定义添加到 web.xml 并且服务器也重新启动了。当我切换到一个简单的 servlet 时,它工作得很好,所以我会保留它。对我来说,这几乎是相同的解决方案,所以我接受你的回答。谢谢。
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多