产品化的系统免不了要实现的就是系统的自动更新,下边讲讲我在工作中实现的win下的产品自动更新。

自动更新步骤:

1、本地系统版本与服务器最新版本比对。

2、发现更新版本后进行升级版下载。

3、关闭应用服务器,更新本地程序,清除缓存,执行sql脚本,重启应用服务器

其中1、2步我是使用java实现的,使用了HttpClient来与服务器端(这里是相对应终端客户来说,指的是产品提供商的运营平台)进行交互,发现更新版本后下载到终端客户本地第3部是借用bat命令来实现的,关闭tomcat,解压下载包,清空tomcat缓存文件夹work,执行sql脚本,重启应用并提醒维平台更新完成。

如下代码为进行版本比对并下载服务器端更新文件

public class VersionUpdate {

protected int connectTimeout = 30 * 1000; // 连接超时:30s

protected int readTimeout = 1 * 1000 * 1000; // IO超时:1min

//标识,是否存在新的更新文件

private boolean isUpdated = false;

//当前系统版本

private String localVerStr ;

//保存最新的版本

String netVersion;

public void update() {

SystemManager manager = (SystemManager)BeanFactoryProxy.getBean("systemManager");

Register register = manager.getRegister();

localVerStr = this.getNowVer(StringUtils.replaceAll(register.getPhysicalPath(), '\\', '/')+"/webapps/quickLMS/WEB-INF/classes/ver.txt");

/*

这里是通过HTTP访问一个页面,以取得网络上的版本号

比如这里就是在这个页面直接打印出 6.19.1.1

然后把这个版本号比对本地的版本号,如果版本号不同的话,就从网络上下载新的程序并覆盖现有程序

*/

//读取网络上的版本号

try {

netVersion = HttpPostUtil.doGet(ConstLMS.NEW_VERSION);

if (netVersion.equals(localVerStr)) {

System.out.println("当前文件是最新版本");

isUpdated = false;

} else {

System.out.println("存在更新文件,现在开始更新");

isUpdated = true;

}

}catch (Exception ex) {

ex.printStackTrace();

}

//如果版本不同,下载网络上的文件,更新本地文件

if (isUpdated) {

//缓存网络上下载的文件

File newFile = new File(register.getPhysicalPath()+"/webapps/" + StringUtils.DateToStr(new Date(), "yyyyMMdd")+".zip");

//获取网络上的文件位置

String netFileAddress = ConstLMS.MNG_ADDRESS+HttpPostUtil.doGet(ConstLMS.NEW_VERSION_ADDRESSS+"&sn="+register.getSn());

FileOutputStream fos = null;

BufferedInputStream bis = null;

try {

//打开URL通道

URL url = new URL(netFileAddress);

URLConnection conn = url.openConnection();

conn.setConnectTimeout(connectTimeout);

conn.setReadTimeout(readTimeout);

conn.connect();

bis = new BufferedInputStream(conn.getInputStream());

byte[] buffer = new byte[1024];

int size = 0;

fos = new FileOutputStream(newFile);

System.out.println("正在从网络上下载新的更新文件");

//保存文件

try {

while ((size = bis.read(buffer)) != -1) {

fos.write(buffer, 0, size);

fos.flush();

}

} catch (Exception ex4) {

System.out.println(ex4.getMessage());

}

System.out.println("文件下载完成");

} catch (Exception ex) {

System.out.println("文件读取错误");

} finally {

try{

if(bis!=null){

bis.close();

}

}catch(Exception exp){

exp.printStackTrace();

}

try {

if(fos!=null){

fos.close();

}

} catch (IOException exp) {

exp.printStackTrace();

}

}

batExec(register.getPhysicalPath());

}

}

private String getNowVer(String nowVersionURL) {

//本地版本文件

File verFile = new File(nowVersionURL);

FileReader is = null;

BufferedReader br = null;

//读取本地版本

try {

is = new FileReader(verFile);

br = new BufferedReader(is);

String ver = br.readLine();

return ver;

} catch (FileNotFoundException ex) {

System.out.println("本地版本文件未找到");

} catch (IOException ex) {

System.out.println("本地版本文件读取错误");

} finally {

//释放资源

try {

br.close();

is.close();

} catch (IOException ex1) {

}

}

return "";

}

public void batExec(String webapps){

try {

Runtime.getRuntime().exec("cmd.exe /c start "+StringUtils.replaceAll(webapps, '\\', '/')+"/startup.bat");

} catch (IOException e) {

e.printStackTrace();

}

}

}

bat脚本

set now=%date:~0,10%

set now=%now:-=%

set TOMCAT_HOME=%cd%

set webapps=%cd%\webapps

echo %webapps%

if exist "%webapps%\%now%.zip" goto shutdown

echo not find %webapps%\%now%.zip

:shutdown

call "%TOMCAT_HOME%\bin\shutdown.bat" %1

if errorlevel 1 goto unzip

:unzip

cd %webapps%

unzip -o "%webapps%\%now%.zip"

del "%webapps%\%now%.zip" /q/f

:execSql

cd..

cd..

if not exist "%cd%\mysql" goto startup

set MYSQL_HOME="%cd%\mysql"

cd "%MYSQL_HOME%\bin"

mysql -uroot -proot -Dquicklms -s -e "source %webapps%\update.sql"

del %webapps%\update.sql /q/f

:startup

cd %TOMCAT_HOME%

%TOMCAT_HOME%\bin\startup.bat

echo %TOMCAT_HOME%

:delwork

cd %TOMCAT_HOME%

rd %TOMCAT_HOME%\work /s/q

:end

分享到:

2012-05-14 13:52

浏览 2365

评论

mysql tomcat 自动重连_基于tomcat+mysql的c/s模式下的系统自动更新相关推荐

  1. keepalived mysql双主架构图_基于keepalived Mysql双主热备配置

    基于keepalived双主热备: 一.环境: OS:CentOS 6.5 X64 DB Version:Percona Mysql 5.7.15-9-log 路径:/app/mysql57 数据文件 ...

  2. mysql创建新闻发布时间_基于PHP+mysql实现新闻发布系统的开发

    新闻发布系统 1. 系统简介 一个简单的新闻系统,包含了四个功能,增删改查,利用PHP语言,结合了MySQL数据库,开发工具用的是Dreamweaver. 2.数据库设计 -- 数据库: `newsd ...

  3. jsp mysql简单仓库信息管理系统_基于jsp+mysql的JSP简单学生信息管理系统

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat 7.x, ...

  4. mysql开发二手书籍交易_基于PHP+MySQL二手书交易系统

    随着时代的变迁和人们的对知识的汲取,人们需要不断的购买一些新的图书来进行学习,但是这些图书在使用过一点时间之后其价值也会在拥有者手中变的没有那么高了,但是对于没有阅读和使用过这本书的人来说其还是具有更 ...

  5. mysql 开启断线重连_[BUG反馈]MYSQL长连接中(SWOOLE) 使用事务提交开启断线重连接抛出异常...

    官方源代码 vendor/topthink/think-orm/src/db/PDOConnection.php :1369行public function startTrans(): void { ...

  6. arm linux考勤,定稿毕业论文_基于ARM与Linux的员工刷卡考勤系统喜欢就下吧(范文1)...

    <毕业论文_基于ARM与Linux的员工刷卡考勤系统.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文_基于ARM与Linux的员工刷卡考勤系统(喜欢就下吧)> ...

  7. mysql三阶段提交实现_基于两阶段提交的分布式事务实现(UP-2PC)

    引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...

  8. tomcat依赖导入步骤_图说tomcat(三)导入tomcat源码到idea

    前面两篇文章中我们提到了寻找tomcat的main函数,还有tomcat的启动加载过程,第一个还好,基本上都是通过.sh文件来看的,但第二个如果直接通过文本打开java文件就有点痛苦了,可能小伙伴看的 ...

  9. 基于mysql的高校学生管理系统_基于Web的学生考勤管理系统的设计与实现(Struts2,MySQL)...

    基于Web的学生考勤管理系统的设计与实现(Struts2,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文13000字,程序代码,MySQL数据库) 考勤管理系统对于各个高校来 ...

最新文章

  1. 神经拟态芯片拉近AI与人脑距离
  2. 为什么用抽象三层结构
  3. async spring 默认线程池_springboot-@Async默认线程池导致OOM问题
  4. 刚安装的python如何使用-Python requests的安装与简单运用
  5. Linux 管道使用示例
  6. 学习伟大的Python的第七天
  7. DHCP中继处理办法
  8. 2021-08-10 HDFS Web报错Couldn‘t preview the file.
  9. 【script】数据处理的瑞士军刀 pandas
  10. plsql突然无法连接数据库,原来是tnsnames.ora文件出了问题
  11. 转)Ubuntu安装teamviewer
  12. abaqus切削为什么没有切屑_金属高速切削的ABAQUS仿真(下)
  13. 数据库连接池的实现方法(MySQL+C++)
  14. tortoiseHg查看后一个版本和parent版本的不同
  15. 摄像头网络信号测试软件,工程宝如何测试摄像机
  16. 第三次打卡 特征工程
  17. 一个Autoit恶意资源消耗样本
  18. 易宝典——玩转O365中的EXO服务 之五十 如何知道微软管理员进行了哪些操作
  19. 微信支付整理 (微信公众号支付)
  20. 无人机编程donekit及通讯(二)

热门文章

  1. 视频光流估计综述:从算法原理到具体应用
  2. 20210810 所有图像数据准备一条龙(labelme_json转mask、数据增强Augmentor、随机种子设比例生成train.val、转格式(.jpg转.png)、尺寸、位深度变换
  3. 如何创建一个定时管理的页面
  4. Jupyter Notebook各种使用方法
  5. JAVA连接SQL Server数据库的端口配置操作步骤
  6. Linux下安装搜狗拼音
  7. 我的博士之路(壮根美颜-康亚龙):五年读博路,苦熬曙光明
  8. USEARCH11新功能——OTU表抽平otutab_rare
  9. Python使用matplotlib可视化多个时间序列数据、在同一个可视化图像中可视化多个时间序列数据(Multiple Time Series)
  10. pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )