【发布时间】:2009-05-03 07:30:55
【问题描述】:
我需要一个非常简单的进程来监听目录并 在该目录上创建新文件时执行一些操作。
我想我需要一个线程池来做到这一点。
这个用spring框架很容易实现,我平时用的但是现在不能用了。 我只能使用tomcat,我该如何实现呢? “启动”该线程的入口点是什么?
必须是 servlet 吗?
谢谢
【问题讨论】:
标签: java tomcat servlets jakarta-ee
我需要一个非常简单的进程来监听目录并 在该目录上创建新文件时执行一些操作。
我想我需要一个线程池来做到这一点。
这个用spring框架很容易实现,我平时用的但是现在不能用了。 我只能使用tomcat,我该如何实现呢? “启动”该线程的入口点是什么?
必须是 servlet 吗?
谢谢
【问题讨论】:
标签: java tomcat servlets jakarta-ee
既然你提炼了这个问题,这里又来了一个答案:如何在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;
}
}
【讨论】:
真正的 java-only 文件通知将在 java 7 中添加。这里是 part of the javadoc that describes it roughly。
从文件系统观察事件的实现旨在直接映射到可用的本机文件事件通知工具
现在您将不得不创建一个依赖于平台的本机程序来为您执行此操作,
或者实现某种轮询,每隔一段时间列出目录以检测更改。
您现在可以使用 notification library - 它使用 linux 上的 C 程序来检测 sourceforge 上的更改。在 Windows 上它使用轮询。我没有尝试看看它是否有效。
【讨论】: