【问题标题】:file listener process on tomcatTomcat上的文件监听进程
【发布时间】:2009-05-03 07:30:55
【问题描述】:

我需要一个非常简单的进程来监听目录并 在该目录上创建新文件时执行一些操作。

我想我需要一个线程池来做到这一点。

这个用spring框架很容易实现,我平时用的但是现在不能用了。 我只能使用tomcat,我该如何实现呢? “启动”该线程的入口点是什么?

必须是 servlet 吗?

谢谢

【问题讨论】:

    标签: java tomcat servlets jakarta-ee


    【解决方案1】:

    既然你提炼了这个问题,这里又来了一个答案:如何在tomcat中启动一个守护进程:

    首先,在 web.xml 中注册你的守护进程:

    my.package.servlet.Daemons

    然后将 Daemons 类实现为 ServletContextListener 的实现,如下所示:

    该代码将每 5 秒调用一次,当您的应用关闭时,tomcat 将调用 contextDestroyed。注意变量是易变的,否则在多核系统上可能会遇到关机问题

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    
    public class Daemons implements ServletContextListener {
    private volatile boolean active = true;
    
    Runnable myDeamon = new Runnable() {
    
        public void run() {
            while (active) {
                try {
                    System.out.println("checking changed files...");
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        new Thread(myDeamon).start();
    }
    
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        active = false;
    }
    }
    

    【讨论】:

      【解决方案2】:

      您可以创建一个listener 来启动线程,但这不是一个好主意。当您在 Web 容器中运行时,您不应该启动自己的线程。 Stack Overflow 中有几个问题说明为什么会这样。您可以使用Quartz(调度程序框架),但我猜您无法达到可接受的分辨率。

      无论如何,您所描述的不是 Web 应用程序,而是一个守护程序服务。您可以独立于您的 Web 应用程序来实现这一点,并为它们创建一种相互通信的方式。

      【讨论】:

        【解决方案3】:

        真正的 java-only 文件通知将在 java 7 中添加。这里是 part of the javadoc that describes it roughly

        从文件系统观察事件的实现旨在直接映射到可用的本机文件事件通知工具

        现在您将不得不创建一个依赖于平台的本机程序来为您执行此操作,

        或者实现某种轮询,每隔一段时间列出目录以检测更改。

        您现在可以使用 notification library - 它使用 linux 上的 C 程序来检测 sourceforge 上的更改。在 Windows 上它使用轮询。我没有尝试看看它是否有效。

        【讨论】:

        • 问题不是通知问题,而是在tomcat中启动守护进程的最佳方法是什么。为什么我不能使用加载线程的 servlet?
        猜你喜欢
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多