AOP不能拦截quartz Job?

想要在每个Job跑之前插入一段逻辑,但如下代码经测试进不去AOP的代码,为什么?如果实在不行,还有什么方案可以实现吗?

代码贴在下面:

@Component
public class CheckPayJob {
    
    @Autowired
    private OrderService orderService;
    
    @Scheduled(cron="${checkPay.cron}")
    public void execute() {
        // some job core here
    }
}

@Component
@Aspect
public class JobAspect {
    
    @Pointcut("@annotation(org.springframework.scheduling.annotation.Scheduled)")
    public void scheduledPointCut() {}
    
    @Before("scheduledPointCut()")
    public void before() throws Throwable {
        String T = IdMaker.generate();
        MDC.put(Constants.T, T);
    }
}
阅读 6.9k
5 个回答

直接对方法进行切入试试。。。。

新手上路,请多包涵

首先你要明白Spring两种代理方式的区别。
你想拦截任务调度的注解,在这之前织入特定的逻辑,那就必须保证这个任务类中不能含有调用自身方法的方法或引用,也就是说,这个类必须是经过代理的。或者去applicationContext获取到Bean之后再调用,否则aspectJ将无法正常拦截。
你要检查你这个Bean是否被Spring代理过,如果正常代理过,则需要检查是否有自身的引用,this,或者autowired自身之类的。

新手上路,请多包涵

我也遇到这样问题的 ,,请问你是怎么解决的

新手上路,请多包涵
    schedulerFactory.getScheduler().getListenerManager().addJobListener(new JobListener() {
            @Override
            public String getName() {
            }

            @Override
            public void jobToBeExecuted(JobExecutionContext context) {
            }

            @Override
            public void jobExecutionVetoed(JobExecutionContext context) {
            }

            @Override
            public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
            }
        });
新手上路,请多包涵

感觉是你切入点写错了吧,qartz的执行的主体是job的execute方法吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题