Browse Source

定时更新虚拟列时,对参数进行深克隆,以免真正执行时,参数已被修改

sunyj 9 years ago
parent
commit
5cbd71b0f5

+ 7 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/Application.java

@@ -1,5 +1,7 @@
 package com.uas.search.console.b2b;
 
+import java.io.IOException;
+import java.io.NotSerializableException;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,7 +24,7 @@ import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
 @SpringBootApplication(scanBasePackages = "com.uas.search.console.b2b")
 @ImportResource({ "classpath:spring/dubbo.xml" })
 public class Application {
-	public static void main(String[] args) {
+	public static void main(String[] args) throws NotSerializableException, ClassNotFoundException, IOException {
 		SpringApplication application = new SpringApplication(Application.class);
 		application.addListeners(new ContextUtils());
 		application.run(args);
@@ -32,8 +34,11 @@ public class Application {
 
 	/**
 	 * 开启定时任务
+	 * @throws IOException 
+	 * @throws ClassNotFoundException 
+	 * @throws NotSerializableException 
 	 */
-	public static void startTask() {
+	public static void startTask() throws NotSerializableException, ClassNotFoundException, IOException {
 		SystemProperties systemProperties = ContextUtils.getBean(SystemProperties.class);
 		if (systemProperties.isTaskAutoStart()) {
 			UpdateVirtualColumnService updateVirtualColumnService = ContextUtils

+ 6 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/ScheduleController.java

@@ -1,5 +1,7 @@
 package com.uas.search.console.b2b.controller;
 
+import java.io.IOException;
+import java.io.NotSerializableException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -33,9 +35,11 @@ public class ScheduleController {
 	@ResponseBody
 	public String updateVirtualColumns(@RequestParam(required = true) String tableName,
 			@RequestParam(required = true) String fields, @RequestParam(required = true) Integer hour,
-			@RequestParam(required = true) Integer minute, @RequestParam(required = true) Integer second) throws ClassNotFoundException {
+			@RequestParam(required = true) Integer minute, @RequestParam(required = true) Integer second)
+			throws ClassNotFoundException, NotSerializableException, IOException {
 		Table_name table = Table_name.valueOf(tableName.toUpperCase());
-		if (table != Table_name.PURC$INQUIRYMOULD && table != Table_name.PURC$INQUIRYITEMS && table != Table_name.PURC$TENDER) {
+		if (table != Table_name.PURC$INQUIRYMOULD && table != Table_name.PURC$INQUIRYITEMS
+				&& table != Table_name.PURC$TENDER) {
 			return "不支持更新虚拟列overdue索引:" + tableName;
 		}
 		Map<String, Class<?>> map = new HashMap<>();

+ 0 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/core/advice/ExceptionHandlerAdvice.java

@@ -52,7 +52,6 @@ public class ExceptionHandlerAdvice {
 		logger.error("RuntimeException", ex);
 		HttpHeaders headers = new HttpHeaders();
 		headers.add("Content-Type", "application/text; charset=utf-8");
-		ex.printStackTrace();
 		return new ResponseEntity<String>("\u7CFB\u7EDF\u9519\u8BEF", headers, HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 

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

@@ -1,6 +1,5 @@
 package com.uas.search.console.b2b.jms;
 
-import java.sql.SQLException;
 import java.util.Properties;
 
 import javax.jms.JMSException;
@@ -85,17 +84,15 @@ public class AQListener {
 							// 如果时间过长,实时更新速度很慢
 							Thread.sleep(waitInterval * 1000);
 						}
-					} catch (InterruptedException e1) {
-						e1.printStackTrace();
+					} catch (InterruptedException e) {
+						logger.error("", e);
 					}
 					AQjmsAdtMessage adtMessage = (AQjmsAdtMessage) message;
 					try {
 						QueueMessageTypeFactory payload = (QueueMessageTypeFactory) adtMessage.getAdtPayload();
 						// 对出队的消息进行解析、处理
 						process(payload.getMessage());
-					} catch (JMSException e) {
-						logger.error("", e);
-					} catch (SQLException e) {
+					} catch (Throwable e) {
 						logger.error("", e);
 					}
 				}
@@ -110,7 +107,7 @@ public class AQListener {
 				try {
 					consumer.close();
 				} catch (JMSException e1) {
-					e1.printStackTrace();
+					logger.error("", e1);
 				}
 				consumer = null;
 			}

+ 3 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/UpdateVirtualColumnService.java

@@ -1,5 +1,7 @@
 package com.uas.search.console.b2b.service;
 
+import java.io.IOException;
+import java.io.NotSerializableException;
 import java.util.Map;
 
 import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
@@ -30,6 +32,6 @@ public interface UpdateVirtualColumnService {
 	 * @return
 	 */
 	public <T> DailyTaskInformation newDailyTask(Class<T> clazz, Map<String, Class<?>> fields, Integer hour,
-			Integer minute, Integer second);
+			Integer minute, Integer second) throws NotSerializableException, ClassNotFoundException, IOException;
 
 }

+ 8 - 3
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/UpdateVirtualColumnServiceImpl.java

@@ -2,6 +2,8 @@ package com.uas.search.console.b2b.service.impl;
 
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.NotSerializableException;
 import java.io.PrintWriter;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -32,6 +34,7 @@ import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
 import com.uas.search.console.b2b.util.FileUtils;
+import com.uas.search.console.b2b.util.ObjectUtil;
 import com.uas.search.console.b2b.util.SearchUtils;
 
 /**
@@ -145,8 +148,8 @@ public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnServic
 	}
 
 	@Override
-	public <T> DailyTaskInformation newDailyTask(final Class<T> clazz, final Map<String, Class<?>> fields, Integer hour,
-			Integer minute, Integer second) {
+	public <T> DailyTaskInformation newDailyTask(final Class<T> clazz, Map<String, Class<?>> fields, Integer hour,
+			Integer minute, Integer second) throws NotSerializableException, ClassNotFoundException, IOException {
 		if (hour == null || minute == null || second == null) {
 			throw new NullPointerException();
 		}
@@ -155,10 +158,12 @@ public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnServic
 		}
 
 		String title = "更新虚拟列索引" + fields + ":" + ClassAndTableNameUtils.toTableName(clazz).value().toLowerCase();
+		// 必须对fields进行克隆,否则,当execute真正运行时,fields可能已被外部方法更改了
+		final Map<String, Class<?>> cloneFields = ObjectUtil.clone(fields);
 		Executable command = new Executable() {
 			@Override
 			public String execute() {
-				updateVirtualColumn(clazz, fields);
+				updateVirtualColumn(clazz, cloneFields);
 				return "success";
 			}
 		};

+ 38 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/util/ObjectUtil.java

@@ -0,0 +1,38 @@
+package com.uas.search.console.b2b.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+/**
+ * 对象辅助类
+ * 
+ * @author sunyj
+ * @since 2017年3月24日 上午10:28:40
+ */
+public class ObjectUtil {
+
+	/**
+	 * 深克隆对象
+	 * 
+	 * @param t
+	 *            将克隆的对象,需实现Serializable
+	 * @return
+	 * @throws IOException
+	 * @throws ClassNotFoundException
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T> T clone(T t) throws IOException, ClassNotFoundException, NotSerializableException {
+		if (t == null) {
+			return null;
+		}
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		new ObjectOutputStream(out).writeObject(t);
+		ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
+		return (T) in.readObject();
+	}
+
+}

+ 0 - 1
search-console/src/main/java/com/uas/search/console/core/advice/ExceptionHandlerAdvice.java

@@ -52,7 +52,6 @@ public class ExceptionHandlerAdvice {
 		logger.error("RuntimeException", ex);
 		HttpHeaders headers = new HttpHeaders();
 		headers.add("Content-Type", "application/text; charset=utf-8");
-		ex.printStackTrace();
 		return new ResponseEntity<String>("\u7CFB\u7EDF\u9519\u8BEF", headers, HttpStatus.INTERNAL_SERVER_ERROR);
 	}
 

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

@@ -1,6 +1,5 @@
 package com.uas.search.console.jms;
 
-import java.sql.SQLException;
 import java.util.Properties;
 
 import javax.jms.JMSException;
@@ -85,17 +84,15 @@ public class AQListener {
 							// 如果时间过长,实时更新速度很慢
 							Thread.sleep(waitInterval * 1000);
 						}
-					} catch (InterruptedException e1) {
-						e1.printStackTrace();
+					} catch (InterruptedException e) {
+						logger.error("", e);
 					}
 					AQjmsAdtMessage adtMessage = (AQjmsAdtMessage) message;
 					try {
 						QueueMessageTypeFactory payload = (QueueMessageTypeFactory) adtMessage.getAdtPayload();
 						// 对出队的消息进行解析、处理
 						process(payload.getMessage());
-					} catch (JMSException e) {
-						logger.error("", e);
-					} catch (SQLException e) {
+					} catch (Throwable e) {
 						logger.error("", e);
 					}
 				}
@@ -110,7 +107,7 @@ public class AQListener {
 				try {
 					consumer.close();
 				} catch (JMSException e1) {
-					e1.printStackTrace();
+					logger.error("", e1);
 				}
 				consumer = null;
 			}