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

  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 =www.jpg521.com  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  www.wmyl88.com boolean rmiExecute(www.yuheng119.com/ 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 = www.sb45475.com (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
  
  1
  
  2
  
  1
  
  2
  
  注意事项(三)
  
  编写启动该程序的脚本starttoolkit.sh 内容为Java -jar xxx.jar,保证它跟项目tomcate一起开机启动,添加到开机启动项文件tomcat中,以后台程序的方式启动:

时间: 2024-10-13 02:09:05

开发整理-Javaweb应用的系统升级功能的相关文章

IOS开发-OC学习-常用功能代码片段整理

IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是在做与URL有关的功能时,需要在Info.plist中添加一段代码进而实现让网址完成从Http到Https的转换,以及其他的一些功能. 在从一个新手到逐渐学会各种功能.代码.控件.方法如何使用的过程中,也在逐渐积累一些知识,但是一次总不会把这些东西都深刻记住并完全理解.所以在这儿记录下这些东西,用来

[转]微信公众平台开发(四) 简单回复功能开发

本文转自:http://www.cnblogs.com/mchina/p/3155072.html 一.简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性.下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发. 二.思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现. 关键代码如下: if($keyword=="你好"){ $contentStr

html5开发手机打电话发短信功能,html5的高级开发,html5开发大全,html手机电话短信功能详解

在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用html5来实现他们.简单的让你大开眼界. HTML5 很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单.在这...有 HTML5 启动模板.空白图片.打电话和发短信.自动完成等等,帮助你提高开发效率的同时,还带来了更炫的功能.好了,我们今天就来做一做看看效果吧!! 看代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio

Android KitKat 4.4平台开发-添加USB ADB和MTP功能支持

ADB和MTP是Android基于USB实现的两个重要功能,极大地方便了用户在PC与Android设备之间的互操作,比如传输文件.安装应用.开发调试应用. 本文讲述如何在特定软硬件平台下支持Android ADB和MTP功能. Android版本: KitKat 4.4.2 Linux内核版本: 3.10 (Vendor Kernel) 硬件平台: Atmel SAMA5D3 SoC 针对Linux内核的更改 Merge Android Linux内核USB Gadget驱动到处理器厂商Linu

一个php开发的用于路由器的小功能

最近接到一个需求,假设有A.B.C 三台主机.现A主机要访问C主机上的一个脚本,并且根据A传递的参数给C主机,同时接受C主机返回来的数据.但是现在A主机不能直接通过url.IP访问C主机,需要借由主机B.主要思路:A主机请求B主机并发送数据给B主机,B主机把接受到的数据再发送给C主机,同时接受C主机返回的数据,最后再把此数据返回给A主机. 具体程序如下: <?php //绑定的内网的 url 链接 $intranet_url = 'http://localhost/test.php'; //PO

WAP 2.0开发XHTML MP语法及常用功能

XHTML Mobile Profile 的基本结构 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"         "http://www.wapforum.org/DTD/xhtml-mobile10.dtd" > <html xmlns=&

html5开发手机打电话发短信功能

原文:http://www.open-open.com/code/view/1449843459332 在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用html5来实现他们.简单的让你大开眼界. HTML5 很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单.在这...有 HTML5 启动模板.空白图片. 打电话和发短信.自动完成等等,帮助你提高开发效率的同时,还带来了更炫的功能.好了,我们今天就来做一做看看效果吧!! 看代码: <!DO

【微信公众平台开发】之二:高级功能开发(基于SAE)

导引:选择BAE还是SAE *BAE3.0使用git推送每次修改非常爽, 本地修改>推送到oschina(自己留念)和BAE>点击发布>实际测试: 但是没有在线代码编辑功能!!中间出现问题就很坑爹,得重来一遍. *SAE缺点是不能使用git,但可以在线编辑!(很多时候只是想验证新想法,在线编辑非常有用).还有SAE可以上传多个版本的代码,比如版本1设为默认发布,版本2调试新功能a,版本3调试新功能b.而且不同版本可独立访问,调试起来非常方便.我一般先用"微信开发测试小助手&qu

微信公众平台开发(四) 简单回复功能开发

原文地址:http://www.cnblogs.com/mchina/p/3155072.html 一.简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性.下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发. 二.思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现. 关键代码如下: if($keyword=="你好"){ $contentStr