Parcourir la source

dump and restore

zhourui il y a 5 ans
Parent
commit
603317f66f

+ 11 - 3
o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java

@@ -39,6 +39,7 @@ import com.x.base.core.project.config.StorageMappings;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ClassLoaderTools;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
 
@@ -78,7 +79,7 @@ public class DumpData {
 			this.pureGsonDateFormated = XGsonBuilder.instance();
 		}
 
-		public void run() {
+		private Thread dumpDataThread = new Thread(() -> {
 			try {
 				List<String> classNames = entities();
 				logger.print("find {} data to dump, start at {}.", classNames.size(), DateTools.format(start));
@@ -95,9 +96,12 @@ public class DumpData {
 					EntityManagerFactory emf = null;
 					EntityManager em = null;
 					try {
+						Thread.currentThread().setContextClassLoader(ClassLoaderTools.urlClassLoader(false,false,false,
+								false, false, Config.dir_local_temp_classes().toPath()));
 						Thread.currentThread().setName(DumpData.class.getName() + ":" + className);
 						@SuppressWarnings("unchecked")
-						Class<JpaObject> cls = (Class<JpaObject>) Class.forName(className);
+						Class<JpaObject> cls = (Class<JpaObject>) Thread.currentThread().getContextClassLoader()
+								.loadClass(className);
 						emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(), xml.getFileName().toString(),
 								PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable()));
 						em = emf.createEntityManager();
@@ -120,6 +124,10 @@ public class DumpData {
 			} catch (Exception e) {
 				e.printStackTrace();
 			}
+		}, "dumpDataThread");
+
+		public void run() {
+			dumpDataThread.start();
 		}
 
 		@SuppressWarnings("unchecked")
@@ -130,7 +138,7 @@ public class DumpData {
 				return list;
 			}
 			for (String str : (List<String>) Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES)) {
-				Class<?> cls = Class.forName(str);
+				Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(str);
 				ContainerEntity containerEntity = cls.getAnnotation(ContainerEntity.class);
 				if (Objects.equals(containerEntity.reference(), Reference.strong)) {
 					list.add(str);

+ 2 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java

@@ -12,6 +12,7 @@ import com.x.cms.core.entity.FileInfo;
 import com.x.cms.core.entity.Log;
 import com.x.cms.core.entity.ReadRemind;
 import com.x.cms.core.entity.Review;
+import com.x.query.core.entity.Item;
 
 public class EraseContentCms extends EraseContent {
 
@@ -29,6 +30,7 @@ public class EraseContentCms extends EraseContent {
 		addClass(DocumentCommentCommend.class);
 		addClass(DocumentCommend.class);
 		addClass(CmsBatchOperation.class);
+		addClass(Item.class);
 		this.run();
 		return true;
 	}

+ 6 - 2
o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java

@@ -38,6 +38,7 @@ import com.x.base.core.project.config.StorageMappings;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ClassLoaderTools;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.ListTools;
 
@@ -100,10 +101,13 @@ public class RestoreData {
 				AtomicLong total = new AtomicLong(0);
 				stream.forEach(className -> {
 					String nameOfThread = Thread.currentThread().getName();
-					Thread.currentThread().setName(RestoreData.class.getName() + ":" + className);
 					try {
+						Thread.currentThread().setContextClassLoader(ClassLoaderTools.urlClassLoader(false, false,
+								false, false, false, Config.dir_local_temp_classes().toPath()));
+						Thread.currentThread().setName(RestoreData.class.getName() + ":" + className);
 						@SuppressWarnings("unchecked")
-						Class<JpaObject> cls = (Class<JpaObject>) Class.forName(className);
+						Class<JpaObject> cls = (Class<JpaObject>) Thread.currentThread().getContextClassLoader()
+								.loadClass(className);
 						logger.print("restore data({}/{}): {}.", idx.getAndAdd(1), classNames.size(), cls.getName());
 						long size = restore(cls, xml);
 						total.getAndAdd(size);