本篇博文,作为 多文件自平衡云传输 框架
的 使用案例
将会全面应用 多文件自平衡云传输 框架
,来实现一个 文件传输系统
那么,话不多说,现在就开始讲解吧:
首先,本人来 说明下 需要的 Jar包支持:
Jar包 支持:
- Youzg-Mec-Utils-0.0.1.jar
(可在本人博文《【小工具】专栏总集篇》文末获取)- rmi-0.0.1.jar
(可在本人博文《详解 RMI技术 的基本实现》文末获取)- net-file-trans-0.0.1.jar
(可在本人博文《详解 网络文件传输技术 的基本实现》文末获取)- balance-0.0.1.jar
(可在本人博文《详解 负载均衡技术 的基本实现》文末获取)- resource-discovery-0.0.1.jar
(可在本人博文《详解 资源发现技术 的基本实现》文末获取)- mfsbct-0.0.1.jar
(可在本人博文《【多文件自平衡云传输】专栏总集篇》文末获取)- log4j-1.2.17.jar
- cglib-nodep-2.1.3.jar
- gson-2.7.jar
- fastjson-1.2.62.jar
在之前的博文中,本人就讲过:
主要是实现 三端:
注册中心
文件发送端
文件接收端
那么,本人就先来实现下 注册中心
:
注册中心:
实现 逻辑:
直接使用 多文件自平衡云传输 框架
,
实现 注册中心 的 初始化、启动、消息处理、关闭 等功能 即可
实现 代码:
package edu.youzg.test;
import edu.youzg.resource_founder.core.IResourceListener;
import edu.youzg.resource_founder.core.ResourceRegistryCenter;
import org.apache.log4j.Logger;
public class ResourceCenterServer implements IResourceListener {
private static final String DEFAULT_CONFIG_PATH = "/resource/ResourceRegistryCenter-RMI.xml";
public static final int RCSPort = 6666;
private ResourceRegistryCenter center;
private Logger log = Logger.getLogger(ResourceCenterServer.class);
public ResourceCenterServer() {
this.center = new ResourceRegistryCenter(RCSPort);
this.center.addListener(this);
}
public void initCenter() {
initCenter(DEFAULT_CONFIG_PATH);
}
public void initCenter(String configFilePath) {
this.center.initRegistryCenter(configFilePath);
}
public void startup() {
this.center.startup();
}
public void shutdown() {
this.center.shutdown();
}
@Override
public void dealMessage(String message) {
log.info(message);
}
}
文件发送端:
实现 逻辑:
直接使用 多文件自平衡云传输 框架
,
实现 文件发送端 的 初始化、注册 文件资源、注销 文件资源 等功能 即可
实现 代码:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.multifile_cloud_transfer.sender.SourceHolderNode;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
/**
* 文件发送端
*/
public class FilesSender {
private SourceHolderNode holderNode;
public FilesSender() throws RegistryIpIsNullException {
this.holderNode = SourceHolderNode.newInstance();
}
public static void initConfig(String configFile) {
SourceHolderNode.initConfig(configFile);
}
public void registryResource(ResourceBaseInfo baseInfo, SourceFileList fileList) {
this.holderNode.reportResource(baseInfo, fileList);
}
public void logoutResource(ResourceBaseInfo baseInfo) {
this.holderNode.logoutResource(baseInfo);
}
}
文件接收端:
实现 逻辑:
直接使用 多文件自平衡云传输 框架
,
实现 文件接收端 的 初始化、获取 资源基本信息列表、获取 指定资源详细信息列表、请求资源 等功能 即可
实现 代码:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.exception.ResourceNotExistException;
import edu.youzg.multifile_cloud_transfer.receive.ResourceReceiver;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.multifile_cloud_transfer.sender.SourceHolderNode;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
import edu.youzg.resource_founder.core.ResourceSpecificInfo;
import edu.youzg.util.PropertiesParser;
import java.util.List;
/**
* 文件接收端
*/
public class FilesReceiver {
private ResourceReceiver videoReceiver;
public FilesReceiver() {
this.videoReceiver = new ResourceReceiver();
}
/**
* 根据 指定路径,初始化 接收端信息
* @param configFile 配置文件 所在路径
*/
public void initConfig(String configFile) {
SourceHolderNode.initConfig(configFile);
PropertiesParser.loadProperties(configFile);
int port = Integer.valueOf(PropertiesParser.value("port"));
String registryIp = PropertiesParser.value("registry_ip");
int registryPort = Integer.valueOf(PropertiesParser.value("registry_port"));
this.videoReceiver.setCenterIp(registryIp);
this.videoReceiver.setCenterPort(registryPort);
this.videoReceiver.setReceiveServerPort(port);
}
public void setBaseInfo(ResourceBaseInfo ri) {
this.videoReceiver.setBaseInfo(ri);
}
public void setSourceFileList(SourceFileList fileList) {
this.videoReceiver.setFileList(fileList);
}
/**
* 获取 注册中心 的资源基本信息列表
* @return 注册中心 的资源基本信息列表
*/
public List<ResourceBaseInfo> getResourceList() {
return this.videoReceiver.getResourceList();
}
/**
* 根据 资源基本信息,获取资源详细信息列表
* @param ri 资源基本信息
* @return 资源详细信息列表
*/
public List<ResourceSpecificInfo> getFileInfoListByResourceInfo(ResourceBaseInfo ri) {
return this.videoReceiver.getFileInfoListByResourceInfo(ri);
}
/**
* 请求资源
*/
public void requestFiles() {
try {
this.videoReceiver.getResourceFiles();
} catch (ResourceNotExistException e) {
e.printStackTrace();
}
}
}
那么,到这里,三端就实现完毕了!
下面,我们来测试下 是否能达到我们期望的目标:
测试:
首先是 注册中心端
文件资源 注册中心:
package edu.youzg.test;
/**
* 注册中心 步骤:<br/>
* 1、初始化 ResourceCenterServer<br/>
* 2、启动 注册中心
*/
public class TestResourceCenter {
public static void main(String[] args) {
ResourceCenterServer rcs = new ResourceCenterServer();
rcs.initCenter("/resource/ResourceRegistryCenter-RMI.xml");
rcs.startup();
}
}
注册中心 RMI配置文件 —— ResourceRegistryCenter-RMI.xml:
配置路径:
resource/ResourceRegistryCenter-RMI.xml
配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<RmiMapping>
<mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
</RmiMapping>
接下来 是 两个发送端:
文件资源 发送端1:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
import edu.youzg.resource_founder.resourcer.ResourceHolder;
/**
* 发送端 步骤:<br/>
* 1、准备 资源
* 2、准备 发送端
* 3、注册资源
*/
public class TestFilesSender1 {
public static void main(String[] args) throws RegistryIpIsNullException {
FilesSender.initConfig("/resource/holder1.properties");
ResourceHolder.scanRMIMapping("/resource/ResourceHolder-RMI.xml");
ResourceBaseInfo ri = new ResourceBaseInfo("app", "20170526212853", "1");
SourceFileList sfl = new SourceFileList();
sfl.setAbsoluteRoot("E:\Multi-file self-balancing cloud transfer\testArea\source\");
sfl.collectFiles();
FilesSender sender = new FilesSender();
sender.registryResource(ri, sfl);
}
}
发送端1 连接参数配置文件 —— holder1.properties:
配置路径:
resource/holder1.properties
配置内容:
port=54192
registry_ip=localhost
registry_port=6666
文件资源 发送端2:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
import edu.youzg.resource_founder.resourcer.ResourceHolder;
/**
* 发送端 步骤:<br/>
* 1、准备 资源
* 2、准备 发送端
* 3、注册资源
*/
public class TestFilesSender2 {
public static void main(String[] args) throws RegistryIpIsNullException {
FilesSender.initConfig("/resource/holder2.properties");
ResourceHolder.scanRMIMapping("/resource/ResourceHolder-RMI.xml");
ResourceBaseInfo ri = new ResourceBaseInfo("app", "20170526212853", "1");
SourceFileList sfl = new SourceFileList();
sfl.setAbsoluteRoot("E:\Multi-file self-balancing cloud transfer\testArea\source");
sfl.collectFiles();
FilesSender sender = new FilesSender();
sender.registryResource(ri, sfl);
}
}
发送端2 连接参数配置文件 —— holder2.properties:
配置路径:
resource/holder2.properties
配置内容:
port=54193
registry_ip=localhost
registry_port=6666
发送端 RMI配置文件 —— ResourceHolder-RMI.xml:
配置路径:
resource/ResourceHolder-RMI.xml
配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<RmiMapping>
<mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
</RmiMapping>
最后是 两个接收端:
文件资源 接收端1:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
import edu.youzg.resource_founder.core.ResourceSpecificInfo;
import java.util.List;
/**
* 接收端 步骤:<br/>
* 1、读取配置文件,初始化 SourceHolderNode 和 FilesReceiver
* 2、请求 资源列表
* 3、请求 指定的资源
*/
public class TestFilesReceive1 {
public static void main(String[] args) {
FilesReceiver filesReceiver = new FilesReceiver();
filesReceiver.initConfig("/resource/receive1.properties");
List<ResourceBaseInfo> resourceList = filesReceiver.getResourceList();
if (resourceList == null || resourceList.size() <= 0) {
System.out.println("注册中心 当前不存在 资源");
return;
}
ResourceBaseInfo resourceInfo = resourceList.get(0);
SourceFileList sfl = new SourceFileList();
List<ResourceSpecificInfo> fileInfoList = filesReceiver.getFileInfoListByResourceInfo(resourceInfo);
sfl.setFileList(fileInfoList);
sfl.setAbsoluteRoot("E:\Multi-file self-balancing cloud transfer\testArea\target1\");
filesReceiver.setBaseInfo(resourceInfo);
filesReceiver.setSourceFileList(sfl);
filesReceiver.requestFiles();
}
}
接收端1 连接参数配置文件 —— receive1.properties:
配置路径:
resource/receive1.properties
配置内容:
port=54194
registry_ip=localhost
registry_port=6666
文件资源 接收端2:
package edu.youzg.test;
import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList;
import edu.youzg.resource_founder.core.ResourceBaseInfo;
import edu.youzg.resource_founder.core.ResourceSpecificInfo;
import java.util.List;
/**
* 接收端 步骤:<br/>
* 1、读取配置文件,初始化 SourceHolderNode 和 FilesReceiver
* 2、请求 资源列表
* 3、请求 指定的资源
*/
public class TestFilesReceive2 {
public static void main(String[] args) {
FilesReceiver filesReceiver = new FilesReceiver();
filesReceiver.initConfig("/resource/receive2.properties");
List<ResourceBaseInfo> resourceList = filesReceiver.getResourceList();
if (resourceList == null || resourceList.size() <= 0) {
System.out.println("注册中心 当前不存在 资源");
return;
}
ResourceBaseInfo resourceInfo = resourceList.get(0);
SourceFileList sfl = new SourceFileList();
List<ResourceSpecificInfo> fileInfoList = filesReceiver.getFileInfoListByResourceInfo(resourceInfo);
sfl.setFileList(fileInfoList);
sfl.setAbsoluteRoot("E:\Multi-file self-balancing cloud transfer\testArea\target2\");
filesReceiver.setBaseInfo(resourceInfo);
filesReceiver.setSourceFileList(sfl);
filesReceiver.requestFiles();
}
}
接收端2 连接参数配置文件 —— receive2.properties:
配置路径:
resource/receive2.properties
配置内容:
port=54195
registry_ip=localhost
registry_port=6666
接收端 RMI配置文件 —— ResourceHolder-RMI.xml:
配置路径:
resource/ResourceHolder-RMI.xml
配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<RmiMapping>
<mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
</RmiMapping>
相信很多同学会疑惑:
为什么 接收端也要有 和发送端一样的 RMI配置文件 呢?
这是因为:
当 接收端 接收完毕 指定的文件资源后,接收端也就成了 该资源的拥有者,
会将自身注册为 该资源的发送端
全局 日志配置文件 —— log4j.properties:
配置路径:
log4j.properties
配置内容:
# 将等级为DEBUG的日志信息输出到console和file这两个目的地,
# console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
# 控制台输出的相关设置
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
# 文件输出的相关设置
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/youzgLog.log
log4j.appender.file.MaxFileSize=10mb
# 限定写入文件的信息级别 #
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
# 日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
至此,使用案例 就基本完成了!
那么,本人现在通过 一个视频 来展示下 运行结果:
视频 展示:
若有需要上述代码的同学,本人已将本文所讲解到的代码上传:
完整 代码:
如有需要,请点击下方链接:
Multi-file-self-balancing-cloud-transfer-System