今儿在修改一个Bug的时候,定时任务的断点一直不起作用,刚开始以为是idea哪儿出问题了,但是后来发现其他方法都能跑断点,这就愁坏了。于是经过同事的提点,才知道原来我们那个定时任务里面有一个切面,切面里面对定时任务用了一个redis做缓存的处理。
1、首先要学会在idea中看是否存在切面,如图,有下面这种图标的就表示有切面。
image.png2、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;
}
}
在此就仅仅的记录下,自己遇到的问题,万一以后再遇到知道怎么解决,而且也学会了看一个地方是否有切面。
网友评论