Sfoglia il codice sorgente

更新索引时不再对数据进行比较;限制上传文件大小上限;其他小的修改

sunyj 9 anni fa
parent
commit
4e5d16ac9b

+ 4 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/IndexController.java

@@ -41,9 +41,11 @@ public class IndexController {
 			for (String str : strs) {
 				tableNameList.add(Table_name.valueOf(str.toUpperCase()));
 			}
-			return "Indexes created success in " + indexService.createIndexs(tableNameList, fromFiles) + " ms.";
+			return String.format("Indexes created success in %.2fs",
+					indexService.createIndexs(tableNameList, fromFiles) / 1000.0);
 		} else {
-			return "Indexes created success in " + indexService.createIndexs(null, fromFiles) + " ms.";
+			return String.format("Indexes created success in %.2fs",
+					indexService.createIndexs(null, fromFiles) / 1000.0);
 		}
 	}
 

+ 22 - 35
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageParser.java

@@ -1,18 +1,18 @@
 package com.uas.search.console.b2b.jms;
 
-import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.service.SearchService.Table_name;
-import com.uas.search.console.b2b.core.util.ContextUtils;
 import com.uas.search.console.b2b.model.ParsedQueueMessage;
-import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
 
 /**
@@ -25,9 +25,6 @@ import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
 @Service
 public class QueueMessageParser {
 
-	private InnerSearchService innerSearchService = ContextUtils.getApplicationContext().getBean("searchServiceImpl",
-			InnerSearchService.class);
-
 	/**
 	 * 对得到的json消息进行解析
 	 * 
@@ -84,39 +81,29 @@ public class QueueMessageParser {
 	 * @return 实体对象列表
 	 */
 	private <T> List<T> parseToList(JSONObject jsonObject, Class<T> clazz) {
-		//TODO 优化:HashSet<Long>、findAll
-		Object[] ids = jsonObject.getJSONArray("ids").toArray();
-		List<T> list = new ArrayList<>();
 		// 获取实体的dao
 		JpaRepository<T, Long> dao = ClassAndTableNameUtils.getDao(clazz);
+		Set<Long> ids = getIds(jsonObject.getJSONArray("ids"));
+		return dao.findAll(ids);
+	}
+
+	/**
+	 * 从队列消息中获取id(同时消除重复id)
+	 * 
+	 * @param jsonArray
+	 *            队列消息中json格式的id
+	 * @return
+	 */
+	private Set<Long> getIds(JSONArray jsonArray) {
+		if (jsonArray == null || jsonArray.isEmpty()) {
+			return null;
+		}
+		Object[] ids = jsonArray.toArray();
+		Set<Long> idsSet = new HashSet<>();
 		for (int i = 0; i < ids.length; i++) {
-			Long id = Long.parseLong(ids[i].toString());
-			// 更新索引前,数据库中的数据与本地索引中的数据进行比较
-			T element = dao.findOne(id);
-			T localElement = innerSearchService.getObjectById(id, clazz);
-			// delete操作
-			if (jsonObject.getString("method").equalsIgnoreCase("delete")) {
-				if (element != null) {
-					// 删除之后,数据还存在,并且与本地索引数据一样,说明是进行了回退,或者重新插入了相同的数据,不对索引进行更新
-					if (localElement == null || localElement.equals(element)) {
-						element = null;
-					}
-				} else {
-					element = localElement;
-				}
-			}
-			// insert和update需分开对待(update不进行下列判断,直接更新)
-			// update来源还可能来自从表的变化,而equals是不比较从表的
-			// (如果比较的话,对于insert操作,即使是数据没变,而从表数据在之后变化了的话,也会视为两个数据,导致索引无法删除,之后会添加重复的索引)
-			else if (jsonObject.getString("method").equalsIgnoreCase("insert")) {
-				// 本地有相同的数据,不更新索引
-				if (localElement != null && localElement.equals(element)) {
-					element = null;
-				}
-			}
-			list.add(element);
+			idsSet.add(Long.parseLong(ids[i].toString()));
 		}
-		return list;
+		return idsSet;
 	}
 
 }

+ 11 - 8
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/IndexServiceImpl.java

@@ -92,16 +92,19 @@ public class IndexServiceImpl implements IndexService {
 			tableNames = ClassAndTableNameUtils.getTableNames();
 		}
 		Long startTime = new Date().getTime();
-		// 创建各个表的索引
-		for (Table_name tableName : tableNames) {
-			// 只有明确指定不从本地文件读取数据时,才从数据库获取数据建立索引
-			if (fromFiles != null && !fromFiles) {
-				createIndexes(ClassAndTableNameUtils.toClass(tableName));
-			} else {
-				createIndexesFromFiles(ClassAndTableNameUtils.toClass(tableName));
+		try {
+			// 创建各个表的索引
+			for (Table_name tableName : tableNames) {
+				// 只有明确指定不从本地文件读取数据时,才从数据库获取数据建立索引
+				if (fromFiles != null && !fromFiles) {
+					createIndexes(ClassAndTableNameUtils.toClass(tableName));
+				} else {
+					createIndexesFromFiles(ClassAndTableNameUtils.toClass(tableName));
+				}
 			}
+		} finally {
+			creatingIndex = false;
 		}
-		creatingIndex = false;
 		Long endTime = new Date().getTime();
 		logger.info(String.format("索引创建成功, 共用时间%.2fs\n", (endTime - startTime) / 1000.0));
 		return endTime - startTime;

+ 2 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/support/IndexSearcherManager.java

@@ -52,7 +52,7 @@ public class IndexSearcherManager {
 	 *            表名
 	 * @return 指定表的FSDirectory
 	 */
-	public synchronized FSDirectory warm(Table_name tableName) {
+	private synchronized FSDirectory warm(Table_name tableName) {
 		String indexPath = SearchUtils.getIndexPath(tableName);
 		FSDirectory directory = null;
 		IndexSearcher indexSearcher = indexSearchers.get(tableName);
@@ -76,7 +76,7 @@ public class IndexSearcherManager {
 						e.printStackTrace();
 					}
 				} else {
-					logger.error("索引文件不存在!");
+					logger.error("索引文件不存在:" + tableName.value());
 				}
 			}
 		} catch (IOException e) {

+ 6 - 6
search-console-b2b/src/main/webapp/resources/js/listenDetails/app.js

@@ -68,9 +68,10 @@ function listenDetails(page, size, searchContent) {
 			if (!data.totalElement) {
 				showErrorMessage("数量为0");
 				totalPage = 0;
+				totalElement = 0;
 				page = 0;
-				$("#totalPage").html(totalPage);
-				$("#pageIndex").val(page);
+				first = true;
+				last = true;
 			} else {
 				totalPage = data.totalPage;
 				totalElement = data.totalElement;
@@ -80,16 +81,15 @@ function listenDetails(page, size, searchContent) {
 				last = data.last;
 				var content = data.content;
 				numberOfCurrentPage = content.length;
-				$("#totalElement").html(totalElement);
-				$("#totalPage").html(totalPage);
-				$("#pageIndex").val(page);
 				for (var i = 0; i < numberOfCurrentPage; i++) {
 					addList(i, content[i].tableName, content[i].ids,
 							content[i].method, content[i].modifyTime,
 							content[i].messageId)
 				}
-
 			}
+			$("#totalElement").html(totalElement);
+			$("#totalPage").html(totalPage);
+			$("#pageIndex").val(page);
 			spinner = hideLoading(spinner);
 		},
 		error : function(XMLHttpRequest) {

+ 9 - 15
search-console-b2b/src/main/webapp/resources/js/upload/app.js

@@ -1,29 +1,23 @@
-var size = 0;
-
+//上传文件最大值(MB)
+var fileMaxSize = 512;
 $("#upload").click(upload);
 
-// 绑定所有type=file的元素的onchange事件的处理函数
-$(':file').change(function() {
-	var file = this.value;
-	if (file) {
-		name = file.name;
-		size = file.size;
-		type = file.type;
-		// url = window.URL.createObjectURL(file);
-	}
-});
-
 /**
  * 上传文件
  */
 function upload() {
 	$('#result').html("");
-	var value = document.getElementById("file").value;
-	if (!value) {
+	var input = document.getElementById("file");
+	if (!input.value) {
 		$('#progressDiv').css("display", "hidden");
 		$("#result").html("文件为空,无法进行上传!");
 		return;
 	}
+	if (input.files[0].size > fileMaxSize * 1024 * 1024) {
+		$('#progressDiv').css("display", "hidden");
+		$("#result").html("文件大小不能超过" + fileMaxSize + "MB!");
+		return;
+	}
 	// 创建FormData对象,初始化为form表单中的数据
 	var formData = new FormData($('form')[0]);