­

【多文件自平衡雲傳輸】使用展示 —— 文件傳輸系統

Youzg LOGO

本篇博文,作為 多文件自平衡雲傳輸 框架使用案例
將會全面應用 多文件自平衡雲傳輸 框架,來實現一個 文件傳輸系統

那麼,話不多說,現在就開始講解吧:

首先,本人來 說明下 需要的 Jar包支持

Jar包 支持:


在之前的博文中,本人就講過:

主要是實現 三端

  1. 註冊中心
  2. 文件發送端
  3. 文件接收端

那麼,本人就先來實現下 註冊中心

註冊中心:

實現 邏輯:

直接使用 多文件自平衡雲傳輸 框架
實現 註冊中心 的 初始化啟動消息處理關閉 等功能 即可

實現 代碼:

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

至此,使用案例 就基本完成了!
那麼,本人現在通過 一個視頻 來展示下 運行結果

視頻 展示:

《大學僧 自製 Java「開源」框架 使用展示》


若有需要上述代碼的同學,本人已將本文所講解到的代碼上傳:

完整 代碼:

如有需要,請點擊下方鏈接:
Multi-file-self-balancing-cloud-transfer-System