JSW介绍
Java Service Wrapper(JSW) 可用于将Java后台程序包装成一个后台服务运行。除此以外,JSW还可以在你的Java程序挂掉以后,自动帮你把服务再次拉起,相当于提供了一个守护进程的功能。它的一个主要目标就是,单点服务做到尽可能高可靠,挂了之后第一时间帮你把它拉起来!这样,能够最大化降低运维成本,让你不用半夜提心吊胆服务挂掉起不来,让你可以第二天妥妥当当地到公司再解决服务挂掉的问题。
除了Window和Linux,Java Service Wrapper 还支持其他平台。此外,Java Service Wrapper分为社区版和企业版,企业版的功能更加强大,但是要收费。目前一般使用的都是社区版,免费并且开源。
特性列举
- 多平台支持
- 简单的安装步骤,即可将Java程序当成后台进程方式运行
- Java服务高可靠,服务挂了自动拉起
- 无需编写任何脚步,灵活的配置,可定制化JSW的配置和JVM(你的Java服务)的配置
- Log功能(针对Java标准控制台输出)
错误检测
JVM Hang 的检测原理
上面说到,JSW充当我们Java服务的守护进程,当我们的服务挂掉以后,JSW能够自动感知,并且将其拉起(RESTART,当然可以选择在挂掉以后执行其他动作,后面章节会讲到);当JVM hung住时间太长,也会将服务重启。那么,它是怎么办到的呢?
JSW两个概念: JSW守护进程和wrapper,守护进程用来守护我们的应用程序,在应用程序挂掉的时候将其拉起;而wrapper实际上就是在我们的应用程序上面包装了一层。JSW守护进程会开启一个ServerSocket监听端口(服务端);而对于wrapper,内部会开启一个socket(客户端),连接到守护进程的serversocket监听端口上。守护进程在wrapper连接上自己以后,就会定期地发送ping包(其内部定义的数据包格式)给wrapper,wrapper收到ping包以后,会返回一个包,告知守护进程自己是OK的。若守护进程在一定时间内没有收到wrapper ping包的返回,则认为目标jvm,即我们的应用程序是hang住了。
给一个具体的图示:
使用方式
使用方式参考官方介绍,另外,对于使用maven构建的项目,还可以通过appassember插件在构建的时候集成JSW,参考appassember-maven-plugin usage-jsw
重要的配置参数
所有参数可以在此处查看
wrapper.ping.interval
配置ping JVM的间隔时间,默认为5s
wrapper.ping.timeout
配置ping JVM的超时时间,单位为秒,默认为30s,表示30s如果ping JVM没有收到响应,则认为JVM此时hung住,需要执行响应的动作,动作取决于wrapper.ping.timeout.action
的指定
wrapper.ping.timeout.action
设置当ping JVM timeout以后执行的动作,默认动作是RESTART,表示会重启应用
所有action:
- DEBUG : 打印debug信息,没什么卵用 (Since ver. 3.5.0)
- DUMP : 触发thread dump (Since ver. 3.3.6)
- GC : 触发一次full gc (Since ver. 3.5.7)
- RESTART : 重启应用
- SHUTDOWN : 停掉应用
- USER_< n > : 触发一个用户自定义事件 (Since ver. 3.5.0, Professional Edition)
- PAUSE : 如果应用程序接受暂停操作,则暂停应用程序(没搞懂) (Since ver. 3.5.0)
- RESUME : 继续运行暂停的应用程序 (Since ver. 3.5.0)
- SUCCESS : ?(没搞懂) (Since ver. 3.5.5)
- NONE : 什么都不做
【重要】可以配置多个action,将会在ping timeout后触发这些action,eg:
wrapper.ping.timeout.action=DUMP,RESTART
注意,如果JVM真的已经挂了,那么GC和DUMP动作将不会进行