osc的大神们这个问题该如何解决啊

帅狗 发布于 2015/01/23 14:51
阅读 104
收藏 0

下面的代码是操作lucene的indexWriter和indexSearcher对象的创建和关闭的,static代码块中的Runtime方法是在jvm退出的时候执行,即线程结束的时候执行,我用junit测试一切ok,但是问题来了,我在action中调用这个工具类static中的那段代码跟本没有执行,是不是action的线程是一直存在的啊,即jvm没有退出,所以执行不到?

package com.erp.travel.common.utils;

import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.search.IndexSearcher;

public class LuceneUtils {
	private static IndexWriter indexWriter;
	private static IndexSearcher indexSearcher;
	//初始化
	static{
		try {
			System.out.println("初始化IndexWriter对象");
			indexWriter = new IndexWriter(Configuration.getDirectory(),Configuration.getAnalyzer(),MaxFieldLength.LIMITED);
			//当JVM退出的时候,执行的方法,即线程结束的时候,执行的方法
			Runtime.getRuntime().addShutdownHook(new Thread(){
				@Override
				public void run() {
					//关闭IndexWriter
					closeIndexWriter();
					//关闭IndexSearcher
					closeIndexSearcher();
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//获取IndexWriter
	public static IndexWriter getIndexWriter() {
		System.out.println("获取IndexWriter对象");
		return indexWriter;
	}
	
	//获取IndexSearcher
	public static IndexSearcher getIndexSearcher() {
		//同时要实例化IndexSearcher对象
		if(indexSearcher==null){
			try {
				System.out.println("获取IndexSearcher对象:-----"+indexSearcher);
				indexSearcher = new IndexSearcher(Configuration.getDirectory());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return indexSearcher;
	}
	
	//关闭IndexWriter
	public static void closeIndexWriter(){
		if(indexWriter!=null){
			try {
				System.out.println("关闭IndexWriter对象");
				indexWriter.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	//关闭IndexSearcher
	public static void closeIndexSearcher(){
		if(indexSearcher!=null){
			try {
				System.out.println("关闭IndexSearcher对象");
				indexSearcher.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}


	/**
	 * 问题:同时实例化IndexWriter和IndexSearcher
		     如果使用IndexWriter操作索引库添加一条数据6
		     此时使用IndexSearcher去检索索引库,很可能检索不到最新第6条数据
		
	   解决:只用使用IndexWriter执行增、删、改操作索引库的时候,将IndexSearcher关闭,重新创建IndexSearcher对象
	 */
	//当索引库的数据发生变化(增删改)的时候,需要执行的方法
	public static void changeIndexWriter(){
		if(indexSearcher!=null){
			try {
				System.out.println("当执行了增删改的操作,关闭indexSearcher对象");
				//关闭
				indexSearcher.close();
				//将indexSearcher置null
				indexSearcher = null;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	
}




加载中
0
小红书
小红书

jvm退出了java还玩什么。。。

返回顶部
顶部