首页
友情链接
精美壁纸
给我留言
更多
关于我
Search
1
uniapp Click点击事件冲突解决
4,558 阅读
2
【插件】UNI APP 实现商米打印机功能支持T1,T2,V2机型
3,871 阅读
3
【测试可用】个人码免签支付系统源码/免签支付系统/微信支付平台
1,974 阅读
4
Java Validation参数校验注解使用
1,230 阅读
5
windows10下docker:给已存在的容器添加端口映射的方法
1,219 阅读
Java
Spring Boot
Spring Mvc
Java基础
进阶知识
前端
uniapp
小程序/公众号
JavaScript
HTML/CSS
Vue
PHP
开源软件
商城
营销工具
开发工具
视频/教程
Discuz主题/插件
typecho主题/插件
SEO杂谈
数据库
MongoDB
MySQL
Redis
单片机
概念说明
电路相关
Python
devops
docker
k8s
linux
职场杂谈
登录
/
注册
Search
标签搜索
python
mysql
人人商城
php
java
docker
typecho
插件
微擎
seo
spring boot
discuz
队列
uni-app
phpcms
教程视频
开源系统
源码
工具
css
哈根达斯
累计撰写
100
篇文章
累计收到
154
条评论
首页
栏目
Java
Spring Boot
Spring Mvc
Java基础
进阶知识
前端
uniapp
小程序/公众号
JavaScript
HTML/CSS
Vue
PHP
开源软件
商城
营销工具
开发工具
视频/教程
Discuz主题/插件
typecho主题/插件
SEO杂谈
数据库
MongoDB
MySQL
Redis
单片机
概念说明
电路相关
Python
devops
docker
k8s
linux
职场杂谈
页面
友情链接
精美壁纸
给我留言
关于我
搜索到
2
篇与
spring boot
的结果
2021-07-20
Spring Boot 中注解@Scheduled实现定时任务
在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。1.创建定时任务在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一下当前时间。在Spring Boot的主类中加入 @EnableScheduling 注解,启用定时任务的配置@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }2.创建定时任务实现类@Component public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { log.info("现在时间:" + dateFormat.format(new Date())); } }运行程序,控制台中可以看到类似如下输出,定时任务开始正常运作了。2021-07-13 14:56:56.413 INFO 34836 --- [ main] c.d.chapter71.Chapter71Application : Started Chapter71Application in 1.457 seconds (JVM running for 1.835) 2021-07-13 14:57:01.411 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:01 2021-07-13 14:57:06.412 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:06 2021-07-13 14:57:11.413 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:11 2021-07-13 14:57:16.413 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:163.@Scheduled 详解在上面的入门例子中,使用了 @Scheduled(fixedRate = 5000) 注解来定义每过5秒执行的任务。对于 @Scheduled 的使用,我们从源码里看看有哪些配置:@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED; String cron() default ""; String zone() default ""; long fixedDelay() default -1; String fixedDelayString() default ""; long fixedRate() default -1; String fixedRateString() default ""; long initialDelay() default -1; String initialDelayString() default ""; }这些具体配置信息的含义如下:cron:通过cron表达式来配置执行规则zone:cron表达式解析时使用的时区fixedDelay:上一次执行结束到下一次执行开始的间隔时间(单位:ms)fixedDelayString:上一次任务执行结束到下一次执行开始的间隔时间,使用java.time.Duration#parse解析fixedRate:以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间(单位:ms),若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务fixedRateString:与fixedRate逻辑一致,只是使用java.time.Duration#parse解析initialDelay:首次任务执行的延迟时间initialDelayString:首次任务执行的延迟时间,使用java.time.Duration#parse解析4.思考与进阶是不是这样实现定时任务很简单呢?那么继续思考一下这种实现方式是否存在什么弊端呢?可能初学者不太容易发现问题,但如果你已经有一定的线上项目经验的话,问题也是显而易见的:这种模式实现的定时任务缺少在集群环境下的协调机制。什么意思呢?假设,我们要实现一个定时任务,用来每天网上统计某个数据然后累加到原始数据上。我们开发测试的时候不会有问题,因为都是单进程在运行的。但是,当我们把这样的定时任务部署到生产环境时,为了更高的可用性,启动多个实例是必须的。此时,时间一到,所有启动的实例就会同时开始执行这个任务。那么问题也就出现了,因为有累加操作,最终我们的结果就会出现问题。解决这样问题的方式很多种,比较通用的就是采用分布式锁的方式,让同类任务之前的时候以分布式锁的方式来控制执行顺序,比如:使用Redis、Zookeeper等具备分布式锁功能的中间件配合就能很好的帮助我们来协调这类任务在集群模式下的执行规则。参考文献原文链接
2021年07月20日
166 阅读
0 评论
0 点赞
2021-07-10
Springboot以jar包方式部署运行
springboot打成jar包后。我们需要将jar在linux环境部署,前提linux系统已安装jdk等运行环境。文章目录索引启动方式一:java -jar app.jar 前台启动启动方式二:nohup java -jar app.jar & 后台启动区别:前台启动ctrl+c就会关闭程序,后台启动ctrl+c不会关闭程序制定控制台的标准输出java -jar app.jar > catalina.out 2>&1 &catalina.out将标准输出指向制定文件catalina.out2>&1 输出所有的日志文件& 后台启动对于上面的命令的解释:bash 中 0、1、2 三个数字分别代表 STDIN_FILENO 、 STDOUT_FILENO 、STDERR_FILENO ,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。数字 含义0 标准输入(一般是键盘)1 标准输出(一般是显示屏,准确的说是用户终端控制台)2 标准错误(出错信息输出)启动方式三:编写shell脚本启动在app.jar 同目录下编辑app.sh脚本文件内容如下:#!/bin/sh #功能简介:启动app.jar 文件 #注意:在sh文件中=赋值,左右两侧不能有空格 APP=app APP_NAME=${APP}".jar" log_dir=/home/jar_logs/ log_file=/home/jar_logs/app.log command=$1 # 启动 function start(){ # 日志文件夹不存在,则创建 if [ ! -d "${log_dir}" ];then mkdir "${log_dir}" fi rm -f tpid nohup java -jar ${APP_NAME} 1>/dev/null 2>"${log_file}" & echo $! > tpid check } # 停止 function stop(){ tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ ${tpid} ]; then echo 'stop process...' kill -15 $tpid fi sleep 5 tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ ${tpid} ]; then echo 'Kill Process!' kill -9 $tpid else echo 'Stop Success!' fi } # 检查 function check(){ tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ ${tpid} ]; then echo 'App is running.' else echo 'App is NOT running.' fi } # 强制kill进程 function forcekill(){ tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ ${tpid} ]; then echo 'Kill Process!' kill -9 $tpid fi } # 输出进程号 function showtpid(){ tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'` if [ ${tpid} ]; then echo 'process '$APP_NAME' tpid is '$tpid else echo 'process '$APP_NAME' is not running.' fi } if [ "${command}" == "start" ]; then start elif [ "${command}" == "stop" ]; then stop elif [ "${command}" == "check" ]; then check elif [ "${command}" == "kill" ]; then forcekill elif [ "${command}" == "tpid" ];then showtpid else echo "Unknow argument...." fi编写完成后需要将脚本文件设置超级管理员权限chmod +x app.sh之后使用./app.sh start/stop等命令启动即可./app.sh start/stop作者:蓝胖子CC7链接:https://www.jianshu.com/p/717afc0e1708来源:简书
2021年07月10日
140 阅读
0 评论
0 点赞