这是我第一次使用AOP,所以这可能是一个非常棒的问题.
public class MyAspect implements AspectI {
public void method1() throws AsyncApiException {
System.out.println("In Method1. calling method 2");
method2();
}
@RetryOnInvalidSessionId
public void method2() throws AsyncApiException {
System.out.println("In Method2, throwing exception");
throw new AsyncApiException("method2", AsyncExceptionCode.InvalidSessionId);
}
public void login() {
System.out.println("Logging");
}
InvalidSessionHandler看起来像这样.
@Aspect
public class InvalidSessionIdHandler implements Ordered {
@Around("@annotation(com.pkg.RetryOnInvalidSessionId)")
public void reLoginAll(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Hijacked call: " + joinPoint.getSignature().getName() + " Proceeding");
try {
joinPoint.proceed();
} catch (Throwable e) {
if (e instanceof AsyncApiException) {
AsyncApiException ae = (AsyncApiException) e;
if (ae.getExceptionCode() == AsyncExceptionCode.InvalidSessionId) {
System.out.println("invalid session id. relogin");
AspectI myAspect = (AspectI) joinPoint.getTarget();
myAspect.login();
System.out.println("Login done. Proceeding again now");
joinPoint.proceed();
}
}
}
}
@Override
public int getOrder() {
return 1;
}
}
弹簧配置
>我的意图是当我调用myAspect.method1()时调用method2,如果method2抛出InvalidSessionId Exception,则只应重试method2.但上面的代码似乎没有做任何事情.它只是在从method2抛出异常后立即返回.但是,如果我在method1上放置@RetryOnInvalidSessionId,则重试整个method1.
>为了学习我保持method2是公开的,但实际上我希望它是私有的.我在这里没有线索,如何重试私有方法.
任何的意见都将会有帮助.
谢谢