美文网首页
idea 断点一个定时任务不起做用

idea 断点一个定时任务不起做用

作者: lclandld | 来源:发表于2021-04-13 17:36 被阅读0次

今儿在修改一个Bug的时候,定时任务的断点一直不起作用,刚开始以为是idea哪儿出问题了,但是后来发现其他方法都能跑断点,这就愁坏了。于是经过同事的提点,才知道原来我们那个定时任务里面有一个切面,切面里面对定时任务用了一个redis做缓存的处理。

1、首先要学会在idea中看是否存在切面,如图,有下面这种图标的就表示有切面。

image.png

2、ScheduledTaskAop切面

这个切面是对@Scheduled 注解起作用的

@Slf4j
@Aspect
@Component
public class ScheduledTaskAop {

    @Autowired
    RedisTemplate<String, String> redisTemplate;
    @Value("${server.port}")
    private String serverPort;

    private final static Long LONG_KEY_TIMEOUT = 1800L;
    private final static Long SHORT_KEY_TIMEOUT = 30L;

    @Around("@annotation(scheduled)")
    public void around(ProceedingJoinPoint jp, Scheduled scheduled) throws Throwable {
        String[] cornSegments = scheduled.cron().split(" ");
        if (!ComUtil.isEmpty(cornSegments)) {
            String lockKey = Constant.Redis.SCHEDULED_TASK + Constant.COLON + jp.getSignature();
            //按当天执行一次或每天频繁执行两种情况处理
            if (!"*".equals(cornSegments[2])) {
                if (checkStatus(lockKey, LONG_KEY_TIMEOUT)) {
                    executeTask(jp);
                }
            } else {
                if (checkStatus(lockKey, SHORT_KEY_TIMEOUT)) {
                    executeTask(jp);
                }
            }
        }
    }

    private void executeTask(ProceedingJoinPoint jp) throws Throwable {
        log.info(String.format("定时任务 : %s starts at %s", jp.getSignature(), getIpAndPort()));
        jp.proceed();
        log.info(String.format("定时任务 : %s finishes at %s", jp.getSignature(), getIpAndPort()));
    }

    private boolean checkStatus(String lockKey, Long timeout) {
        if (timeout != null) {
            return redisTemplate.opsForValue().setIfAbsent(lockKey, getIpAndPort(), timeout, TimeUnit.SECONDS);
        } else {
            return redisTemplate.opsForValue().setIfAbsent(lockKey, getIpAndPort());
        }
    }

    private String getIpAndPort() {
        String ip;
        try {
            ip = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            log.info(e.getMessage(), e);
            ip = "none";
        }
        return ip + ":" + serverPort;
    }
}

在此就仅仅的记录下,自己遇到的问题,万一以后再遇到知道怎么解决,而且也学会了看一个地方是否有切面。

相关文章

网友评论

      本文标题:idea 断点一个定时任务不起做用

      本文链接:https://www.haomeiwen.com/subject/jtyclltx.html