先介绍下wrapper是个什么东西,下面的简单解释是直接Google出来的:
Java Service Wrapper可以把Java应用程序安装成一个Windows NT服务或Unix Daemon.它同时还为应用程序提供日记功能,灵活的配置,可靠的运行性能,按需求重新启动,简化应用程序的安装等。
去年的java项目用了这个东西,在入口类使用接口WrapperListener,继承了WrapperListener的start(),stop(),在项目外层指定入口类,wrapper会通过start()启动虚拟机,这里有些东西要弄清楚。
通过wrapper启动服务的时候,一共是启动了两个进程,一个wrapper服务,一个java虚拟机服务。
wrapper通过轮询的方式询问java虚拟机,以保证服务正常。问题就出在这里,java虚拟机做GC的时候,所有的线程会被挂起,包括响应轮询的线程。在默认的配置里面没有设置轮询超时时间的项,默认是3s。如果3s内gc还没完毕则会使得轮询超时,wrapper会认为服务不正常,自动调用stop();start();重启java虚拟机服务。
这个问题必须显式的配置wrapper.ping.timeout和wrapper.ping.interval,一个是超时时间,一个是轮询间隔时间。相关的内容可以在官网看到
http://wrapper.tanukisoftware.com/doc/english/prop-ping-timeout.html
http://wrapper.tanukisoftware.com/doc/english/prop-ping-interval.html