近两年项目回顾系列——基于Flex和RMI的自动化部署工具
2013-05-30 16:41
387 查看
上一篇博文《RMI初步》我们简单讲述了RMI的实现原理和demo,现在讲讲我们在某项目中基于Flex和RMI开发的自动化部署工具。
需求描述:
我们的项目部署主要包括两部分,jar包和Flex编译生成的swf文件,特别是swf文件可能文件较大,且在系统试运行期间部署可能非常频繁。如何将其快速地部署到几十台机器的集群上,且出错能迅速rollback回之前的版本将是我们面临的一个问题。后来我们开发了这样一个工具,大体思路是:使用adobe air开发成一个.exe格式的工具,安装后可以快速将本机的文件上传到该软件的server上(此server相对各个集群机器而言是RMI的Client),然后server使用RMI迅速同步到集群的各个机器上。其中包括简单的版本管理,使用“年月日+自增的版本号”作为版本管理,出现问题可迅速回退到之前版本。
所用技术:
Flex+BlazeDS+Spring+RMI
主要代码:
FileUpServer.java,在集群的每个节点机器上运行,监听远端的调用。
我们Flex应用调用的程序:
FileUpClient.java,Flex端将本地文件上传到tomcat的对应版本目录下,然后选择“版本同步”时,将每个版本目录下的文件调用此方法来同步到各个集群机器上:
Flex前端的代码就不上了,来一个演示效果吧:(编译时没有加style、skin皮肤,比较丑)
选择一个文件,比如,我们选择D盘下的一个web.xml文件,拖到右侧待上传的框中,点击【文件上传】
点击【文件上传】,将会把一个文件上传到tomcat
点击【转到服务器同步】显示已经在项目的server.xml中配置好的远程服务器信息,点击【文件同步】,将会把tomcat下的20130530_7版本覆盖远端机器的20120126_2版本。
OK,目前基本上是这样一个情况,经过测试,可靠性不错,目前已经可以使用了。剩下来的是加上皮肤文件、css,调一调排版,打扮漂亮一些,让工具更加易用:), 同时准备在服务端起一个timer,定时(如每隔1分钟)检测是否有新版本,有则同步到所有的集群机器上。这样的话,我们以后的版本发布只用上传swf和jar包。
至此,RMI的讨论和学习暂时告一段落,欢迎交流。
需求描述:
我们的项目部署主要包括两部分,jar包和Flex编译生成的swf文件,特别是swf文件可能文件较大,且在系统试运行期间部署可能非常频繁。如何将其快速地部署到几十台机器的集群上,且出错能迅速rollback回之前的版本将是我们面临的一个问题。后来我们开发了这样一个工具,大体思路是:使用adobe air开发成一个.exe格式的工具,安装后可以快速将本机的文件上传到该软件的server上(此server相对各个集群机器而言是RMI的Client),然后server使用RMI迅速同步到集群的各个机器上。其中包括简单的版本管理,使用“年月日+自增的版本号”作为版本管理,出现问题可迅速回退到之前版本。
所用技术:
Flex+BlazeDS+Spring+RMI
主要代码:
FileUpServer.java,在集群的每个节点机器上运行,监听远端的调用。
package com.dc.rmi.server; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import org.apache.log4j.Logger; import com.dc.rmi.config.RmiConfig; /** * 文件上传主程序 * */ public class FileUpServer { public static Logger log = Logger.getLogger(FileUpServer.class); /** * server主程序 * @param args * @throws RemoteException * @throws MalformedURLException * @throws Exception */ public static void main(String[] args) throws MalformedURLException, RemoteException, Exception { //1.==创建并安装安全管理器 if(System.getSecurityManager()==null){ System.setSecurityManager(new RMISecurityManager()); } try{ //==1.定义远程对象 FileUpRemoteImpl fur=new FileUpRemoteImpl(); LocateRegistry.createRegistry(12345); //==2.注册远程对象 String url = "//"+RmiConfig.getRemoteParam("remote_server_ip")+":"+RmiConfig.getRemoteParam("remote_server_port")+"/"+RmiConfig.getRemoteParam("remote_server_name"); Naming.rebind(url, fur); log.debug("server is starting on "+RmiConfig.getRemoteParam("remote_server_ip")+":"+RmiConfig.getRemoteParam("remote_server_port")+"/"+RmiConfig.getRemoteParam("remote_server_name")+" ......"); }catch(MalformedURLException ex){ ex.printStackTrace(); throw new Exception("URL出错,可能是一下原因【URL协议、格式或者路径错误】、【jar问题】.详细信息【"+ex.getMessage()+"】"); }catch(RemoteException ex){ ex.printStackTrace(); throw new Exception("URL出错,可能是一下原因【通信失败(远程服务器不可达、拒绝连接或连接被关闭等)】、【参数按引用传递失败或者返回值无法正常编组解编组】、【协议错误】.详细信息【"+ex.getMessage()+"】"); }catch(Exception ex){ ex.printStackTrace(); throw new Exception("其他错误:"+ex.getMessage()); } } }
我们Flex应用调用的程序:
FileUpClient.java,Flex端将本地文件上传到tomcat的对应版本目录下,然后选择“版本同步”时,将每个版本目录下的文件调用此方法来同步到各个集群机器上:
/** * 上传文件到服务器 * @param rsIp * @param rsPort * @param rsName * @param filePath * @param fileContent * @return * @throws Exception */ public static boolean upFile2Server(String rsIp,String rsPort,String rsName,String filePath,byte[] fileContent)throws Exception{ try{ String url = "//"+rsIp+":"+rsPort+"/"+rsName; //获取远程对象 FileUpRemote fur = (FileUpRemote) Naming.lookup(url); //读取文件 fur.upFile(filePath, fileContent); }catch(MalformedURLException ex){ ex.printStackTrace(); throw new Exception("URL出错,可能是一下原因【URL协议、格式或者路径错误】、【jar问题】.详细信息【"+ex.getMessage()+"】"); }catch(RemoteException ex){ ex.printStackTrace(); throw new Exception("URL出错,可能是一下原因【通信失败(远程服务器不可达、拒绝连接或连接被关闭等)】、【参数按引用传递失败或者返回值无法正常编组解编组】、【协议错误】.详细信息【"+ex.getMessage()+"】"); }catch(NotBoundException ex){ ex.printStackTrace(); throw new Exception("URL出错,可能是一下原因【通信失败(远程服务器不可达、拒绝连接或连接被关闭等)】、【参数按引用传递失败或者返回值无法正常编组解编组】、【协议错误】.详细信息【"+ex.getMessage()+"】"); }catch(Exception ex){ ex.printStackTrace(); throw new Exception("其他错误:"+ex.getMessage()); } return true; }
Flex前端的代码就不上了,来一个演示效果吧:(编译时没有加style、skin皮肤,比较丑)
选择一个文件,比如,我们选择D盘下的一个web.xml文件,拖到右侧待上传的框中,点击【文件上传】
点击【文件上传】,将会把一个文件上传到tomcat
点击【转到服务器同步】显示已经在项目的server.xml中配置好的远程服务器信息,点击【文件同步】,将会把tomcat下的20130530_7版本覆盖远端机器的20120126_2版本。
OK,目前基本上是这样一个情况,经过测试,可靠性不错,目前已经可以使用了。剩下来的是加上皮肤文件、css,调一调排版,打扮漂亮一些,让工具更加易用:), 同时准备在服务端起一个timer,定时(如每隔1分钟)检测是否有新版本,有则同步到所有的集群机器上。这样的话,我们以后的版本发布只用上传swf和jar包。
至此,RMI的讨论和学习暂时告一段落,欢迎交流。
相关文章推荐
- 近两年项目回顾系列——基于MINA+Flex的即时通讯系统
- 近两年项目回顾系列——Flex调用WebService接口
- 近两年项目回顾系列——基于lucene+IKanalyzer实现全文检索
- 【Jenkins教程三】基于Linux实现Jenkins+maven+git+tomcat的自动化构建部署项目
- 近两年项目回顾系列——使用Kettle进行数据迁移(ETL)
- Gradle基于Apache Ant和Apache Maven概念的项目自动化构建工具本地安装及eclipse 项目集成
- 【Jenkins教程二】基于Linux实现Jenkins+maven+tomcat的自动化构建部署项目
- 【Jenkins教程二】基于Linux实现Jenkins+maven+tomcat的自动化构建部署项目
- ControlTier,基于命令的自动化部署工具
- 近两年项目回顾系列——WebService
- 【Jenkins教程三】基于Linux实现Jenkins+maven+git+tomcat的自动化构建部署项目
- 自动化工具Ansible:基于Jenkins+Ansible+GitLab的部署实践
- 基于《Selenium 2自动化测试实战》的学习笔记(2)—— 适合自动化测试的项目及自动化测试工具简介
- 自动化运维集中式管理工具saltstack的基于各个平台的部署
- 近两年项目回顾系列——velocity模板引擎
- ControlTier,基于命令的自动化部署工具
- 应用 Rational 工具简化基于 J2EE 的项目第 5 部分 :架构与设计
- linux 下部署基于speedPhp的项目出现的问题解决方式
- 自动化运维工具SaltStack部署及案例
- 总结基于ArcGIS Server 9.2 Dot Net ADF的WebGIS项目部署问题