admin管理员组文章数量:1567259
一、快速使用
@Component
@EnableScheduling
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ScheduleMessage {
private final AliCloudTools aliCloudTools;
@Resource
private UserService userService;
/**
* 每60秒模板消息发送
*/
@Scheduled(cron = "*/60 * * * * ?")
public void sendMessage() {
// 获取待发模板消息通知的视频会员(结合业务)
List<VipCodePo> vipCodeList = userService.getVipCodeList();
if (vipCodeList.size() > 0) {
for (VipCodePo vipCodePo : vipCodeList) {
String phone = vipCodePo.getPhone();
String vipCode = vipCodePo.getExchangeCode();
String templateName = vipCodePo.getGoodsId() == 8 ? Constant.AQY_TEMPLATE_SMS.VALUES() : Constant.TX_TEMPLATE_SMS.VALUES();
// 开始发送模板消息
aliCloudTools.sendSms(vipCode,phone,templateName);
// 更新该视频会员的状态为已经发送了模板消息status = 0 || 1
userService.updateVipCodeStatus(vipCodePo.getId(), 1);
}
} else {
log.info("所有视频会员的模板消息已经发送完成");
}
}
}
二、问题出现和解决。
运行后出现Executor的bean注入冲突的情况,这个时候可以重写实现SchedulingConfigurer, AsyncConfigurer并配置(主要就是通过@Primary注解指定一个类为这个bean的默认类)
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @author :cw
* @date :Created in 2020/8/28 下午5:25
* @description:
* @modified By:
* @version: $
*/
@Configuration
@EnableAsync
@EnableScheduling
@Slf4j
public class ExecutorConfig implements SchedulingConfigurer, AsyncConfigurer {
/**
* 定时任务使用的线程池
* @return
*/
@Primary
@Bean(destroyMethod = "shutdown", name = "taskScheduler")
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(10);
scheduler.setThreadNamePrefix("task-");
scheduler.setAwaitTerminationSeconds(600);
scheduler.setWaitForTasksToCompleteOnShutdown(true);
return scheduler;
}
/**
* 异步任务执行线程池
* @return
*/
@Bean(name = "asyncExecutor")
public ThreadPoolTaskExecutor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setQueueCapacity(1000);
executor.setKeepAliveSeconds(600);
executor.setMaxPoolSize(20);
executor.setThreadNamePrefix("taskExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = taskScheduler();
scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
}
@Override
public Executor getAsyncExecutor() {
return asyncExecutor();
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, objects) -> {
log.error("异步任务执行出现异常, message {}, emthod {}, params {}", throwable, method, objects);
};
}
}
三、业务分析和理解
使用定时任务给用户发送短信提醒的功能,考虑到实时性不是那么重要,所以定时任务的执行时间间隔可以根据情况进行调整。
也可以采用消息队列的方式,根据情况采用普通异步或其它消息服务的方式。
参考:https://blog.csdn/tqwer/article/details/102293883
本文标签: SpringBoot
版权声明:本文标题:springBoot引用定时任务出现的问题和解决记录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726604134a1077372.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论