`

httpURLconnection实现RCP更新

阅读更多

使用eclipse开发RCP系统,如果需要系统保持更新,不可避免的需要实现RCP的更新功能。

对于教程上RCP更新的实现的这里不赘述。本文探讨的是对于部署在支持http协议的更新服务器的RCP系统,利用http协议实现系统的更新。

大略看过一下org.eclipse.update.core及相关更新功能插件代码,基本原理是一样的,都是使用httpURL下载更新代码,并且eclipse做的功能更为强大,比如features及plugins的查找安装、低版本过滤、环境过滤、多线程下载、下载对话框、进度条、站点解析、异常等等,不过eclipse在更高的版本已经抛弃了这种更新方式。这里只是截取部分代码加上自己的理解所写。使用单线程。

背景

1.       RCP系统部署在tomcat-6.0.30服务器上.

2.       RCP系统基于features

3.       RCP系统更新内容(featuresplugins)的打包构建方式与等同于普通方式。

4.       site站点的创建可以是在eclipse创建site更新站点的方式。

使用httpUrlConnection实现下载

假定一个字符串urlString指向一个网络上的资源地址。

locationFileName是将资源下载到本地时所指定的名称。那么可以使用以下代码片段来下载一个资源。

publicstaticboolean download(String destUrl, String locationFileName)

    {

        URL url = getURL(destUrl); //通过new URL(string)方式得到URL

        if (null == url)

        {

            returnfalse;

        }

        Downloader dl = new Downloader();

        HttpURLConnection httpUrl = dl.getURLConnection(url);

        if (null == httpUrl)

        {

            returnfalse;

        }

        BufferedInputStream bis = null;

        FileOutputStream fos = null;

        try

        {

            // 获取网络输入流

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

            // 建立文件

            fos = new FileOutputStream(locationFileName);

 

            int size = 0;

            byte[] buf = newbyte[UpdateConstants.BUFFER_SIZE];

            // 保存文件

            while ((size = bis.read(buf)) != -1)

            {

                fos.write(buf, 0, size);

            }

            fos.close();

            bis.close();

            httpUrl.disconnect();

            returntrue;

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

        returnfalse;

}

/**

     * 功能描述 : 检测当前URL是否可连接或是否有效,

     * 最多连接网络 5 , 如果 5 次都不成功说明该地址不存在或视为无效地址.

     * @param url

     *            指定URL网络地址

     * @return String

     */

    publicsynchronized HttpURLConnection getURLConnection(URL url)

    {

        int counts = 0;

        while (counts++ < 5)

        {

            try

            {

                HttpURLConnection connection = (HttpURLConnection)url.openConnection();

                if (200 == connection.getResponseCode())

                {

                    return connection;

                }

            }

            catch (IOException ex)

            {

                continue;

            }

        }

        System.out.println(no connect);

        returnnull;

    }

实现RCP更新

1.       远程服务器是url=http://10.80.21.10:8080/sdfx

2.       站点的更新配置文件是site.xml.

3.       本地客户端的feature都在features/文件夹下,plugin都在plugins/文件夹下。

 

第一步,找服务器上的feature

触发更新操作后,首先通过httpURLConnection(url+”/site.xml”)指定site.xml文件读入一个新建缓冲输入流如下:

// 获取网络输入流

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

            DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();

            document = parser.parse(bis);

site.xml文件格式固定,我们通过document解析这个文件,得到我们需要更新的feature的列表。我们得到了这些feature的名称,也就得到了他们的绝对URL路径。

第二步,判断是否需要更新

将第一步得到的featureList中的元素与本地的所有的localFeatureList中的元素通过名称中的id部分一一对比,如果找到相同的idfeature在服务器上有更新的版本,那么久认为这个站点是有更新的内容的。

第三步,下载每一个feature

在第一步中找到了许多feature,经过第二步过滤后,对剩下的feature进行下载,并放到本地的feature目录下。下载到本地后feature名称沿用。这里,关键的是featureURL路径需要构建正确。下载的代码亦然如上。要注意的是下载待本地的feature文件是一个jar包,需要通过解压jar来获得里面的信息。通过unjar方法来做到上述(解压后删除源文件)。

/**

     * 解压

     * @param fileName

     * @param locationPath

     * @return

     */

    privateboolean unJar(String fileName, String locationPath)

    {

        File file = new File(fileName);

        try

        {

            JarFile jarFile = new JarFile(file);

            unzip(jarFile, locationPath, 8192);

            jarFile.close();

        }

        catch (IOException e)

        {

            e.printStackTrace();

            returnfalse;

        }

        if (file.exists())

        {

            file.delete();

        }

        returntrue;

    }

 

    /**

     * 解压缩zip格式的压缩文件。

     * @param zipFile zip压缩包

     * @param localPath 解压的目的地

     * @param bufferSize 解压过程中使用的buffer的大小

     */

    publicstaticvoid unzip(ZipFile zipFile, String localPath, int bufferSize)

    {

        byte[] buffer = newbyte[bufferSize];

        ZipInputStream zip = null;

        ZipEntry zipEntry = null;

        try

        {

            zip = new ZipInputStream(new FileInputStream(zipFile.getName()));

            while ((zipEntry = zip.getNextEntry()) != null)

            {

                File file = new File(localPath, zipEntry.getName()).getAbsoluteFile();

                if (zipEntry.isDirectory())

                {

                    file.mkdirs();

                }

                else

                {

                    File parent = file.getParentFile();

                    if (!parent.exists())

                    {

                        parent.mkdirs();

                    }

                    file.createNewFile();

                    long size = zipEntry.getSize();

                    FileOutputStream fos = null;

                    try

                    {

                        fos = new FileOutputStream(file);

                        int readLen = -1;

                        while (size != 0)

                        {

                            readLen = zip.read(buffer);

                            size -= readLen;

                            if (readLen != -1)

                            {

                                fos.write(buffer, 0, readLen);

                            }

                        }

                    }

                    finally

                    {

                        if (fos != null)

                        {

                            fos.close();

                        }

                    }

                }

            }

        }

        catch (FileNotFoundException e)

        {

            e.printStackTrace();

        }

        catch (IOException e)

        {

            e.printStackTrace();

        }

        finally

        {

            try

            {

                if (zip != null)

                {

                    zip.close();

                }

            }

            catch (IOException e)

            {

                e.printStackTrace();

            }

        }

}

第四步,解析feature.xml文件找plugin

解压后,在文件夹中有固定名称为feature.xml文件,我们来解析这个文件。解析后我们得到一个plugins的信息列表。我们得到了这个列表,也就知道了需要下载的plugins的绝对URL

第五步,下载每一个plugin

对于每一个plugin信息,检查这个plugin是否是一个第三方的依赖插件(我们只用到了某一个功能),如果是并且本地已经有了该插件,我们可以忽略。而,如果这个插件需要依赖第三方的插件,还需要检查这个插件依赖的插件是否已经存在于本地客户端中了,如果没有,则不可以安装该插件(这里有瑕疵, 就是要求必须要先安装依赖插件)。

       如果上面的条件已经具备,下面就是需要构建一个指向该pluginURL。然后下载这个plugin。下载成功后,我们还需要根据feature中的该pluginunpack属性来确认该plugin是否需要解压。解压过程如上。

在下载每一个feature中的plugin之前我们需要做一个list来存放我们已经下载plugin,用来保证在某一个plugin下载失败时,该feature全部回滚。

其他

在打包构建时,我们还可以在feature工程中打包一个updateConfig.ini文件,这个文件中记录本次更新中需要删除的一些插件(防止插件扩展了同一个扩展点,但是这个扩展点又不允许同时有两个扩展的冲突)、需要更新的第三方插件、是不是替换本地客户端的某些资源文件、是不是需要二次启动。

       通过配置该文件,我们能修改客户端的某些配置文件(如config.ini),覆盖资源文件(xmlxlsRCP系统工作过程中所需要的),删除一些插件(给系统瘦身,RCP系统的普通更新方式是增量更新,不删除过时的插件)、以及是否需要重启动。

       重启动:有些资源或功能不能通过在更新中来完成,比如config.ini文件需要重写时,如果本地客户端旧代码中没有在更新时就修改config.ini的功能代码,而是想通过刚刚更新下去的代码来在重启时来修改config.ini文件,就需要二次启动。因为在eclipse启动时,eclipse本身首先来加载config.ini文件,系统启动进入到我们能控制的代码时,再修改config.ini文件已经不起作用(如果不重启的话),因此我们可以在主插件启动时,检测updateConfig.ini文件,看其是否指明了在启动时需要做的工作(为防止每次都重启,可以通过修改updateConfig.ini中的属性或是有无unpdateConfig.ini文件来判定)。

分享到:
评论

相关推荐

    rcp收集资料上传

    可以使用Java的HttpURLConnection或者Apache HttpClient库来实现。数据格式可能是JSON或XML,取决于服务器接口的要求。 5. 错误处理:在数据上传过程中,需要考虑网络异常、服务器错误等可能性,通过try-catch语句...

    安川MP7系列工控系统源码解析:关键算法与硬件交互揭秘

    内容概要:本文深入剖析了安川MP7系列工业控制系统的关键源码,重点介绍了运动轨迹规划、通信协议处理以及故障处理机制等方面的技术细节。通过对实际代码片段的解读,揭示了该系统在硬件寄存器直接访问、特殊功能码处理等方面的独特之处。同时,文中还分享了一些基于实践经验得出的重要参数设置及其背后的故事,如特定摩擦补偿系数的选择原因等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对安川产品有一定了解并希望深入了解其内部工作机制的专业人士。 使用场景及目标:帮助读者掌握安川MP7系列控制器的工作原理,提高对类似系统的维护能力和故障排查效率。对于想要进一步研究或二次开发该系统的开发者来说,也能提供宝贵的参考资料。 其他说明:文章不仅限于理论讲解,还包括了许多来自一线的实际案例和经验教训,使读者能够更好地理解和应用所学知识。

    自动化测试与脚本开发_Python3_pynput_键盘鼠标操作录制执行代码生成工具_用于自动化测试_脚本录制_重复操作模拟_宏命令生成_提高工作效率_支持GUI界面_跨平台兼容_.zip

    自动化测试与脚本开发_Python3_pynput_键盘鼠标操作录制执行代码生成工具_用于自动化测试_脚本录制_重复操作模拟_宏命令生成_提高工作效率_支持GUI界面_跨平台兼容_

    嵌入式八股文面试题库资料知识宝典-深入分析Windows和Linux动态库应用异同.zip

    嵌入式八股文面试题库资料知识宝典-深入分析Windows和Linux动态库应用异同.zip

    嵌入式八股文面试题库资料知识宝典-C语言总结.zip

    嵌入式八股文面试题库资料知识宝典-C语言总结.zip

    风储直流微电网母线电压控制策略与双闭环MPPT技术研究

    内容概要:本文详细探讨了风储直流微电网中母线电压控制的关键技术。首先介绍了风储直流微电网的背景和发展现状,强调了母线电压控制的重要性。接着阐述了永磁风机储能并网技术,解释了永磁风机如何通过直接驱动发电机将风能转化为电能,并确保与电网的同步性和稳定性。然后深入讨论了双闭环控制MPPT技术,这是一种通过内外两个闭环控制系统来实现实时调整发电机运行参数的技术,确保风机始终处于最大功率点附近。最后,文章探讨了储能控制母线电压平衡的方法,即通过储能系统的充放电操作来维持母线电压的稳定。结论部分指出,通过这些技术的有机结合,可以实现对风储直流微电网的有效管理和优化控制。 适合人群:从事新能源技术研发的专业人士、电气工程研究人员、风电系统工程师。 使用场景及目标:适用于希望深入了解风储直流微电网母线电压控制策略的研究人员和技术人员,旨在帮助他们掌握最新的控制技术和方法,以提高系统的稳定性和效率。 其他说明:文章还对未来风储直流微电网的发展进行了展望,指出了智能化和自动化的趋势,以及储能技术的进步对系统性能的影响。

    嵌入式八股文面试题库资料知识宝典-C++object-oriented.zip

    嵌入式八股文面试题库资料知识宝典-C++object-oriented.zip

    【操作系统开发】HarmonyOS目录结构详解:构建高效开发环境与跨设备协同应用

    内容概要:文章详细介绍了HarmonyOS的目录结构及其重要性,从整体框架到核心目录的具体功能进行了全面剖析。HarmonyOS凭借其分布式架构和跨设备协同能力迅速崛起,成为全球操作系统领域的重要力量。文章首先概述了HarmonyOS的背景和发展现状,强调了目录结构对开发的重要性。接着,具体介绍了根目录文件、AppScope、entry和oh_modules等核心目录的功能和作用。例如,AppScope作为全局资源配置中心,存放应用级的配置文件和公共资源;entry目录是应用的核心入口,负责源代码和界面开发。此外,文章还对比了HarmonyOS与Android、iOS目录结构的异同,突出了HarmonyOS的独特优势。最后,通过旅游应用和电商应用的实际案例,展示了HarmonyOS目录结构在资源管理和代码组织方面的应用效果。; 适合人群:具备一定编程基础,尤其是对移动操作系统开发感兴趣的开发者,包括初学者和有一定经验的研发人员。; 使用场景及目标:①帮助开发者快速理解HarmonyOS的目录结构,提高开发效率;②为跨设备应用开发提供理论和技术支持;③通过实际案例学习资源管理和代码组织的最佳实践。; 其他说明:HarmonyOS的目录结构设计简洁明了,模块职责划分明确,有助于开发者更好地管理和组织代码和资源。随着万物互联时代的到来,HarmonyOS有望在开发便利性和生态建设方面取得更大进展,吸引更多开发者加入其生态系统。

    飞轮储能充放电控制Simulink仿真模型:基于永磁同步电机的矢量控制与dq轴解耦

    内容概要:本文详细介绍了飞轮储能充放电控制的Simulink仿真模型,重点在于采用永磁同步电机的矢量控制和dq轴解耦控制策略。充电时,外环控制转速,内环控制dq轴电流;放电时,外环控制直流母线电压,内环同样控制dq轴电流。文中还讨论了硬件与软件环境的选择,以及仿真模型的调试与运行情况,最终得出该模型具有良好的跟随性能和波形完美度。 适用人群:从事电力电子系统、储能技术和Simulink仿真的研究人员和技术人员。 使用场景及目标:适用于需要对飞轮储能系统进行深入研究和仿真的场合,旨在提高充放电效率和稳定性,满足不同应用场景的需求。 其他说明:该仿真模型已调试完成,可以直接用于进一步的研究和实际应用,为未来的飞轮储能技术研发提供了有价值的参考。

    嵌入式八股文面试题库资料知识宝典-北京瑞德方科技.zip

    嵌入式八股文面试题库资料知识宝典-北京瑞德方科技.zip

    嵌入式八股文面试题库资料知识宝典-同方万维硬件测试工程师.zip

    嵌入式八股文面试题库资料知识宝典-同方万维硬件测试工程师.zip

    1_15套python PDF格式.zip

    1_15套python PDF格式.zip

    三相三电平整流器仿真:基于电压电流双闭环控制与SPWM调制的性能分析

    内容概要:本文详细介绍了三相三电平整流器的仿真过程及其性能分析。文中首先概述了三相三电平整流器的基本概念及其在电力系统中的重要作用,接着重点探讨了电压电流双闭环控制方式的工作原理和优势,以及SPWM调制技术的具体应用。通过仿真文件展示了整流器在不同条件下的响应情况,验证了这两种技术的有效性和优越性。最后,作者表达了对未来实际应用的期望。 适合人群:从事电力电子研究的技术人员、高校相关专业师生、对电力控制系统感兴趣的工程爱好者。 使用场景及目标:适用于希望深入了解三相三电平整流器工作原理和技术细节的研究人员;目标是在理论基础上掌握电压电流双闭环控制和SPWM调制的实际应用方法。 其他说明:本文提供的仅为仿真文件,未涉及实物实验数据。

    嵌入式八股文面试题库资料知识宝典-恒光科技.zip

    嵌入式八股文面试题库资料知识宝典-恒光科技.zip

    嵌入式八股文面试题库资料知识宝典-北京天华威视科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京天华威视科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-微软研究院笔试题目的答案.zip

    嵌入式八股文面试题库资料知识宝典-微软研究院笔试题目的答案.zip

    Arduino UART实验例程【正点原子EPS32S3】

    Arduino UART实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    嵌入式八股文面试题库资料知识宝典-朝歌数码.zip

    嵌入式八股文面试题库资料知识宝典-朝歌数码.zip

    嵌入式八股文面试题库资料知识宝典-Cortex系列.zip

    嵌入式八股文面试题库资料知识宝典-Cortex系列.zip

Global site tag (gtag.js) - Google Analytics