开发整理-Javaweb应用的系统升级功能

原创 2016年11月19日 08:10:46

问题描述

  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/hosts
cat /deploy_path/bin/standardhosts>/etc/hosts

注意事项(三)

编写启动该程序的脚本starttoolkit.sh 内容为java -jar xxx.jar,保证它跟项目tomcate一起开机启动,添加到开机启动项文件tomcat中,以后台程序的方式启动:

  nohup sh /deploy_path/bin/starttoolkit.sh &
版权声明:本文为博主原创文章,未经博主允许不得转载。

java web项目war包自动升级部署方案

前言之前,我们公司部署以及升级都是由运维去管理的,联想到很多开源平台都支持自动升级,索性我也做个自动升级war的功能。 这里没有用docker镜像发包,灰度发包等,只适用于单个tomcat的部署环境...
  • qq273681448
  • qq273681448
  • 2017年07月10日 17:11
  • 3594

生产环境的java项目如何更新

生产环境的java项目如何更新 https://www.oschina.net/question/223727_193278 https://jingyan.baidu.com/art...
  • yang889999888
  • yang889999888
  • 2017年06月08日 12:07
  • 240

web程序在线更新实现

说说以前的一个web程序在线更新实现,给没有实现过的人们提供一点思路,这是我一个项目的实现,也许方式不是很好,但是它实现了基本的需求。          公司的开发了一个web产品,这个web产品部...
  • wckjlu
  • wckjlu
  • 2017年04月13日 10:32
  • 411

在线批量部署网站代码和数据库版本更新升级

【项目需求】 从SVN仓库自动checkout指定或全部代码文件,部署更新到指定应用服务器,并保存和比较每台应用服务器上的代码版本和SVN仓库代码版本。数据库实现版本化管理更新。 【项目疑难点】 ...
  • blin911
  • blin911
  • 2017年01月11日 15:14
  • 696

eclipse实现JavaWeb项目 增量打包

很多情况下,项目是不允许全量发布的,所以你得把有做修改的文件一个个挑出来,如果有成千上百的文件,你是不是要头大了? 以下方法应该可以让你得到解救!前提是你是用装有svn plugin的eclipse上...
  • lyhjava
  • lyhjava
  • 2016年11月03日 14:13
  • 3290

实现应用的增量更新\升级

转载请注明出处:http://blog.csdn.net/yyh352091626/article/details/50579859 增量升级的背景 虽然很多App的版本更新并不频繁,但是...
  • zb872676223
  • zb872676223
  • 2016年06月28日 19:08
  • 1197

java web项目自动打补丁包 web工程项目 自动化 补丁包

  • 2017年08月01日 14:25
  • 78KB
  • 下载

JavaWeb项目 积累问题解决方案,持续更新中

饶了一大圈,又回到我大学自学的javaweb,很多东西都忘记了,所以重新做的项目,将遇到的问题都记录下来,以便于自己复习:    一.想必登陆界面都会想实现输入完账户名和密码,敲击键盘的Enter...
  • omayyouhappy
  • omayyouhappy
  • 2016年09月30日 14:08
  • 819

eclipse创建web项目,让web项目自动更新到Tomcat下的webapps目录

首先在eclipse中配置好Tomcat服务器。 首先在eclipse下出现了一个server,如下图。 然后双击图中的Tomcat服务器,打开如下图界面 为了能够修改,首先要注意:Tomcat中...
  • fengzy1990
  • fengzy1990
  • 2017年02月13日 22:40
  • 3252

JAVA项目更新升级程序

  • 2013年04月26日 14:19
  • 5.12MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开发整理-Javaweb应用的系统升级功能
举报原因:
原因补充:

(最多只允许输入30个字)