diff --git a/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java b/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java
index 0238d31d8c2362c5a0e50e1588001826b6f2bdfd..744446efabf5d759dcfcead7c9bb3c9b0ec1f1bd 100644
--- a/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java
+++ b/ext/org.tinygroup.ehcache/src/main/java/org/tinygroup/cache/ehcache/EhCache.java
@@ -136,7 +136,8 @@ public class EhCache implements Cache {
}
public void destroy() {
- cache.dispose();
+ //Shutdown the singleton CacheManager
+ manager.shutdown();
}
}
diff --git a/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java b/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java
index c7ad8e722f49e5b15451ffb33abad64340b55bbe..f03cd425a7dfe7a08a18c72f13375bb3ad8163ef 100644
--- a/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java
+++ b/ext/org.tinygroup.jcscache/src/main/java/org/tinygroup/cache/jcs/JcsCache.java
@@ -144,8 +144,8 @@ public class JcsCache implements Cache {
}
public void destroy() {
- jcs.dispose();
CompositeCache.elementEventQ.destroy();
+ jcs.dispose();
}
}
diff --git a/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java b/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java
index 9139b601444f057628c0624e90234a30433512b2..004da8f90b8556b1f6f1955d1dc2690798901da7 100644
--- a/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java
+++ b/framework/org.tinygroup.dict/src/main/java/org/tinygroup/dict/applicationprocessor/DictLoadProcessor.java
@@ -20,6 +20,7 @@ import org.tinygroup.application.ApplicationProcessor;
import org.tinygroup.cache.CacheInitConfig;
import org.tinygroup.config.impl.AbstractConfiguration;
import org.tinygroup.dict.DictManager;
+import org.tinygroup.logger.LogLevel;
/**
*
@@ -71,7 +72,10 @@ public class DictLoadProcessor extends AbstractConfiguration implements Applicat
}
public void stop() {
-
+ logger.logMessage(LogLevel.INFO, "开始卸载字典缓存");
+ //Shutdown the Cache
+ manager.getCache().destroy();
+ logger.logMessage(LogLevel.INFO, "卸载字典缓存完成");
}
public void setApplication(Application application) {
diff --git a/framework/org.tinygroup.ini/src/test/resources/test2.ini b/framework/org.tinygroup.ini/src/test/resources/test2.ini
index a9cc06bbdeaeb231506ad2b001c238f155b95d2b..3431061a91a3c3f6ef9303e67d882f70c8bc1344 100644
--- a/framework/org.tinygroup.ini/src/test/resources/test2.ini
+++ b/framework/org.tinygroup.ini/src/test/resources/test2.ini
@@ -1,8 +1,8 @@
-[Section1]
-name=b
-age=11
-grade=3
-type=a
-[Section2]
-left=1
-right=1
+[Section1]
+name=b
+age=11
+grade=3
+type=a
+[Section2]
+left=1
+right=1
diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java
index 845a58ccaeffc98f687182ecf8939eba70a22fd6..c857b293954bc47b8545464ef608e551fdb27439 100644
--- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java
+++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/Logger.java
@@ -218,5 +218,11 @@ public interface Logger {
* 设置限制记录数
*/
public void setMaxBufferRecords(int bufferRecords);
+
+ /**
+ * 删除ThreadLocal本地变量
+ * 避免停止Tomcat内存泄露检测警告
+ */
+ public void removeThreadLocal();
}
\ No newline at end of file
diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java
index 8982c792e28f5caec9d477918dab33f3fe2f70fe..5e5b79ffba94ed17756ae7cdebed7d850eca5f9b 100644
--- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java
+++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/LoggerFactory.java
@@ -16,7 +16,9 @@
package org.tinygroup.logger;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.Map.Entry;
import org.slf4j.ILoggerFactory;
import org.tinygroup.logger.impl.LoggerImpl;
@@ -79,4 +81,15 @@ public final class LoggerFactory {
public synchronized static void setThreadLogLevel(LogLevel logLevel){
threadLogLevel.set(logLevel);
}
+
+ /**
+ * 移除线程本地变量,避免停止Tomcat线程告警
+ */
+ public static void removeThreadLocals() {
+ Iterator> it = loggers.entrySet().iterator();
+ while (it.hasNext()) {
+ Logger logger = it.next().getValue();
+ logger.removeThreadLocal();
+ }
+ }
}
diff --git a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java
index 84490e07f6f52c9dcbf38fbb9ac1a322d8895295..047d109facb6e9ec07241f991397c2ce551f5151 100644
--- a/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java
+++ b/framework/org.tinygroup.logger/src/main/java/org/tinygroup/logger/impl/LoggerImpl.java
@@ -479,5 +479,9 @@ public class LoggerImpl implements Logger {
public void setMaxBufferRecords(int maxBufferRecords) {
this.maxBufferRecords = maxBufferRecords;
}
+
+ public void removeThreadLocal() {
+ threadLocal.remove();
+ }
}
diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java
index 3675179c4b7e9999c5da162df5182b3c76490725..08539a75df83b0f1820a974895ec22a1820f2386 100644
--- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java
+++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/AbstractJobCenter.java
@@ -31,7 +31,7 @@ import java.util.List;
*/
public class AbstractJobCenter implements JobCenter {
private static Logger logger = LoggerFactory.getLogger(AbstractJobCenter.class);
- private RmiServer rmiServer;
+ private RmiServer rmiServer;//RMI服务器
private WorkQueue workQueue;
public WorkQueue getWorkQueue() {
@@ -56,11 +56,13 @@ public class AbstractJobCenter implements JobCenter {
}
private void registerParallelObject(String objectType, ParallelObject parallelObject) throws RemoteException {
+ //parallelObject实例(Worker/Foreman)注册到rmiServer的RMI服务器
rmiServer.registerLocalObject(parallelObject,
objectType + "|" + parallelObject.getType(), parallelObject.getId());
}
private void unregisterParallelObject(String objectType, ParallelObject parallelObject) throws RemoteException {
+ //卸载rmiServer上的RMI服务器上的parallelObject实例(Worker/Foreman)
rmiServer.unregisterObject(objectType + "|" + parallelObject.getType(), parallelObject.getId());
}
@@ -130,13 +132,13 @@ public class AbstractJobCenter implements JobCenter {
public Warehouse doWork(Work work) throws IOException {
String foremanType = work.getForemanType();
List foremanList = null;
- foremanList = getForemans(work, foremanType);
+ foremanList = getForemans(work, foremanType);//根据工头类型从RMI服务器中获取工头列表(本地/远程)
// 如果存在空闲的工头
- Foreman foreman = getForeman(foremanType, foremanList);
+ Foreman foreman = getForeman(foremanType, foremanList);//随机选择一个空闲工头
//获取所有能执行该任务的工人
- List workers = this.getWorkerList(work);
+ List workers = this.getWorkerList(work);//获取所有能执行该任务的工人(工人类型与工作类型关联)
//存放接受该work的工人列表
- List acceptWorkers = getAcceptWorkers(work, workers);
+ List acceptWorkers = getAcceptWorkers(work, workers);//判断工人是否愿意接受该工作
if (acceptWorkers.size() > 0) {
Warehouse outputWarehouse = foreman.work(work, cloneWorkers(acceptWorkers));
// 检查是否有子任务
diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java
index 0678134cc1ebae77a950b135c0dcccba51903173..118e72f8242ea05cec5a94fb9bf366b20e5e7efe 100644
--- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java
+++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/ForemanSelectOneWorker.java
@@ -44,10 +44,10 @@ public class ForemanSelectOneWorker extends AbstractForeman {
public Warehouse work(Work work, List workerList)
throws RemoteException {
- Worker worker = workerList.get(Util.randomIndex(workerList.size()));
+ Worker worker = workerList.get(Util.randomIndex(workerList.size()));//随机选取一个工人
List workersActived = new ArrayList();
- workersActived.add(worker);
- workerList.remove(worker);
+ workersActived.add(worker);//将该工人添加到活跃工人列表
+ workerList.remove(worker);//从空闲工人列表中去除该工人
return dealWork(work, worker, workerList, workersActived);
}
@@ -57,7 +57,7 @@ public class ForemanSelectOneWorker extends AbstractForeman {
throws RemoteException {
try {
logger.logMessage(LogLevel.DEBUG,"worker:{0}开始执行",worker.getId());
- Warehouse w = worker.work(work);
+ Warehouse w = worker.work(work);//工人工作
logger.logMessage(LogLevel.DEBUG,"worker:{0}执行完成",worker.getId());
return w;
} catch (Exception e) {
diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java
index 0ad6a13c9702ef434e99a981c1338074335170cd..fa5c8f96e793482467a18b0de6e8662dd6d3e7ac 100644
--- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java
+++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterLocal.java
@@ -33,7 +33,7 @@ public class JobCenterLocal extends AbstractJobCenter {
RmiServer rmiServer = new RmiServerImpl(port);
WorkQueue workQueue = new WorkQueueImpl();
setWorkQueue(workQueue);
- rmiServer.registerLocalObject(workQueue, "WorkQueue");
+ rmiServer.registerLocalObject(workQueue, "WorkQueue");//RMI上注册本地工作队列
setRmiServer(rmiServer);
}
diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java
index 9da8f30ed55fa330edaadf8da96b7ce6ebc9a764..c1c685c6a9bf3848b0e12258fb07244967116d1e 100644
--- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java
+++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/JobCenterRemote.java
@@ -26,7 +26,7 @@ import org.tinygroup.tinypc.WorkQueue;
public class JobCenterRemote extends AbstractJobCenter {
public JobCenterRemote(String hostName, int port,String remoteHostName,int remotePort) throws IOException {
- setRmiServer(new RmiServerImpl(hostName, port,remoteHostName,remotePort));
- setWorkQueue((WorkQueue) getRmiServer().getObject("WorkQueue"));
+ setRmiServer(new RmiServerImpl(hostName, port,remoteHostName,remotePort));//创建本地RMI服务并连接远程RMI服务器
+ setWorkQueue((WorkQueue) getRmiServer().getObject("WorkQueue"));//获取远程RMI服务器上注册的工作队列
}
}
diff --git a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java
index c6a1305f50808ad0bfc7d28587ae0a33c66e6993..cda1732aa601dc613b636446ea5c9649afd05263 100644
--- a/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java
+++ b/framework/org.tinygroup.pc/src/main/java/org/tinygroup/tinypc/impl/WorkDefault.java
@@ -32,9 +32,9 @@ public class WorkDefault implements Work {
private static final long serialVersionUID = -7558871247472425574L;
private String id;
private String type;
- private Warehouse inputWarehouse;
+ private Warehouse inputWarehouse;//仓库
private boolean needSerialize = false;
- private Work nextStepWork = null;
+ private Work nextStepWork = null;//下一工作
private WorkStatus workStatus = WorkStatus.WAITING;
private String foremanType;
@@ -127,6 +127,6 @@ public class WorkDefault implements Work {
public String getForemanType() {
if (foremanType != null)
return foremanType;
- return getType();
+ return getType();//默认工头类型与工作类型关联
}
}
diff --git a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java
index bb734f4c8b550f2927bb7670f7b59fff4fdbb49d..1a1facf22a1f45622b8ae959329f2c22b4917b29 100644
--- a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java
+++ b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/serialwork/TestSerialWork.java
@@ -31,18 +31,27 @@ import java.io.IOException;
*/
public class TestSerialWork {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
- JobCenter jobCenter = new JobCenterLocal();
+ JobCenter jobCenter = new JobCenterLocal();//本地RMI
for (int i = 0; i < 5; i++) {
- jobCenter.registerWorker(new WorkerHello());
+ jobCenter.registerWorker(new WorkerHello());//RMI注册Worker
+ }
+ for(int i = 0; i < 3; i++) {
+ jobCenter.registerWorker(new WorkerBye());//RMI注册Worker
}
Foreman helloForeman = new ForemanSelectOneWorker("hello");
- jobCenter.registerForeman(helloForeman);
+ jobCenter.registerForeman(helloForeman);//RMI注册Foreman
Warehouse inputWarehouse = new WarehouseDefault();
inputWarehouse.put("name", "world");
- Work work = new WorkDefault("hello", inputWarehouse);
+ Work work = new WorkDefault("hello", inputWarehouse);//工作序列
work.setNextWork(new WorkDefault("hello")).setNextWork(new WorkDefault("hello"));
- Warehouse warehouse = jobCenter.doWork(work);
+ Warehouse warehouse = null;
+ try {
+ warehouse = jobCenter.doWork(work);
+ } catch (Exception e) {
+ jobCenter.stop();
+ return;
+ }
System.out.println(warehouse.get("name"));
jobCenter.stop();
}
diff --git a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java
index 65f3d06ebfa95cc7852ef468dc8f06242b0696d9..347c9fec28317fb3bca7b620063ee88a2fa0f3e8 100644
--- a/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java
+++ b/framework/org.tinygroup.pc/src/test/java/org/tinygroup/tinypc/sum/Test.java
@@ -27,8 +27,8 @@ import java.io.IOException;
* Created by luoguo on 14-1-8.
*/
public class Test {
- static String SIP = "192.168.84.23";
- static String CIP = "192.168.84.23";
+ static String SIP = "192.168.84.76";
+ static String CIP = "192.168.84.76";
static int SP = 8888;
static int CP = 7777;
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
diff --git a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java
index f11ed45457aaaea5f89301f03d1e8f89bbc17e6a..988e3432b7b091a063f6a8614caf0b4cc8b66a05 100644
--- a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java
+++ b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunClient.java
@@ -24,7 +24,7 @@ public class NewRmiRunClient {
private static String SERVERIP = "127.0.0.1";
private static String LOCALIP = "127.0.0.1";
- public static void main(String[] args) {
+ public static void main(String[] args) throws RemoteException {
RmiServer remoteServer = null;
try {
@@ -34,15 +34,17 @@ public class NewRmiRunClient {
// TODO Auto-generated catch block
e1.printStackTrace();
}
- try {
- remoteServer.registerLocalObject(new HelloImpl(), "hello1");
-
- } catch (RemoteException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- NewRmiRunClient c = new NewRmiRunClient(remoteServer);
- c.run();
+ Hello hello = remoteServer.getObject("hello");
+ System.out.println(hello.sayHello("ljf"));
+// try {
+// remoteServer.registerLocalObject(new HelloImpl(), "hello1");
+//
+// } catch (RemoteException e) {
+// // TODO Auto-generated catch block
+// e.printStackTrace();
+// }
+// NewRmiRunClient c = new NewRmiRunClient(remoteServer);
+// c.run();
}
diff --git a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java
index 0b644365474e080f4ce1c1cb9b090aab748eeaae..a6e5b5774e6d6c8e1f8c2dcf9ffd61275afd1923 100644
--- a/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java
+++ b/framework/org.tinygroup.rmi/src/test/java/org/tinygroup/rmi/test/NewRmiRunServer.java
@@ -38,8 +38,8 @@ public class NewRmiRunServer {
} catch (RemoteException e) {
e.printStackTrace();
}
- NewRmiRunServer r = new NewRmiRunServer();
- r.runThread(localServer);
+// NewRmiRunServer r = new NewRmiRunServer();
+// r.runThread(localServer);
}
diff --git a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java
index e3042b52dd8bcccdb4a789eb5b673e654fc43ec5..5381a99b327c2a156a42586b826855e4e6cd7e31 100644
--- a/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java
+++ b/web/org.tinygroup.weblayer/src/main/java/org/tinygroup/weblayer/mvc/HandlerExecutionChain.java
@@ -15,11 +15,14 @@
*/
package org.tinygroup.weblayer.mvc;
+import java.io.IOException;
+import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
+import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.tinygroup.beancontainer.BeanContainerFactory;
@@ -31,7 +34,17 @@ import org.tinygroup.context2object.impl.ClassNameObjectGenerator;
import org.tinygroup.loader.LoaderManager;
import org.tinygroup.springutil.SpringBeanContainer;
import org.tinygroup.weblayer.WebContext;
+import org.tinygroup.weblayer.mvc.MappingMethodModel;
+import org.tinygroup.weblayer.mvc.annotation.Json2Object;
+import org.tinygroup.weblayer.mvc.annotation.ResultJson;
+import org.tinygroup.weblayer.mvc.annotation.ResultXml;
import org.tinygroup.weblayer.mvc.annotation.View;
+import org.tinygroup.weblayer.util.AsmUtil;
+import org.tinygroup.convert.objectjson.fastjson.ObjectToJson;
+import org.tinygroup.convert.objectxml.xstream.ObjectToXml;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
/**
*
@@ -43,6 +56,9 @@ import org.tinygroup.weblayer.mvc.annotation.View;
*
*/
public class HandlerExecutionChain {
+
+ ObjectToXml