Index: forgon-core/src/main/java/com/forgon/system/activity/service/ActivityPointcut.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/system/activity/service/ActivityPointcut.java (revision 0) +++ forgon-core/src/main/java/com/forgon/system/activity/service/ActivityPointcut.java (revision 23719) @@ -0,0 +1,30 @@ +/** + * + */ +package com.forgon.system.activity.service; + +import java.lang.reflect.Method; + +import org.springframework.aop.support.StaticMethodMatcherPointcut; + +import com.forgon.system.activity.model.Activity; + +/** + * @author dandan 2018年7月12日 上午11:56:32 + * + */ +public class ActivityPointcut extends StaticMethodMatcherPointcut { + + /* (non-Javadoc) + * @see org.springframework.aop.MethodMatcher#matches(java.lang.reflect.Method, java.lang.Class) + */ + @Override + public boolean matches(Method method, Class targetClass) { + Activity activity = method.getAnnotation(Activity.class); + if(activity != null){ + return true; + } + return false; + } + +} Index: forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspectInterceptor.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspectInterceptor.java (revision 0) +++ forgon-core/src/main/java/com/forgon/system/activity/service/ActivityAspectInterceptor.java (revision 23719) @@ -0,0 +1,76 @@ +/** + * + */ +package com.forgon.system.activity.service; + +import java.lang.reflect.AccessibleObject; +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月11日 下午8:24:13 + * + */ +public class ActivityAspectInterceptor implements MethodInterceptor { + + private ActivityManager activityManager; + + public void setActivityManager(ActivityManager activityManager) { + this.activityManager = activityManager; + } + + @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/model/Activity.java =================================================================== diff -u -r23571 -r23719 --- forgon-core/src/main/java/com/forgon/system/activity/model/Activity.java (.../Activity.java) (revision 23571) +++ forgon-core/src/main/java/com/forgon/system/activity/model/Activity.java (.../Activity.java) (revision 23719) @@ -18,5 +18,4 @@ public @interface Activity { String name(); - AmountControl amountControl() default AmountControl.INFINITE; } Index: forgon-core/src/main/java/com/forgon/system/activity/model/AmountControl.java =================================================================== diff -u -r23571 -r23719 --- forgon-core/src/main/java/com/forgon/system/activity/model/AmountControl.java (.../AmountControl.java) (revision 23571) +++ forgon-core/src/main/java/com/forgon/system/activity/model/AmountControl.java (.../AmountControl.java) (revision 23719) @@ -9,19 +9,26 @@ * @author dandan 2018年6月12日 下午2:10:51 * */ -public enum AmountControl { +public class AmountControl { - RECYCLING("回收", 1), PACKING("装配", 1), REVIEW("审核", 1), INVOICE("发货", 1), STERILIZATION( - "灭菌", 1), REPORT("报表", 1), INFINITE("无限", -1); + public static final String RECYCLING = "回收"; + public static final String PACKING = "装配"; + public static final String REVIEW = "审核"; + public static final String INVOICE = "发货"; + public static final String STERILIZATION = "灭菌"; + public static final String REPORT = "报表"; + public static final String INFINITE = "不限制"; + + private String name; private int maxAmount = -1; private AtomicInteger curAmount = new AtomicInteger(0); - private AmountControl(String name) { + public AmountControl(String name) { this.name = name; } - private AmountControl(String name, int maxAmount) { + public AmountControl(String name, int maxAmount) { this.name = name; this.maxAmount = maxAmount; }