最后
每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。
如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。
@Override
public void execute(ShardingContext context) {
log.info(“MySimpleJob start : didispace.com {}”, System.currentTimeMillis());
}
}
第四步:编辑配置文件
elasticjob.reg-center.server-lists=localhost:2181
elasticjob.reg-center.namespace=didispace
elasticjob.jobs.my-simple-job.elastic-job-class=com.didispace.chapter72.MySimpleJob
elasticjob.jobs.my-simple-job.cron=0/5 * * * * ?
elasticjob.jobs.my-simple-job.sharding-total-count=1
这里主要有两个部分:
第一部分:elasticjob.reg-center
开头的,主要配置elastic job的注册中心和namespace
第二部分:任务配置,以elasticjob.jobs
开头,这里的my-simple-job
是任务的名称,根据你的喜好命名即可,但不要重复。任务的下的配置elastic-job-class
是任务的实现类,cron
是执行规则表达式,sharding-total-count
是任务分片的总数。我们可以通过这个参数来把任务切分,实现并行处理。这里先设置为1,后面我们另外讲分片的使用。
运行与测试
完成了上面所有操作时候,我们可以尝试运行一下上面应用,因为这里需要用到ZooKeeper来协调分布式环境下的任务调度。所以,你需要先在本地安装ZooKeeper,然后启动它。注意:上面elasticjob.reg-center.server-lists
配置,根据你实际使用的ZooKeeper地址和端口做相应修改。
在启动上述Spring Boot应用之后,我们可以看到如下日志输出:
2021-07-20 15:33:39.541 INFO 56365 — [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler ‘my-simple-job’ initialized from an externally provided properties instance.
2021-07-20 15:33:39.541 INFO 56365 — [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2
2021-07-20 15:33:39.551 INFO 56365 — [ main] org.apache.curator.utils.Compatibility : Using org.apache.zookeeper.server.quorum.MultipleAddresses
2021-07-20 15:33:40.067 INFO 56365 — [ main] c.d.chapter72.Chapter72Application : Started Chapter72Application in 3.25 seconds (JVM running for 4.965)
2021-07-20 15:33:40.069 INFO 56365 — [ main] .s.b.j.ScheduleJobBootstrapStartupRunner : Starting ElasticJob Bootstrap.
2021-07-20 15:33:40.078 INFO 56365 — [ main] org.quartz.core.QuartzScheduler : Scheduler my-simple-job_$_NON_CLUSTERED started.
2021-07-20 15:33:40.078 INFO 56365 — [ main] .s.b.j.ScheduleJobBootstrapStartupRunner : ElasticJob Bootstrap started.
2021-07-20 15:33:45.157 INFO 56365 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766425157
2021-07-20 15:33:50.010 INFO 56365 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766430010
2021-07-20 15:33:55.013 INFO 56365 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766435013
既然是分布式任务调度,那么我们再启动一个(注意,在同一台机器启动的时候,会端口冲突,可以在启动命令中加入-Dserver.port=8081
来区分端口),在第二个启动的服务日志也打印了类似的内容
2021-07-20 15:34:06.430 INFO 56371 — [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler ‘my-simple-job’ initialized from an externally provided properties instance.
2021-07-20 15:34:06.430 INFO 56371 — [ main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2
2021-07-20 15:34:06.436 INFO 56371 — [ main] org.apache.curator.utils.Compatibility : Using org.apache.zookeeper.server.quorum.MultipleAddresses
2021-07-20 15:34:06.786 INFO 56371 — [ main] c.d.chapter72.Chapter72Application : Started Chapter72Application in 1.446 seconds (JVM running for 1.884)
2021-07-20 15:34:06.787 INFO 56371 — [ main] .s.b.j.ScheduleJobBootstrapStartupRunner : Starting ElasticJob Bootstrap.
2021-07-20 15:34:06.792 INFO 56371 — [ main] org.quartz.core.QuartzScheduler : Scheduler my-simple-job_$_NON_CLUSTERED started.
2021-07-20 15:34:06.792 INFO 56371 — [ main] .s.b.j.ScheduleJobBootstrapStartupRunner : ElasticJob Bootstrap started.
2021-07-20 15:34:10.182 INFO 56371 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766450182
2021-07-20 15:34:15.010 INFO 56371 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766455010
2021-07-20 15:34:20.013 INFO 56371 — [le-job_Worker-1] com.didispace.chapter72.MySimpleJob : MySimpleJob start : didispace.com 1626766460013
此时,在回头看看之前第一个启动的应用,日志输出停止了。由于我们设置了分片总数为1,所以这个任务启动之后,只会有一个实例接管执行。这样就避免了多个进行同时重复的执行相同逻辑而产生问题的情况。同时,这样也支持了任务执行的高可用。比如:可以尝试把第二个启动的应用(正在打印日志的)终止掉。可以发现,第一个启动的应用(之前已经停止输出日志)继续开始打印任务日志了。
在整个实现过程中,我们并没有自己手工的去编写任何的分布式锁等代码去实现任务调度逻辑,只需要关注任务逻辑本身,然后通过配置分片的方式来控制任务的分割,就可以轻松的实现分布式集群环境下的定时任务管理了。是不是在复杂场景下,这种方式实现起来要比@Scheduled
更方便呢?
记得自己动手写一写,这样体会更深哦!如果碰到问题,可以拉取文末的代码示例对比一下是否有地方配置不一样。下一篇,我们还将继续介绍关于定时任务的一些高级内容。如果您对这个内容感兴趣,可以收藏本系列教程《Spring Boot 2.x基础教程》点击直达!。学习过程中如遇困难,可以加入我们的Spring技术交流群,参与交流与讨论,更好的学习与进步!
代码示例
总结
对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,
最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**