在Linux上面运行java程序要比在windows上面跑稳定很多,但是总有些情况下我们的程序跑在了windows上面,这就需要我们对windows server有所了解。今天给大家介绍下如何在windows服务器上面创建定时任务来定时执行java程序。
Windows的有点就是可视化,操作简单,下面一步步为大家演示一下。
2,然后我们打开管理工具,找到其中的“任务计划程序”,如下图所示:
3,打开任务计划程序,如下图所示:
4,右击选择“创建基本任务”,这个向导很多简单,适合初学者。如下图所示:
第一步写上任务名称就可以了,然后点击next。
5,接下来是设置触发器,就是什么时候执行,如下图所示:
6,下一步我们设置任务执行什么操作,如下图所示:
我们选择需要执行的bat文件,
“起始于”选项中一定要填写jar文件的路径,否则会报“Error: Unable to access jarfile”的错误。
7,最后点击“完成”就可以成功创建任务了。
如果需要在某段时间里面循环执行程序,那我们可以修改触发器的执行时间,如下图所示:
这里我们可以设置两个小时内每5分钟执行一次。
这样到点就会执行我们的java程序,我做这个是用于批量处理数据的。
自从JDK1.5之后,提供了 ScheduledExecutorService 代替TimerTask来执行定时任务,提供了不错的可靠性。
Spring Framework 自带定时任务,提供了cron表达式来实现丰富定时任务配置。新手推荐使用 https://cron.qqe2.com/ 这个网站来匹配你的 cron表达式 。
单点的定时服务在目前微服务的大环境下,应用场景越来越局限,所以尝鲜一下分布式定时任务吧。
相较于之前两种方式,这种基于Redis的实现可以通过多点来增加定时任务,多点消费。但是要做好防范重复消费的准备。
将定时任务存放到ZSet集合中,并且将过期时间存储到ZSet的Score字段中,然后通过一个循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行。
具体实现代码如下:
适用场景如下:
优势是:
默认情况下Redis是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启。开启之后定时任务的代码如下:
Spring会监听符合以下格式的Redis消息
基于Redis的定时任务能够适用的场景也比较有限,但实现上相对简单,但对于功能幂等有很大要求。从使用场景上来说,更应该叫做延时任务。
场景举例:
优劣势是:
将定时任务作为单独的服务,遏制了重复消费,独立的服务也有利于扩展和维护。
依赖于MySQL,使用相对简单,可多节点部署,通过竞争数据库锁来保证只有一个节点执行任务。没有图形化管理页面,使用相对麻烦。
依赖于Zookeeper,通过zookeeper的注册与发现,可以动态的添加服务器。
依赖于Zookeeper,集群部署,可以动态的添加服务器。可以手动增加定时任务,启动和暂停任务。
国产,依赖于MySQL,基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以手动增加定时任务,启动和暂停任务。
微服务下,推荐使用xxl-job这一类组件服务将定时任务合理有效的管理起来。而单点的定时任务有其局限性,适用于规模较小、对未来扩展要求不高的服务。
相对而言,基于spring task的定时任务最简单快捷,而xxl-job的难度主要体现在集成和调试上。无论是什么样的定时任务,你都需要确保:
中间件可以将服务解耦,但增加了复杂度
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)