当前位置 博文首页 > u011767319的博客:Scheduling配合nacos的yml实现动态定时任务
配置好nacos的yml动态配置,为前提
test:
schedule:
#服务器为0时区,因此设置每天下午16点执行,相当于东8区的晚上12点
crons: {"guideUserSchedule":"0/20 * * * * ?"}
# 默认是115
min: 20
package app.woya.service.admin.config.scheduled;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 定时任务配置
*/
//@RefreshScope - 使用这个会创建两个任务-弃用
@Component
@EnableScheduling
@Slf4j
public class ScheduledConfig implements SchedulingConfigurer, ApplicationContextAware {
private ApplicationContext applicationContext;
@Autowired
private Crons crons;
/**
* 添加定时任务
*/
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
crons.getCrons().forEach((beanId, cron) -> {
try {
Runnable runnable = (Runnable) applicationContext.getBean(beanId);
scheduledTaskRegistrar.addCronTask(runnable, cron);
} catch (Exception e) {
log.warn("实例化task失败[" + beanId + "]", e);
}
});
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Configuration
@ConfigurationProperties(prefix = "test")
@Data
@RefreshScope
public static class Crons {
public Map<String, String> crons;
private Integer min = 115;
}
}
package app.woya.service.admin.job;
import app.woya.lib.mq.config.MqDefineConstant;
import app.woya.lib.mq.domain.OfflineMessageDTO;
import app.woya.lib.mq.rabbit.RabbitRouter;
import app.woya.lib.mq.rabbit.RabbitSender;
import app.woya.service.admin.config.scheduled.ScheduledConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component("guideUserSchedule") //指定值,方便上下文获取任务
public class GuideUserSchedule implements Runnable {
@Resource
private ScheduledConfig.Crons crons;
@Override
public void run() {
//定义要延迟多少分钟
int min = crons.getMin();
//头像时间
long avatarTime = TimeUnit.MINUTES.toMillis(getRandomMin(min));
log.debug("offlineMessage: 上传头像信息触发的时间:{}, 现在时间:{}", avatarTime, LocalDateTime.now());
RabbitSender.convertAndDelaySend(RabbitRouter.builder()
.exchange(MqDefineConstant.Exchange.OFFLINE_MESSAGE_DELAY_EXCHANGE)
.routingKey(MqDefineConstant.RoutingKey.OFFLINE_MESSAGE_DELAY_KEY).build(),
OfflineMessageDTO.builder().type(OfflineMessageDTO.OfflineMessageType.UPLOAD_AVATAR_MESSAGE.name()).build(),
avatarTime
);
//促活时间
long promoteTime = TimeUnit.MINUTES.toMillis(getRandomMin(min));
log.debug("offlineMessage: 促活信息触发的时间:{}, 现在时间:{}", promoteTime, LocalDateTime.now());
RabbitSender.convertAndDelaySend(RabbitRouter.builder()
.exchange(MqDefineConstant.Exchange.OFFLINE_MESSAGE_DELAY_EXCHANGE)
.routingKey(MqDefineConstant.RoutingKey.OFFLINE_MESSAGE_DELAY_KEY).build(),
OfflineMessageDTO.builder().type(OfflineMessageDTO.OfflineMessageType.GUIDE_USER_MESSAGE.name()).build(),
promoteTime
);
}
/**
* 得到随机分钟数
*
* @param min 最小值
* @return int
*/
public int getRandomMin(int min) {
return (int) (Math.random() * min + 5);
}
}
cs