本来遇到了很奇怪的坑,crontab定时任务执行的shell脚本和自己手动执行的shell脚本不一致。

在java进程已启动的情况下, crontab定时任务执行的脚本却总是找不到对应的pid。

试了好几种解决方法,结果还是不行。

全部命令都用绝对路径执行啊,环境导入啊之类的,都试了下,没有作用,后来自己用crontab里写的定时任务试了试,出现了很多很奇怪的东西

后来还是在 grep “进程名”  之前加了个grep java  才解决的

 

crontab的定时任务如下: 

 

 

shell脚本如下:

 

都写了注释,应该可以说是很清晰了。

核心逻辑就是查询指定的进程id,若是有则无事发生,若是没有 则执行另一个启动脚本将服务启动。期间伴随日志打印到特定文件中。

 

定时任务则是每十分钟启动一次,这个cron表达式在SpringBoot的定时任务里也有实现,就不说了。

这样子定时任务运行起来其实是没有问题的,但是还不能满足需求。

 

试想这么一个场景:

刚刚关闭掉这个服务器,还在上传文件/部署/设置参数 的过程中,此时时间刚好到那个定时任务启动的时间了,他这定时任务又给你把服务给启动起来了,那岂不是很尴尬。

而且定时任务又不是想停就停,linux的定时任务要停只能执行 crontab -e 然后手动修改文件才可以。

 

这个时候我灵光一闪,既然定时任务停不了,那我让你执行命令无法成功不就完事了

于是我在启动服务的脚本和关闭服务的脚本中加入了如下代码:

 

在我手动关闭服务器时,关闭脚本会将定时任务试图执行的moniter.sh 文件名字给改了,这时候定时任务无法找到对应脚本则无法执行相应命令。

然后在我手动启动时,再给他改回去,让定时任务可以找到对应脚本。

 

最终实现效果果然如我所料一般完美,要是服务宕机,自然不是我手动关闭的,那么由于文件名没有被修改掉所以定时任务可以定时执行检测脚本,之后服务就会被重启。

那在维护时我手动进行的服务停止则会带动定时任务的停止,不用担心他自个偷偷摸摸的启动了。

整体实现效果非常满意。

 

阅读全文

这书怎么说呢,讲的挺浅的,而且主要是无意义的代码片段贴的过多了。

很多知识点比如说书中的synchronized关键字讲解、wait notify等方法讲解,明明梳理知识点讲完就完事了,偏偏要贴几十页代码,有水字数嫌疑。

贴代码也就算了吧,还贴的是eclipse的截图代码,也不知道该说什么。

 

本来看synchronized关键字的时候还以为会讲讲jvm实现方式、对象头储存的数据、monitorenter、monitorexit指令之类的。

结果啥都没讲。Lock类也就讲ReentrantLock、ReentrantReadWriteLock的使用,我也以为会有实现、机制、AQS的讲解来着。

每天早上起床看半小时书,就这本看完感觉没学到啥= =

我估摸着是给没怎么接触过java多线程的人群看的,可能不太适合有多线程编程经验的职业人士。

 

最后在吐槽一句: 这些多线程相关的类的使用方法,我不会看API嘛,闲得蛋疼慢慢看这书

阅读全文

说是简单,tm那是找到解决方案之后才简单。

可能是我用的SpringCloud版本太新了,自己配zipkin server把我给配吐了。

又是版本冲突、又是注册不进去Eureka、又是访问ui报错、又是找不到ObjectProvider.orderedStream()方法的,我从百度搜到必应搜到google搜到Stack Overflow,整了一个上午。

我就想着,这玩意怎么能这么恶心呢?感觉像写maven的时候狂报xml错误那种感觉。

 

后来怼到zipkin官网 zipkin.io 上去,卧槽,快速入门里有这么句话:

If you have Java 8 or higher installed, the quickest way to get started is to fetch the latest release as a self-contained executable jar:

 

 

我佛了。然后又查了些关于高版本资料,关于 Zipkin 的服务端,在使用 Spring Boot 2.x 版本后,官方就不推荐自行定制编译了,反而是直接提供了编译好的 jar 包来给我们使用,这是官方提供的演示: https://github.com/openzipkin/docker-zipkin

白搞了半天,原来只要自己去下他的jar包然后启动这个服务就行了,至于如何将微服务跟踪的数据存到mysql/kafka/es 里边去,也可以直接用启动参数指定。

那我还自己配个蛇皮的zipkin server。

 

可以去这个网址: https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/ 选择下载zipkin的各个不同版本的启动jar,我随便找了一个,启动很顺畅,进入 localhost:9411 可以访问ui。

那服务端就算这样配完了,全部流程: 下载 –> 使用 java -jar 命令运行下载的jar

 

服务端搞完后,就到客户端了。

微服务链路跟踪嘛,需要得到请求经过了哪些微服务,了解请求流转的具体参数,那么客户端自然就是一个个不同的微服务了。

 

以我之前的user微服务为例,配置都一样。

build.gradle中加上这一行:

本来应该是spring-cloud-starter-sleuth,spring-cloud-sleuth-zipkin这两个依赖,但是spring-cloud-starter-zipkin这个集成了前面那俩,和前面那俩依赖效果是一样的。

加完依赖后只需要指定zipkin服务地址就好了

我的applicayion.yml: