@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExecuteMonitor { public abstract long timeout(); }
public class ExecutePointcut implements FactoryBean<Pointcut> { public Pointcut getObject() throws Exception { ComposablePointcut cp = new ComposablePointcut( AnnotationMatchingPointcut.forClassAnnotation(ExecuteMonitor.class));
public class ExecuteInterceptor extends DelegatingIntroductionInterceptor { private static Logger logger = LoggerFactory.getLogger(ExecuteInterceptor.class);
private long getTimeout(Method m) { ExecuteMonitor em = (ExecuteMonitor)m.getAnnotation(ExecuteMonitor.class); if (em == null) { em = (ExecuteMonitor)m.getDeclaringClass().getAnnotation(ExecuteMonitor.class); }
if (em == null) { return -1L; } return em.timeout(); }
private void printArguments(StringBuilder sb, Object[] args) { int i = 0; sb.append("{"); for (Object arg : args) { sb.append(i++).append("->"); sb.append(String.valueOf(arg)); sb.append(SystemUtils.LINE_SEPARATOR); } sb.append("}"); }
public Object invoke(MethodInvocation mi) throws Throwable { logger.debug("invoke..." + mi.toString());
long timeout = getTimeout(mi.getMethod()); long l = 0L;
if (timeout > 0L) l = System.currentTimeMillis(); try { long timeused; StringBuilder sb; return super.invoke(mi); } finally { if (l > 0L) { long timeused = System.currentTimeMillis() - l;