ElasticJob初探
依赖版本
JDK版本是:jdk17
springboot版本
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>
zookeeper
elasticjob 需要使用zookeeper为注册中心
下载地址:https://zookeeper.apache.org/releases.html
下载后解压,进入conf目录
复制zoo_sample.cfg 文件,修改名称为zoo.cfg,指定dataDir目录
进入bin目录,windows 点击zkServer.cmd启动,linux执行zkServer.sh文件启动
elastic作业模式
elasticjob:regCenter:## 注册中心serverLists: localhost:2181namespace: elasticjob-springbootjobs:simpleJob: elasticJobClass: xyz.toolhow.job.MyJobcron: 0 0/1 * * * ?timeZone: GMT+08:00shardingTotalCount: 3shardingItemParameters: 0=Beijing,1=Shanghai,2=GuangzhoudataflowJob:elasticJobClass: xyz.toolhow.job.SpringBootDataflowJobcron: 0 0/1 * * * ?timeZone: GMT+08:00shardingTotalCount: 3shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
SimpleJob
@Component
public class MyJob implements SimpleJob {@Autowiredprivate OrderMapper orderMapper;@Overridepublic void execute(ShardingContext context) {
// System.out.println(context.getShardingItem());
// System.out.println(context.getShardingParameter());// 定时执行逻辑}
}
简单任务可以分片执行,如果部分片,将并发执行,但是每次获取全部数据进行执行,会导致内存问题所以进行以下优化
DataflowJob
@Component
public class SpringBootDataflowJob implements DataflowJob<Order> {@Autowiredprivate OrderMapper orderMapper;@Overridepublic List<Order> fetchData(final ShardingContext shardingContext) {List<Order> orders = orderMapper.selectList(new LambdaQueryWrapper<Order>().eq(Order::getArea, shardingContext.getShardingParameter()).eq(Order::getStatus, 0).last("limit 10"));// 获取数据return orders;}@Overridepublic void processData(final ShardingContext shardingContext, final List<Order> data) {for (Order order : data) {order.setStatus(1);orderMapper.updateById(order);System.out.println("----------------------------------");}}
}
使用该方式可以控制每次获取数据的多少,降低内存压力
强调一点,在修改配置后,最好删除zookeeper节点,因为在实例注册有缓存,容易导致配置失效,我在使用过程中,发生cron失效的问题,删除zookeeper后,重启生效