监听文件修改,自动加载xml文件。

转载文章,转载自,公司项目,董亚杰写的。

下面是完整的代码,复制的。

package cn.digitalpublishing.util.debug;

import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

import org.apache.commons.io.FilenameUtils;

import cn.digitalpublishing.util.SpringUtils;

import com.ingenta.framework.dao.impl.support.DefaultIngentaDao;

/**
 *
 * @author dongyajie
 *
 */
@WebServlet(initParams = { @WebInitParam(name = "path", value = "W:\\workspace2\\Editorial\\src\\main\\resources\\sql") }, value = "/DynamicReloadHqlXmlNew", loadOnStartup = 88)
public class DynamicReloadHqlXmlNew extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private final String ACTION_ENTRY_CREATE = "ENTRY_CREATE";
	private final String ACTION_ENTRY_DELETE = "ENTRY_DELETE";
	private final String ACTION_ENTRY_MODIFY = "ENTRY_MODIFY";

	private String prevFileName = "";
	private String prevAction = "";
	private long prevTimeMillis = 0;
	private final long interval = 500;
	private DefaultIngentaDao dao;

	@Override
	public void init(ServletConfig config) throws ServletException {
		final String hqlDir = config.getInitParameter("path");
		dao = (DefaultIngentaDao) SpringUtils.getBean("ingentaDao");
		ExecutorService service = Executors.newSingleThreadExecutor();
		service.execute(new Runnable() {
			@Override
			public void run() {
				WatchService watchService = null;
				try {
					watchService = FileSystems.getDefault().newWatchService();
					Paths.get(hqlDir).register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
				} catch (Exception e) {
				}
				if (watchService != null) {
					while (true) {
						try {
							WatchKey key = watchService.take();
							List<WatchEvent<?>> events = key.pollEvents();
							if (!events.isEmpty()) {
								WatchEvent<?> event = events.get(events.size() - 1);
								File eventFile = new File(hqlDir, event.context().toString());
								Kind<?> eventKind = event.kind();
								String kindName = eventKind.name();
								if (eventKind.name().equals(ACTION_ENTRY_CREATE)) {
									kindName = ACTION_ENTRY_MODIFY;
								}
								if ((!eventFile.getPath().equals(prevFileName) || !kindName.equals(prevAction)) || ((System.currentTimeMillis() - prevTimeMillis) > interval)) {
									if (eventFile.isFile()) {
										if (kindName.equals(ACTION_ENTRY_MODIFY)) {
											if (FilenameUtils.isExtension(eventFile.getName().toLowerCase(), "xml")) {
												loadXML(eventFile.getPath());
											}
										}
									}
									if (kindName.equals(ACTION_ENTRY_DELETE)) {
									}
									prevAction = kindName;
									prevFileName = eventFile.getPath();
									prevTimeMillis = System.currentTimeMillis();
								}
							}
							if (!key.reset()) {
								break;
							}
						} catch (Exception e) {
						}
					}
				}
			}
		});
		service.shutdown();
	}

	private synchronized void loadXML(String filename) {
		String logfn = FilenameUtils.getName(filename);
		try {
			dao.loadResource(new File(filename));
			System.err.println(logfn + " 加载完成");
		} catch (Exception e) {
			System.err.println(logfn + " 加载失败" + e.getMessage());
		}
	}
}

反正,暂时我是看不懂,感觉太高端了,总有一天我有看懂的时候,,,,,

大神,工作经验5年,编程经验,10年,90后。

时间: 2024-11-02 18:55:15

监听文件修改,自动加载xml文件。的相关文章

PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间_php实例

PHP前言: •动态地创建属性和方法 •对象的复制 •对象的比较 •加载指定的文件 •自动加载类文件 •命名空间 示例 1.类的相关知识点 3(动态地创建属性和方法) class/class3.php <?php /** * 类的相关知识点 3(动态地创建属性和方法) */ // 用于演示如何动态地创建属性(这就是 php 中所谓的重载) class Class1 { // __set 魔术方法,当设置的属性不存在或者不可访问(private)时就会调用此函数 public function _

xml-W3C浏览器如何加载XML文件?

问题描述 W3C浏览器如何加载XML文件? 如题,Chrome.FireFox.Opera.Safari如何加载XML文件?load()方法仅只适合于某些版本的Firefox和Opera 解决方案 用ajax,所有浏览器都持支持,xhr.responseXML就是xmldom javascript加载xml文件 解决方案二: 针对不同浏览器加载不同的js读取

php使用simplexml_load_file加载XML文件并显示XML的方法_php技巧

本文实例讲述了php使用simplexml_load_file加载XML文件并显示XML的方法.分享给大家供大家参考.具体实现方法如下: <?php $xml = simplexml_load_file("sample.xml"); echo htmlspecialchars($xml->asXML()); ?> sample.xml文件内容如下 <library> <book> <title>A</title> <

js load加载xml文件load方法执行不了,被try出去了

问题描述 js load加载xml文件load方法执行不了,被try出去了 try{ xmlDoc.async=false; var test =xmlDoc.load("xml/book.xml"); } catch(e){ alert("-----:error "); } 我这代码在执行的时候到xmlDoc.load这里就被try出去了,我在网上看到很多人都是这样加载的,请问这些写有什么问题吗 解决方案 被try出去是什么意思?报错了?

javascript实现加载xml文件的方法_javascript技巧

本文实例讲述了javascript加载xml文件的方法.分享给大家供大家参考,具体如下: //需要读取的xml文件 var uRl = "jsReadXml.xml"; var xmlDoc; //初始化,给上述定义变量赋值 // function showcurcity(){ if(window.ActiveXObject) { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="fal

无效的Resx文件,未能加载 .RESX 文件中使用的类型。

问题描述 编译师兄做的C#项目,出现错误如下:错误17无效的Resx文件.未能加载.RESX文件中使用的类型Syncfusion.Windows.Forms.Tools.XPMenus.ImageExt,Syncfusion.Tools.Windows,Version=7.202.0.37,Culture=neutral,PublicKeyToken=3d67ed1f87d44c89.请确保已在项目中添加了必要的引用.编译环境为VS2005+SP1,装过VS2010,但已经将其卸载.随便新建一个

js加载xml文件多种方法(兼容ff,IE6+,Opera)

//方法一 var xmldoc;  try{//ie   //创建空的微软 xml 文档对象   xmldoc=new activexobject("microsoft.xmldom");  }catch(e){   try{//ff    //创建空的 xml 文档对象    xmldoc=document.implementation.createdocument("","",null);   }catch(e){    alert(e.m

php自动加载类

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的

php自动加载

php加载文件方式: 1.include,include_once,requice,requice_one常规加载 2.__autoload() 3.spl_autoload_register() 常规加载方式 假设我们有一个类文件A.php,里面定义了一个名字为A的类: <?php class A { public function __construct() { echo 'Got it.'; } } 然后我们有一个index.php需要用到这个类A,常规的写法就是 <?php requi