热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里云客户端的实现(支持文件分块,断点续传,进度,速度,倒计时显示)

一,以实际案例引入阿里云的运用好多人都在玩概念,玩什么概念,比如工业4.0什么叫工业4.0,简单一点理解就是“互联网”+“制造”(互联网+)。再通

一,以实际案例引入阿里云的运用

好多人都在玩概念,玩什么概念,比如工业4.0

什么叫工业4.0,简单一点理解就是 “互联网” + “制造”(互联网+)。再通俗一些的理解就是“互联网”做电商销售,“制造”就是传统生产。

最终做到有了订单才生产,真正做到了按需生产,解决了企业物料损耗,库存堆积等问题。

比如:以印刷厂为案例来说工业4.0,一个印刷厂,客户下单才印刷,不能先印刷一堆东西堆在库存里吧!

先可以看一个流程示意图:

1,客户通过销售平台下单(印刷数量,规格,付款,以及上传需要印刷的文件,与普通电商销售平台的区别体现在上传文件这儿)

2,通过一个服务(ESB),把客户的订单信息,文件数据流转到印刷厂的生产系统。

今天我重点要说的就是ESB服务,怎样高效稳定的把文件从销售平台转到生产系统。

需求:

1,因为订单量大,每天有2至3T的文件从销售平台流向生产系统。

2,这些文件至少要保存一个月左右,有可能返工印刷(算下来企业最小极限要有100个T的存储服务器)。

经过多方面的考虑,建议选择阿里云的存储。

二,阿里云存储OSS的开发

1,支持目录结构的文件,普通文件的传输。

2,销售平台端上传文件到阿里云服务器,支持多线程的(分块上传,分块校验,断点续传,重试,文件MD5值检验,进度,速度,需要用时的显示)

3,ESB服务从阿里云服务器下载文件,支持多线程的(分块下载,分块校验,断点续传,重试,文件MD5值检验,进度,速度,需要用时的显示)

4,把下载的文件经过一系统的预检,处理,最终拷贝到生产系统。

5,反馈文件处理结果到销售平台,生产系统。

这几个需求促使我们有必要开发一个个性化的阿里云客户端,这个客户端已经满足了我上面说的的需求。

 三,具体开发介绍

 3.1程序目录结构的介绍

 

先上图,再来解释。

不管会不会写程序的,只要是懂点IT的,聊到程序时,都会聊到点架构。落伍一些的就聊“三层架构”,牛批一些的就聊“分布式架构”,在博客园里都能找到上十种的架构。

在这儿,我就不画架构图了,就以目录来说我的程序架构。

显而易见:

这个程序最底层的架构:服务端  + 客户端。

服务端:数据库的持久化操作,和一些公用接口,比如获取服务器时间服务。

客户端:UI的数据呈现,下载,文件处理等的业务逻辑。

其中客户端又包含了一个UI框架:

这个框架是MVVM模式,相当于B/S结构中的MVC。

这个UI框架:

1,实现了XAML与C#代码的分离

2,实现在IOC的控制反转的模式

3,利用观察者模板实现了模块与模块之间的解耦

3.2关键核心的架构代码:

代码片段1:

因为整个程序,各个程序之间互相不添加引用,只要在生成项目的时候用这样的命令把dll文件拷贝到UI框架目录下即可

xcopy $(TargetPath) $(SolutionDir)FileTransfer.Client\bin\Debug /y
xcopy $(TargetPath) $(SolutionDir)FileTransfer.Client\bin\Release
/y

具休操作如图所示:

 代码片段2:

因为UI启动程序不添加各dll的引用,目的是使每个功能模板之间的解耦合,所以在启动程序时,需要添加一段引导代码:

    public class AppBootstrapper : BootstrapperBase
{
private CompositionContainer container;

public AppBootstrapper()
{
Initialize();
}

protected override void BuildUp(object instance)
{
this.container.SatisfyImportsOnce(instance);
}

///
/// By default, we are configured to use MEF
///

protected override void Configure()
{
foreach (var file in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "FileTransfer.*.dll"))
{
AssemblySource.Instance.Add(Assembly.LoadFile(file));
}

var catalog =
new AggregateCatalog(
AssemblySource.Instance.Select(x
=> new AssemblyCatalog(x)).OfType());

this.cOntainer= new CompositionContainer(catalog);

var batch = new CompositionBatch();

batch.AddExportedValue
(new WindowManager());
batch.AddExportedValue
(new EventAggregator());
batch.AddExportedValue(
this.container);
batch.AddExportedValue(catalog);

this.container.Compose(batch);
}

protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
return this.container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
}

protected override object GetInstance(Type serviceType, string key)
{
var cOntract= string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
var exports = this.container.GetExportedValues<object>(contract);

if (exports.Any())
{
return exports.First();
}

throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
}

protected override void OnStartup(object sender, StartupEventArgs e)
{
//var startupTasks =
// GetAllInstances(typeof(StartupTask))
// .Cast()
// .Select(exportedDelegate => (StartupTask)exportedDelegate.CreateDelegate(typeof(StartupTask)));

//startupTasks.Apply(s => s());
DisplayRootViewFor();
//base.OnStartup(sender, e);
}
}
View Code

这个引导代码有一个很关键的地方,我把它提炼出来:

    foreach (var file in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "FileTransfer.*.dll"))
{
AssemblySource.Instance.Add(Assembly.LoadFile(file));
}

就是要把需要的dll,通过一定规则的匹配模式把dll放入到程序的容器中。通过以下的代码来获取实例:

    object obj = IoC.Get();
IoC.Get
().ShowDialog(obj);

 代码片段3:

观察者模式的实现:

观察者模式,首先,我们肯定要明白有两个对象,一个是发布信息,一个是接收信息,同时还需要一个契约。如下代码:

    PublishTaskViewModel ptvm = (PublishTaskViewModel)IoC.Get();
ptvm.TaskViewData
= taskData;
ptvm.OperateType
= OperateTypeEnum.Edit;
_eventAggregator.PublishOnUIThread(
new ShowMainContentEvent { COntentModel= ptvm });

其中:
IPublishTask  就是我定义的观察者模式契约。

PublishOnUIThread  就是我发出一条消息,发出消息的模式有很多种,如下图:

订阅对象要实现:

    this._eventAggregator.Subscribe(this);

再用这样的方法接收信息:

    public void Handle(ShowMainContentEvent message)
{

}

 四,结语

一言难尽,还有很多很多要写的地方。这个给公司开发的代码,又不能共享,只能多分享。

如果大家想学习我这套开发框架构,我也有类似的开源程序,麻烦翻一翻我的博客,有一篇程序写了一个软件,就是用的这个架构。并且UI做的比这个更靓哦!

如果大家感觉赞,就动动手指帮我点一下推荐吧!谢谢您能看到这儿。

 


推荐阅读
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
author-avatar
陛下今晚由臣来侍寝吧值
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有