Browse Source

创建索引时先暂时关闭实时更新服务;IndexWriter不再每次修改索引后就关闭;清理旧索引过程由直接删除文件改为调用lucene的接口(不再使用的索引文件会在下次commit时删除)

sunyj 9 years ago
parent
commit
7669e89d6b

+ 7 - 0
search-console/src/main/java/com/uas/search/console/jms/AQListener.java

@@ -136,6 +136,13 @@ public class AQListener {
 		return message;
 	}
 
+	/**
+	 * @return 索引实时更新服务是否正在运行
+	 */
+	public boolean isRunning() {
+		return consumer != null;
+	}
+
 	/**
 	 * 对得到的队列消息进行解析,之后根据解析出来的对象,对lucene索引进行添加、更新或删除操作
 	 * 

+ 29 - 10
search-console/src/main/java/com/uas/search/console/service/impl/IndexServiceImpl.java

@@ -38,6 +38,7 @@ import com.uas.search.console.dao.PurchaseDetailSimpleInfoDao;
 import com.uas.search.console.dao.PurchaseInvoiceDetailSimpleInfoDao;
 import com.uas.search.console.dao.PurchaseInvoiceSimpleInfoDao;
 import com.uas.search.console.dao.PurchaseSimpleInfoDao;
+import com.uas.search.console.jms.AQListener;
 import com.uas.search.console.model.BrandSimpleInfo;
 import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
@@ -105,6 +106,14 @@ public class IndexServiceImpl implements IndexService {
 
 	private FSDirectory directory;
 
+	@Autowired
+	private AQListener aqListener;
+
+	/**
+	 * 是否正在创建索引
+	 */
+	private boolean creatingIndex = false;
+
 	private static final int PAGE_SIZE = 1000;
 
 	private Logger logger = Logger.getLogger(IndexServiceImpl.class);
@@ -120,22 +129,29 @@ public class IndexServiceImpl implements IndexService {
 
 	@Override
 	public Long createIndexs() {
-		try {
-			if (IndexWriter.isLocked(directory)) {
-				throw new SearchException("索引文件被锁定");
-			}
-		} catch (IOException e1) {
-			e1.printStackTrace();
+		if (creatingIndex) {
+			throw new SearchException("已存在线程在创建索引,不可重复请求");
+		}
+		creatingIndex = true;
+		// 如果索引实时更新处于开启状态,需要暂时关闭(以免两者同时操作索引出现问题)
+		if (aqListener.isRunning()) {
+			logger.info("索引实时更新服务正在运行,尝试关闭索引实时更新服务...");
+			aqListener.stop();
 		}
 
 		// 清除旧索引
-		File file = new File(SearchConstants.INDEX_DIR);
-		if (file.isDirectory()) {
-			clearDir(file);
-		}
+		// File file = new File(SearchConstants.INDEX_DIR);
+		// if (file.isDirectory()) {
+		// clearDir(file);
+		// }
 
 		try {
 			indexWriter = indexWriterManager.get();
+			// 删除旧索引
+			logger.info("正在清理旧索引...");
+			indexWriter.deleteAll();
+			indexWriter.commit();
+			logger.info("旧索引清理完毕");
 			Long startTime = new Date().getTime();
 
 			Long kindSize = createKindIndexs();
@@ -193,6 +209,8 @@ public class IndexServiceImpl implements IndexService {
 		} catch (InterruptedException e) {
 			e.printStackTrace();
 		} finally {
+			aqListener.start();
+			creatingIndex = false;
 			indexWriterManager.release();
 		}
 
@@ -333,6 +351,7 @@ public class IndexServiceImpl implements IndexService {
 	}
 
 	@Override
+	// TODO delete
 	public Long createOrderAndPurchaseIndexes() {
 		try {
 			indexWriter = indexWriterManager.get();

+ 35 - 3
search-console/src/main/java/com/uas/search/console/support/IndexWriterManager.java

@@ -41,11 +41,14 @@ public class IndexWriterManager {
 	}
 
 	/**
-	 * 对索引的更改一般不会很频繁,每次更改后关闭IndexWriter可能比一直打开开销更小
-	 * 不关闭的话,多次创建索引会抛出NoSuchFileException异常(IndexWriter保留的是旧信息?未更新?)
+	 * 释放对indexWriter的使用
 	 */
 	public synchronized void release() {
-		// TODO
+		/*
+		 * 对索引的更改一般不会很频繁,每次更改后关闭IndexWriter可能比一直打开开销更小
+		 * 不关闭的话,多次创建索引会抛出NoSuchFileException异常(IndexWriter保留的是旧信息?未更新?)
+		 */
+		// TODO 测试后删除
 		// 因保存索引后,调用release一直卡在indexWriter.close方法处,所以每次索引更改后不再关闭indexWriter,待测试没有问题才能删除
 		// if (indexWriter != null) {
 		// try {
@@ -58,6 +61,35 @@ public class IndexWriterManager {
 		doneUsing();
 	}
 
+	/**
+	 * 用于关闭indexWriter,之后通过get方法获取时,会重新打开
+	 * 
+	 * @throws InterruptedException
+	 */
+	//TODO delete
+	public synchronized void reset() throws InterruptedException {
+		System.out.println("reseting");
+		System.out.println("reset startusing");
+		startUsing();
+		System.out.println("reset startused");
+		if (indexWriter != null) {
+			try {
+				System.out.println("reset deleteAlling");
+				indexWriter.deleteAll();
+				System.out.println("reset deleteAlled");
+//				System.out.println("reset startclosing");
+//				indexWriter.close();
+//				System.out.println("reset startclosed");
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+//			indexWriter = null;
+		}
+		System.out.println("reset doneusing");
+		doneUsing();
+		System.out.println("reset doneused");
+	}
+
 	private boolean using = false;
 
 	private synchronized void startUsing() throws InterruptedException {