开发整理-Javaweb应用的系统升级功能
来源:互联网 发布:体育动漫知乎 编辑:程序博客网 时间:2024/05/17 22:27
问题描述
web应用有一个功能菜单是系统升级,通过调用升级脚本,将新发布的war替换原来的tomcat的webapps下的应用,然后停掉tomcate,再重启tomcate。最初实现就是通过简单的用在web项目中通过Process调用这个upgrade.sh脚本文件的。 但是这种实现方式出现了一个问题:javaweb应用是tomcate,作为upgrade.sh脚本的父进程,当这个upgrade.sh进程试图kill掉父进程并重启的时候,父进程被迫终止后,该子进程也无法继续执行。所以这种方式实现的升级功能总是失败。
解决办法
启动一个小应用,来执行Shell,那么这个应用一直以RMI方式监听来自Java应用的命令,根据相应的命令执行脚本。这样的话,用这个java进程去调用Shell命令杀死tomcate,并重启,以此达到系统升级的目的就不会有问题了。
流程如下:
升级程序代码
注册两个命令一个完成系统升级,一个完成Javaweb应用重启,这两个命令的本质就是调用底层的shell脚本完成相应的功能。
import java.rmi.Naming;import java.rmi.registry.LocateRegistry;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class ToolkitListener { public static void main(String[] argv) { Logger logger = Logger.getLogger(ToolkitListener.class); try { //初始化log4j PropertyConfigurator.configure(ClassLoader.getSystemClassLoader().getResource("log4j.properties")); // 启动RMI注册服务,指定端口为1099 (1099为默认端口) LocateRegistry.createRegistry(1099); //重启命令 CmdInterface restartCmd = new CmdOfRestart("restart"); Naming.rebind("restartCmd", restartCmd); //系统升级命令 CmdInterface upgradeCmd = new CmdOfUpgrade("upgradeCmd"); Naming.rebind("upgradeCmd", upgradeCmd); logger.info("Sensor ToolkitListener is ready."); } catch (Exception e) { logger.error("Sensor ToolkitListener is failed. " , e); } }}
RMI调用
在Javaweb应用中,通过RMI的方式调用对应的对象的脚本执行方法。
public static boolean rmiExecute(String name, String var){ if(name==null){ return false; } //调用RMI的升级对象完成升级 log.info("rmi object is "+name+",variable is:"+var); try { switch(name){ case "upgradeCmd": CmdInterface cmdOfUpgrade = (CmdInterface) Naming.lookup("upgradeCmd"); cmdOfUpgrade.setFileName(var); cmdOfUpgrade.excuteShell(); return true; case "restartCmd": CmdInterface CmdOfRestart = (CmdInterface) Naming.lookup("restartCmd"); CmdOfRestart.excuteShell(); return true; default : return true; } } catch (MalformedURLException e) { log.error("RMI调用异常",e);; } catch (RemoteException e) { log.error("RMI调用异常",e);; } catch (NotBoundException e) { log.error("RMI调用异常",e);; } return false; }
升级文件校验
java web应用提供系统升级功能,由用户上传升级包,然后调用脚本完成升级。这个过程中需要对升级包进行校验,当前系统中维护了当前系统版本号和升级补丁版本号,上传升级文件中必须提供升级版本的信息,以及上次升级版本号。
web端在启动升级脚本之前,必须进行升级版本验证,只有当前系统版本和补丁版本与升级包描述的上次升级版本和上次升级补丁版本一致时,才是正确的升级补丁包,才会执行升级。
注意事项(一)
升级脚本必须有足够的执行权限才能保证升级脚本能够正确的被执行,如果是新部署的服务器,可能会出现脚本文件权限不足导致升级执行无效。所以部署项目之后,首先需要修改相关脚本的权限,chmod 777 *给与足够权限,否则可能会出现升级无效的情况。这种情况下,将后台执行的shell命令拷贝出来在服务器上执行,很容易看到命令执行失败的原因是No permmition。
注意事项(二)
RMI注册的是本地IP和本地默认RMI端口,127.0.0.1:1099,所以/ect/hosts文件对RMI程序会有影响,项目中有一个IP设置的功能,系统初始化之前已经将服务器主机名称固定了,所以IP修改操作,也必须保证/ect/hosts文件中的主机名称和127.0.0.1的对应关系,否则IP变更后,RMI根据原来的hosts文件的IP查找主机名称时由于IP已经修改了,连接超时,导致升级操作无法进行。
解决办法:IP修改操作的Shell脚本中,完成IP设置后,重置/ect/hosts文件为标准文件,在项目部署的/bin目录下定义一个standardhosts文件,每次IP设置重启网卡之前,重置下该文件内容:
#update /etc/hostscat /deploy_path/bin/standardhosts>/etc/hosts
注意事项(三)
编写启动该程序的脚本starttoolkit.sh 内容为java -jar xxx.jar,保证它跟项目tomcate一起开机启动,添加到开机启动项文件tomcat中,以后台程序的方式启动:
nohup sh /deploy_path/bin/starttoolkit.sh &
- 开发整理-Javaweb应用的系统升级功能
- JavaWEB应用的消息推送功能:comet4j
- JavaWeb开发中的HttpServletRequest的应用
- EXTJS和javaweb应用的开发思路
- EXTJS和javaweb应用的开发思路
- Junit4在开发JavaWeb当中的应用
- JavaWeb应用开发概述
- 【整理】JavaWeb开发的高并发优化思路
- JavaWeb应用开发架构浅谈
- javaweb应用开发层次简介
- JavaWEB开发之的应用11月14日[原创]
- JavaWeb开发中Setvlet的部署以及应用
- javaweb开发中Servlet三大域对象的应用
- [整理]Android应用开发的环境配置
- JavaWeb应用的生命周期
- javaWeb应用的生命周期
- Javaweb-ServletContext的应用
- 这篇文章主要介绍了JavaWeb中的文件上传和下载功能的实现,在Web应用系统开发中,文件上传和下载功能是非常常用的功能,需要的朋友可以参考下
- ISAPI、CGI、FASTCGI、PHP-FPM与线程安全、线程非安全
- PHP运行模式
- 正则
- VC++模拟键盘输入(keybd_event() 、 PostMessage() /SendMessage()、SendInput())详解
- VS2010 CUDA 5.5 Win7 64位配置以及项目创建配置
- 开发整理-Javaweb应用的系统升级功能
- 二、azkaban 指南
- Java2_JDK的安装和配置
- php 如何生成静态页
- C语言对文件的操作
- UVA 11090 Going in Cycle!(BellmanFord+二分)
- 第四节.持久化操作
- 打印格式
- 基于感知哈希的视觉目标跟踪算法代码