tomcat上的文件监听器进程

时间:2009-05-03 07:30:55

标签: java tomcat servlets java-ee

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

我想我需要一个能够做到这一点的线程池。

使用弹簧框架很容易实现,我通常使用弹簧框架,但现在我无法使用它。 我只能使用tomcat,我该如何实现它?什么是“开始”该线程的切入点?

是否必须是servlet?

感谢

3 个答案:

答案 0 :(得分:4)

因为你提炼了这个问题,所以这里有另一个答案:如何在tomcat中启动一个守护进程:

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

<听众>     my.package.servlet.Daemons   < / listener>

然后将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;
}
}

答案 1 :(得分:1)

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

无论如何,您所描述的不是Web应用程序,而是守护程序服务。您可以独立于Web应用程序实现此功能,并为他们创建相互通信的方式。

答案 2 :(得分:1)

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

  

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

现在你必须要么创建一个本机平台相关程序,为你做这件事,

或者实现某种轮询,它经常列出目录以检测变化。

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