为什么我的拦截器类不适用于调度方法?

为什么我的拦截器类不适用于调度方法?

问题描述:

我的WildFly 10.2.0服务器上有大量的Stateless豆子。每次尝试使用@Interceptors({LogService.class})时,它都可以使用任何方法,但只有2个@Schedule(second = "*/2", minute = "*", hour = "*")方法的Stateless bean除外。我查找了文档,但没有找到任何线索。谁能帮我?我使用的Java 8为什么我的拦截器类不适用于调度方法?

这里是我的拦截器类:

public class LogService { 

@AroundInvoke 
public Object interceptsAngLog(InvocationContext context) throws Exception { 

    Long millis = System.currentTimeMillis(); 
    LocalTime now = new LocalTime(); 

    Object object = context.proceed(); 

    String method = context.getMethod().getName(); 
    String className = context.getTarget().getClass().getName(); 
    Long millisSpent = System.currentTimeMillis() - millis; 

    System.out.println("[LOG] " + now.toString() + "-" + className + "-" + method + ": " + millisSpent); 

    return object; 
} 
} 

这是我的计划类:

@Stateless 
@Interceptors({LogService.class}) 
public class ScoreTimerService { 

@EJB 
private AccountDao accountDao; 

@Schedule(second = "*/3", minute = "*", hour = "*") 
public void addPointsDueOnlineState() { 
    List<Account> list = accountDao.findOnline(); 
    for (Account account : list) { 
     account.addScore(5); 
     accountDao.update(account); 
    } 
} 

@Schedule(second = "*/2", minute = "*", hour = "*") 
public void removePointsDueTime() { 
    List<Account> list = accountDao.findAll(); 
    for (Account account : list) { 
     account.removeScore(1); 
     accountDao.update(account); 
    } 
} 

} 

我试着用的方法,阶级,关于更换@Interceptors({LogService.class})@Interceptors(LogService.class)但没有人工作。

+0

ü可以分享一些代码吗? – Vahid

+0

对不起,我刚刚加了 – GabrielRado

+0

是你用javax.interceptor.Interceptors注解的吗? – Vahid

我发现只有@AroundTimeout表示法与@Schedule EJB Bean一起使用。所以我加写了我的方法是这样的:

@AroundInvoke 
public Object intercept(InvocationContext context) throws Exception { 
    return monitor(context); 
} 

@AroundTimeout 
public Object interceptSchedule(InvocationContext context) throws Exception { 
    return monitor(context); 
} 

private Object monitor(InvocationContext context) throws Exception { 
    long millis = System.currentTimeMillis(); 

    String method = context.getMethod().getName(); 
    String className = context.getTarget().getClass().getSimpleName(); 

    Object object = context.proceed(); 

    long newMillis = System.currentTimeMillis() - millis; 
    System.out.println("[LOG]-" + method + "." + className + "-" + newMillis + "ms"); 
    return object; 
} 

和它的工作就像一个魅力,为@Schedule和非@Schedule豆