Index: forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAdvice.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAdvice.java (revision 0) +++ forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAdvice.java (revision 23720) @@ -0,0 +1,82 @@ +/** + * + */ +package com.forgon.system.activity.service; + +import java.lang.reflect.Method; + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.apache.commons.lang3.StringUtils; + +import com.forgon.system.activity.model.Activity; +import com.forgon.system.activity.model.ActivityException; +import com.forgon.system.activity.model.ActivityInfo; +import com.forgon.system.activity.model.AmountControl; + +/** + * @author dandan 2018年7月12日 下午1:47:56 + * + */ +public class ActivityAdvice implements MethodInterceptor { + + private ActivityManager activityManager; + + public void setActivityManager(ActivityManager activityManager) { + this.activityManager = activityManager; + } + + /* + * (non-Javadoc) + * + * @see + * org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept + * .MethodInvocation) + */ + @Override + public Object invoke(MethodInvocation invocation) throws Throwable { + + // System.out.println("111"); + // Object retValue = invocation.proceed(); + // System.out.println("222"); + Method method = invocation.getMethod(); + AmountControl amountControl = null; + boolean decrementAmount = false; + ActivityInfo activityInfo = null; + Activity activity = method.getAnnotation(Activity.class); +// AccessibleObject accessibleObject = invocation.getStaticPart(); +// Activity activity = accessibleObject.getAnnotation(Activity.class); + if (activity == null) { + return invocation.proceed(); + } else { + try { + String name = activity.name(); + String methodName = method.getName(); + if (StringUtils.isBlank(name)) { + name = methodName; + } + amountControl = activityManager.getByName(name); + if (amountControl.incrementAmount()) { + decrementAmount = true; + activityInfo = activityManager.addActivity(name); + } else { + throw new ActivityException(String.format( + "同时只能执行%s个%s任务,当前正在执行%s个任务,请稍后重试!", + amountControl.getMaxAmount(), name, + amountControl.getCurAmount(), name)); + } + // System.out.println("start activity"); + return invocation.proceed(); + // System.out.println("end activity"); + } finally { + if (decrementAmount) { + amountControl.decrementAmount(); + } + if (activityInfo != null) { + activityManager.removeActivity(activityInfo); + } + } + } + } + +} Index: forgon-core/src/main/java/com/forgon/system/activity/service/ActivityManager.java =================================================================== diff -u -r23571 -r23720 --- forgon-core/src/main/java/com/forgon/system/activity/service/ActivityManager.java (.../ActivityManager.java) (revision 23571) +++ forgon-core/src/main/java/com/forgon/system/activity/service/ActivityManager.java (.../ActivityManager.java) (revision 23720) @@ -3,10 +3,14 @@ */ package com.forgon.system.activity.service; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; +import javax.annotation.PostConstruct; + import com.forgon.system.activity.model.ActivityException; import com.forgon.system.activity.model.ActivityInfo; +import com.forgon.system.activity.model.AmountControl; /** * @author dandan 2018年6月5日 下午8:07:12 @@ -16,7 +20,34 @@ private ConcurrentLinkedQueue activityInfoList = new ConcurrentLinkedQueue(); private ThreadLocal curActivityInfo = new ThreadLocal(); + private ConcurrentHashMap amountControlMap = new ConcurrentHashMap(); + @PostConstruct + public void init() { + amountControlMap.put(AmountControl.RECYCLING, new AmountControl( + AmountControl.RECYCLING, 1)); + amountControlMap.put(AmountControl.PACKING, new AmountControl( + AmountControl.PACKING, 1)); + amountControlMap.put(AmountControl.REVIEW, new AmountControl( + AmountControl.REVIEW, 1)); + amountControlMap.put(AmountControl.INVOICE, new AmountControl( + AmountControl.INVOICE, 1)); + amountControlMap.put(AmountControl.STERILIZATION, new AmountControl( + AmountControl.STERILIZATION, 1)); + amountControlMap.put(AmountControl.REPORT, new AmountControl( + AmountControl.REPORT, 1)); + amountControlMap.put(AmountControl.INFINITE, new AmountControl( + AmountControl.INFINITE, -1)); + } + + public AmountControl getByName(String name){ + AmountControl amountControl = amountControlMap.get(name); + if(amountControl != null){ + return amountControl; + } + return amountControlMap.get(AmountControl.INFINITE); + } + public ActivityInfo addActivity(String name) { if (curActivityInfo.get() != null) { throw new ActivityException("目前不支持同时执行多个活动!"); @@ -35,6 +66,5 @@ public ConcurrentLinkedQueue getActivityInfoList() { return activityInfoList; } - - + } Index: forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspect.java =================================================================== diff -u -r23614 -r23720 --- forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspect.java (.../ActivityAspect.java) (revision 23614) +++ forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspect.java (.../ActivityAspect.java) (revision 23720) @@ -55,7 +55,7 @@ if (StringUtils.isBlank(name)) { name = methodName; } - amountControl = activity.amountControl(); + amountControl = activityManager.getByName(name); if (amountControl.incrementAmount()) { decrementAmount = true; activityInfo = activityManager.addActivity(name); @@ -68,7 +68,7 @@ return jp.proceed(); // System.out.println("end activity"); } catch (ActivityException e) { - return outputError(activity,method, e.getMessage()); + return outputError(activity,method, e); } catch (Throwable e) { // System.out.println("activity exception"); throw e; @@ -82,10 +82,11 @@ } } - private Object outputError(Activity activity,Method method, String message) { + private Object outputError(Activity activity,Method method,ActivityException e ) { if (method == null) { return null; } + String message = e.getMessage(); Class c = method.getDeclaringClass(); String simpleClassName = c.getSimpleName(); JSONObject json = new JSONObject(); @@ -100,6 +101,8 @@ StrutsResponseUtils.output(json); }else if (simpleClassName.endsWith("Controller")) { SpringResponseUtils.output(json); + }else{ + throw e; } return null; }