Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使静态块运行?_Java_Timer - Fatal编程技术网

Java 如何使静态块运行?

Java 如何使静态块运行?,java,timer,Java,Timer,我已经看到了很多关于这个话题的答案,但仍然找不到一个干净的解决方案 public class ProcessScheduler { static { Timer timer=new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { LogProcessorServiceImpl.processPageReq

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

public class ProcessScheduler {
    static {
        Timer timer=new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                LogProcessorServiceImpl.processPageRequestsLogs();
            }
        }, 0, 120);
    }
} 
我如何执行该计划并对高质量的解决方案感到满意?我的应用程序基于Spring(不幸的是),我知道我可以在我的一个控制器中引用这个类,它可能会工作。但这很愚蠢。一定有更好的办法。我在Tomcat上,没有EJB支持,所以计时器注释对我来说不起作用。另外,我不想做CRON。我想在此计划程序类中计划所有维护任务


Servlet类可以通过web.xml(1)加载。我们可以在非servlet类上执行类似的操作吗?

与其在静态块中编写,不如

  • 写一个扩展
  • 将这段代码移到方法中
  • 定义取消计时器的方法
  • 在我的应用程序的
    web.xml
    文件中将类配置为

    <listener>
        <listener-class>
            com.vikdor.webapps.ProcessSchedulerListener
        </listener-class>
    </listener>
    
    
    com.vikdor.webapps.ProcessSchedulerListener
    

    • 与其将其写入静态块,我更愿意

      • 写一个扩展
      • 将这段代码移到方法中
      • 定义取消计时器的方法
      • 在我的应用程序的
        web.xml
        文件中将类配置为

        <listener>
            <listener-class>
                com.vikdor.webapps.ProcessSchedulerListener
            </listener-class>
        </listener>
        
        
        com.vikdor.webapps.ProcessSchedulerListener
        

      静态块在类加载时执行。它将在加载时执行,如果您不想,您可能需要执行类似方法和调用的操作,这就是您想要的。方法调用仍然需要在其他地方引用该类。这同样肮脏。这个调度程序应该是完全自治的。@jacekn,为什么你的应用程序在spring上运行会很不幸呢?Spring提供了健壮的调度—至少您应该在程序中的某个地方加载此类,以使静态块运行。是否有一种方法可以在您的环境中自动加载此类?静态块在类加载时执行。它将在加载时执行,如果您不想,您可能需要执行类似方法和调用的操作,这就是您想要的。方法调用仍然需要在其他地方引用该类。这同样肮脏。这个调度程序应该是完全自治的。@jacekn,为什么你的应用程序在spring上运行会很不幸呢?Spring提供了健壮的调度—至少您应该在程序中的某个地方加载此类,以使静态块运行。有没有一种方法可以在您的环境中自动加载这个类?嗯,我本来打算使用一个简单的servlet,但我正在尝试您的侦听器。servlet实现ServletContextListener并加载。但是contextInitialized()方法不运行。我想我需要仔细阅读一下,除非你能解释得更快。你在web.xml中添加了这个类作为监听器吗?我刚刚用可能的条目更新了我的答案。是的,我向web.xml添加了侦听器定义,服务器也重新启动了。当我切换到一个简单的servlet时,它工作得很好,所以我就到此为止。对我来说,这几乎是相同的解决方案,所以我接受你的答案。谢谢。嗯,我本来打算用一个简单的servlet来实现这一点,但我正在尝试您的侦听器。servlet实现ServletContextListener并加载。但是contextInitialized()方法不运行。我想我需要仔细阅读一下,除非你能解释得更快。你在web.xml中添加了这个类作为监听器吗?我刚刚用可能的条目更新了我的答案。是的,我向web.xml添加了侦听器定义,服务器也重新启动了。当我切换到一个简单的servlet时,它工作得很好,所以我就到此为止。对我来说,这几乎是相同的解决方案,所以我接受你的答案。谢谢