Java服务后台启动问题总结
Java服务后台启动问题总结
问题背景:
插件部署,由于同步任务和VB请求业务方接口都是采用java语言编写,在实际部署java服务到仓库4.35服务器时,需要编写.bat脚本启动jar包服务,并设置后台运行。
- .bat脚本:
start D:/cq_ck/FimSys/jre32/jre32/bin/java -jar FIMSys.jar
注意:这里直接指定jre运行的原因是,在4.35服务器安装32位的JDK1.8时,会出现报错以下报错:".exe文件不是有效的windows32位应用程序",所以通过在本地安装好32位jdk1.8,并将jre复制到4.35环境,并指定jre运行环境启动jar包。
- .vbs脚本如下:
set ws=WScript.CreateObject("WScript.Shell")
ws.Run"D:\cq_ck\FimSys\start.bat /start",0
将start.vbs脚本放置到程序启动页,这样在服务重启时,可以自动启动服务。
当服务出现如下命令框时即为成功
但是在实际生产中,出现VB调不了java接口问题,经过问题定位,找到以下原因:由于登陆4.35服务器使用账户是公司域账户,账户会在规定时间后自动注销,因此上面启动的服务也会挂掉。
所以需要把java服务做成windows服务后台运行,即使当前域账户注销,也不会影响服务运行。
按照以上思路,将java服务做成Windows服务后台运行的方式有以下几种:
- 将.bat文件做成windows服务
- 将jar包做成windows服务
- 将war部署到Tomcat并将其作为windows服务
方式一、将.bat文件做成windows服务
.bat文件注册成windows服务可以从下两种方式入手:
- 直接把.bat文件注册成windows服务
- 把bat文件转成.exe后注册成windows服务
这两种方式的实现基本一致,只不过第二种方式需要增加一步将.bat文件注册成.exe的过程,下面以第二种方式进行记录过程。
1.1 将.bat文件转换成.exe包
需要使用工具:Bat_To_Exe工具包,下载后打开软件,选择需要转换的.bat文件,进行编译得到.exe包
转换后得到.exe包
1.1 instsrv.exe工具注册服务
注意:这里需要使用administrator权限
执行下面代码
instsrv start D:\cq_ck\FimSys\start.bat
1.2 注册表编辑器添加.exe路径信息
cmd --> regedit --> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fimStart.exe
需要新增文件及内容:
项:Parameters
字符串:Application D:\cq_ck\FimSys
字符串:AppDirectory D:\cq_ck\FimSys\fimStart.exe
字符串:AppParameters
1.3 进入服务并设置启动方式
1.4 关闭及卸载服务
执行如下命令
instsrv fimStart remove
出现问题总结:
在服务器上会发生报错:
"服务启动失败:错误码1053,服务没有及时响应启动或控制请求"
针对以上问题,通过查阅资料,windows服务默认启动超时时间为30s,但是有些服务的启动时间可能会超过30s,这是就需要修改注册表来解决这个问题,注册表地址为:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/ServicesPipeTimeout
,ServicesPipeTimeout可能不存在,如果不存在需要自己手动添加。类型为DWORD,单位是毫秒。由于该设置需要重启服务器,但由于4.35服务器的特殊性不能重启,这里没有继续进行测试,但是可以为以后工作提供一种思路。
方式二、将jar包做成windows服务
由于方式一将.bat文件注册成windows服务没有走通,这里采用第二种方式,使用winSW.exe注册jar包为windows服务,具体方式如下:
2.1 下载winSW-x86.exe应用程序
GitHub地址:https://github.com/winsw/winsw/releases
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lFojUQI-1628769608213)(https://gitee.com/wang-sy-0924/cloud-pic-go/raw/master/img/83JV(~(B)]IGPG(7Q)C%Y}9E.png)
2.2 编写XML文件
<service>
<id>FIMSysTest</id>
<name>FIMSysTest</name>
<description>This service runs FIMSysTest system.</description>
<executable>E:/cq_ck/FimSys/jre32/jre32/bin/java</executable>
<arguments>-jar FIMSysTest.jar</arguments>
<log mode="roll" />
<onfailure action="restart" />
</service>
2.3 注册服务
修改winSW-x86.exe名称为FIMSys.exe,并将FIMSys.jar、FIMSys.xml、FIMSys.exe放置在同一级目录,使用如下命令注册服务
FIMSysTest install
出现问题总结:
这种当时可以将jar包做成windows服务,但是在4.35服务器进行部署时,在执行
FIMSys install
出现报错:".exe文件不是有效的windows32位应用程序"
这个问题与不能手动安装jdk情况一样,检查了版本下载exe版本号,未发现问题,但是在本地执行可以成功,网上有解决方案是可能病毒原因,需要删除.exe注册表等,由于此服务器的特殊性,没有进行以上操作。
方式三、将war部署到Tomcat并设置windows服务
由于服务器环境比较老,windows2003无法手动安装JDK1.8,这里使用免安装32位JDK和免安装版Tomcat8.5,由于服务器中装有jdk1.4,需要设置path环境变量将java version设置为1.8版本。
另外,需要将java服务打成war包部署,由于war包部署时,默认访问需要加上war包名称,但是由于VB服务中, 已经将请求的地址写死,不带服务名称,此时需要修改server.xml,添加如下配置:
appBase=""
<Context path="" docBase="D:\cq_ck\apache-tomcat-8.5.69-windows-x86\apache-tomcat-8.5.69\webapps\FIMSys" debug="0" reloadable="true" crossContext="true"/>
docBase:设置war包路径,FIMSys为war包名称
<!--<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">-->
<Host name="localhost" appBase=""
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="D:\cq_ck\apache-tomcat-8.5.69-windows-x86\apache-tomcat-8.5.69\webapps\FIMSys" debug="0" reloadable="true" crossContext="true"/>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
后台运行成功,大功告成!!!