Index: forgon-tools/src/main/java/com/forgon/system/transaction/model/TransactionInfo.java =================================================================== diff -u -r23785 -r24081 --- forgon-tools/src/main/java/com/forgon/system/transaction/model/TransactionInfo.java (.../TransactionInfo.java) (revision 23785) +++ forgon-tools/src/main/java/com/forgon/system/transaction/model/TransactionInfo.java (.../TransactionInfo.java) (revision 24081) @@ -4,10 +4,12 @@ package com.forgon.system.transaction.model; import java.lang.reflect.Method; +import java.util.Comparator; import java.util.Date; import java.util.LinkedList; import java.util.List; +import org.aopalliance.intercept.MethodInvocation; import org.springframework.core.NamedThreadLocal; import org.springframework.transaction.TransactionStatus; @@ -28,18 +30,25 @@ private Object transactionId; private String name; + private MethodInvocation invocation; private String joinpointIdentification; private TransactionInfo oldTransactionInfo; private TransactionStatus transactionStatus; private Date startTime = new Date(); private Thread thread = Thread.currentThread(); private List locks = new LinkedList(); - public TransactionInfo(Class targetClass, Method method, + public TransactionInfo(MethodInvocation invocation, TransactionStatus transactionStatus) { transactionId = new Object(); - name = method.getName(); - joinpointIdentification = methodIdentification(method, targetClass); + this.invocation = invocation; + name = invocation.getMethod().getName(); + Object targetObject = invocation.getThis(); + Class targetClass = null; + if(targetObject != null){ + targetClass = targetObject.getClass(); + } + joinpointIdentification = methodIdentification(invocation.getMethod(), targetClass); this.transactionStatus = transactionStatus; } @@ -143,4 +152,14 @@ public void addLock(OptimisticLock optimisticLock) { locks.add(optimisticLock); } + + public static final Comparator STARTTIME_COMPARATOR = new Comparator() { + @Override + public int compare(TransactionInfo o1, TransactionInfo o2) { + Date st1 = o1.getStartTime(); + Date st2 = o2.getStartTime(); + + return st1.compareTo(st2); + } + }; } Index: forgon-tools/src/main/java/com/forgon/system/transaction/service/TransactionInfoManager.java =================================================================== diff -u --- forgon-tools/src/main/java/com/forgon/system/transaction/service/TransactionInfoManager.java (revision 0) +++ forgon-tools/src/main/java/com/forgon/system/transaction/service/TransactionInfoManager.java (revision 24081) @@ -0,0 +1,47 @@ +/** + * + */ +package com.forgon.system.transaction.service; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import com.forgon.system.transaction.model.TransactionInfo; + +import edu.emory.mathcs.backport.java.util.Collections; + +/** + * @author dandan 2018年8月24日 下午2:41:41 + * + */ +public class TransactionInfoManager { + + private ConcurrentHashMap idToTransactionInfoMap = new ConcurrentHashMap(); + + public ConcurrentHashMap getIdToTransactionInfoMap() { + return idToTransactionInfoMap; + } + + public void addTransactionInfo(TransactionInfo transactionInfo) { + idToTransactionInfoMap.put(transactionInfo.getTransactionId(), + transactionInfo); + } + + public void removeTransactionInfo(TransactionInfo transactionInfo) { + idToTransactionInfoMap.remove(transactionInfo.getTransactionId()); + } + + // 主要用于测试和界面显示 + public List getAllTransactionInfo() { + List transactionInfoList = new LinkedList(); + Collection transactionInfos = idToTransactionInfoMap + .values(); + if (transactionInfos != null) { + transactionInfoList.addAll(transactionInfos); + } + Collections.sort(transactionInfoList, TransactionInfo.STARTTIME_COMPARATOR); + return transactionInfoList; + } +} Index: forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockInterceptor.java =================================================================== diff -u -r23797 -r24081 --- forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockInterceptor.java (.../OptimisticLockInterceptor.java) (revision 23797) +++ forgon-tools/src/main/java/com/forgon/system/concurrent/service/OptimisticLockInterceptor.java (.../OptimisticLockInterceptor.java) (revision 24081) @@ -9,6 +9,7 @@ import org.springframework.transaction.support.TransactionSynchronizationManager; import com.forgon.system.transaction.model.TransactionInfo; +import com.forgon.system.transaction.service.TransactionInfoManager; import com.forgon.system.transaction.util.TransactionUtils; /** @@ -19,11 +20,18 @@ private OptimisticLockManager optimisticLockManager; + private TransactionInfoManager transactionInfoManager; + public void setOptimisticLockManager( OptimisticLockManager optimisticLockManager) { this.optimisticLockManager = optimisticLockManager; } + public void setTransactionInfoManager( + TransactionInfoManager transactionInfoManager) { + this.transactionInfoManager = transactionInfoManager; + } + /* * (non-Javadoc) * @@ -39,8 +47,8 @@ TransactionInfo transactionInfo = null; boolean bind = false; if (transactionStatus != null && transactionStatus.isNewTransaction()) { - transactionInfo = new TransactionInfo(invocation.getClass(), - invocation.getMethod(), transactionStatus); + transactionInfo = new TransactionInfo(invocation,transactionStatus); + transactionInfoManager.addTransactionInfo(transactionInfo); transactionInfo.bindToThread(); bind = true; try { @@ -55,6 +63,9 @@ try { rv = invocation.proceed(); } finally { + if(transactionInfo != null){ + transactionInfoManager.removeTransactionInfo(transactionInfo); + } if (bind) { transactionInfo.restoreThreadLocalStatus(); } Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r24062 -r24081 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 24062) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 24081) @@ -2273,6 +2273,8 @@ + + transactionInfoList = transactionInfoManager + .getAllTransactionInfo(); + JSONArray jsonArray = new JSONArray(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + for (TransactionInfo transactionInfo : transactionInfoList) { + JSONObject obj = new JSONObject(); + obj.put("transactionId", transactionInfo.getTransactionId()); + obj.put("joinpointIdentification", + transactionInfo.getJoinpointIdentification()); +// obj.put("className", transactionInfo.getTargetClass().getName()); + obj.put("method", transactionInfo.getName()); + obj.put("startTime", sdf.format(transactionInfo.getStartTime())); + obj.put("thread", transactionInfo.getThread().toString()); + jsonArray.add(obj); + } + ResponseUtils.doOutput(jsonArray, response); + } +}