1、资源请求者职责
- 向注册中心,请求服务。
- 向服务器,请求资源。
2. 与注册中心建立通信
- 建立RMI通信
//代理对象,与注册中心进行沟通
private IResourceRegistryCenterAction center;
/**
* 配置服务器 ip和端口号
* @param configPath configPath 配置文件
* @throws IOException
*/
public ResourceReceiver(String configPath) throws IOException {
try {
PropertiesParse propertiesParse = new PropertiesParse();
propertiesParse.loadProperties(configPath);
RMIClient centerClient = new RMIClient();
centerClient.setPort(Integer.parseInt(propertiesParse.value("registerCenterPort")));
centerClient.setIp(propertiesParse.value("registerCenterIp"));
//获取代理对象,与注册中心进行沟通
center = centerClient.getProxy(IResourceRegistryCenterAction.class);
}
3. 与资源拥有者建立通信
1.建立RMI 通信
private RMIClient resourceClient;
//获取与资源拥有者建立通信代理
private IResourceHolderAction resourcer;
public ResourceReceiver(String configPath) throws IOException {
try {
resourceClient = new RMIClient();
resourceClient.setIp(propertiesParse.value("resourcerPort"));
resourceClient.setPort(Integer.parseInt(propertiesParse.value("resourcerIp")));
resourcer = resourceClient.getProxy(IResourceHolderAction.class);
} catch (NotInterfaceClassException e) {
e.printStackTrace();
}
}
4. 发送端选择策略
提供给用户,选择接受端。
- 策略接口
package man.kuke.core;
import man.kuke.registry.Node;
import java.util.List;
/**
* @author: kuke
* @date: 2020/12/14 - 18:21
* @description:
*/
public interface ISenderSelectedStrategy {
/**
* 用户选择发送端
* @param senderList 发送端地址
* @param maxSenderCount 最大发送个数
* @return 选择的发送端
*/
List<Node> selectNode(List<Node> senderList, int maxSenderCount);
}
- 默认策略
package man.kuke.core;
import man.kuke.registry.Node;
import java.util.List;
/**
* @author: kuke
* @date: 2020/12/14 - 18:23
* @description:
*/
public class DefaultSenderSelectedStrategy implements ISenderSelectedStrategy {
@Override
public List<Node> selectNode(List<Node> senderList, int maxSenderCount) {
return null;
}
}
4.服务请求
/**
* 资源请求者请求资源
* 1. 获取文件信息
* 2. 向注册中心请求服务地址
* 3. 对文件进行分割
* 4. 建立接收服务器
* 5. 选择发送端
* 6. 向发送端发送资源请求
* @param resourceInfo 资源信息
* @param absolutePath 本地绝对路径,用设置存放目录
*/
public void requestResourcesService(ResourceInfo resourceInfo,String absolutePath) {
// * 1. 获取文件信息
List<FileInfo> fileInfos = new ArrayList<>();
Iterator<FileInfo> fileInfoIterator = resourceInfo.fileInfoAccessor();
while(fileInfoIterator.hasNext()) {
fileInfos.add(fileInfoIterator.next());
}
int id = resourceInfo.getId();
// * 2. 向注册中心请求服务地址
List<Node> resourceOwners = center.getResourceOwners(id);
// * 5. 选择发送端
resourceOwners = senderSelectedStrategy.selectNode(resourceOwners, maxSenderCount);
int size = resourceOwners.size();
// * 3. 对文件进行分割
ResourceSpliter resourceSpliter = new ResourceSpliter();
List<List<SectionHander>> filesSplit = resourceSpliter.filesSplit(fileInfos, size);
// * 4. 建立接收服务器
ReceiveServer receiveServer = new ReceiveServer(size, absolutePath, resourceInfo);
receiveServer.startup();
// * 6. 向发送端发送资源请求
int index = 0;
for (Node resourceOwner : resourceOwners) {
List<SectionHander> sectionHanders = filesSplit.get(index++);
resourceClient.setPort(resourceOwner.getPort());
resourceClient.setIp(resourceOwner.getIp());
new Thread(new Runnable() {
@Override
public void run() {
resourcer.dealResourceRequest(id,me,sectionHanders);
//TODO 注册资源
}
}).start();
}
}