目录
1. 任务调度
定时任务是指在预定的时间点执行一些任务或者按照预定的时间间隔执行任务的一种编程方式。在订单超时场景下,定时任务通常用于周期性地扫描订单表,检查订单是否超时,并对超时订单进行相应处理,比如取消订单或者发送提醒。
1.1 Timer类
java.util.Timer
是 Java 标准库提供的一个简单的定时器类,可以用来执行一次性或者周期性的任务。
Timer timer=new Timer();
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
System.out.println("每隔10秒执行一次:" + new Date());
}
};
timer.schedule(timerTask,0,1000*10); //0s延迟后,每十秒执行一次
1.2 ScheduledExecutorService
java.util.concurrent.ScheduledExecutorService
是 Java 并发包提供的一种线程池,可以用来执行一次性或者周期性的任务。
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleAtFixedRate(()->{
System.out.println("每隔10秒执行一次:" + new Date());
},0,10, TimeUnit.SECONDS); //0s延迟,每10s执行一次
1.3 @Scheduled 注解
Spring 框架提供了 @Scheduled
注解,可以直接在方法上标注该注解来指定方法执行的时间。通过该注解,可以非常方便地实现定时任务。
@Component
@EnableScheduling
public class MyTask{
//每10秒执行一次
/**
* 注解中的Cron表达式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
* 注意:日和周其中的一个必须为"?"
* 10/5 20 10 * * ? 每天10点20分第10秒以后,每5秒执行一次,到10点21分就不会执行了
*/
@Scheduled("0/10 * * * * ?")
public void startTask(){
System.out.println("每隔10秒执行一次:" + new Date());
}
}
1.4 分布式调度
Elastic-Job 是一个分布式任务调度解决方案,支持在分布式环境下对任务进行动态的调度和管理。通过配置作业,你可以实现定时任务的调度和执行。现在订单服务都会搭建集群,分布式调度相比于普通调度在重复处理定时任务和保证幂等性等问题上具有一些优势。
导入依赖
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-spring</artifactId>
<version>2.1.5</version>
</dependency>
编写RegistryCenterConfig
注册中心类
@Configuration
public class RegistryCenterConfig {
@Bean(initMethod = "init")
public CoordinatorRegistryCenter createRegistryCenter() {
//注册中心
ZookeeperConfiguration zkConfig = new ZookeeperConfiguration("localhost:2181","order-elastic-job");
zkConfig.setSessionTimeoutMilliseconds(100);
return new ZookeeperRegistryCenter(zkConfig);
}
}
编写OrderJob类
@Component
public class OrderJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
}
}
编写ElasticJobConfig
类
@Configuration
public class ElasticJobConfig {
@Autowired
private CoordinatorRegistryCenter registryCenterConfig;
//加入bean注解就可以拿到MyJob
@Bean(initMethod = "init")
public SpringJobScheduler initJobConfiguration(OrderJob orderJob) {
return new SpringJobScheduler(orderJob, registryCenterConfig, createJobConfiguration(orderJob.getClass(),"0/3 * * * * ?",1,null));
}
/**
*
* @param clazz 任务的字节码
* @param cron 表达式
* @param shrdingCount 分片个数
* @param shardingParamter 分片参数
* @return
*/
private LiteJobConfiguration createJobConfiguration(Class<? extends ElasticJob> clazz, String cron, int shrdingCount, String shardingParamter) {
JobCoreConfiguration.Builder builder = JobCoreConfiguration.newBuilder(clazz.getSimpleName(), cron, shrdingCount);
if (StringUtils.isEmpty(shardingParamter)) {
builder.shardingItemParameters(shardingParamter);
}
//创建作业配置
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(builder.build(), clazz.getCanonicalName());
//覆盖zookeeper
return LiteJobConfiguration.newBuilder(simpleJobConfiguration).overwrite(true).build();
}
}
2. 消息队列
1. RocketMQ
RocketMQ延时队列
参考资料 Springboot整合RocketMQ 基本消息处理_rocketmq 处理消息-CSDN博客
RocketMQ事务消息
参考资料 Springboot+RocketMQ通过事务消息优雅的实现订单支付功能_mq单点消费-CSDN博客