版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mottohlm/article/details/81152924
场景:有m台服务器,有n个任务,需要把n个任务按一定策略分给服务器来执行。如按IP地址随机分、按任务数量平均分等。
实现约定:使用一个list来代表全部服务器,比如list中只存服务器的IP地址。同样使用list来代表任务,比如list中存每个任务的ID。分配的过程也就是把服务器IP和任务ID映射起来的过程,所以可以用一个Map 来存储分本结果。
实现:
先创建一个模板类 TaskWorker
import java.util.*;
public abstract class TaskWorker {
public List<String> serviceList ;
public List<Long> taskList ;
public Map<Long , String > taskMap ;
public TaskWorker(){
}
public TaskWorker(List<String> serviceList ,List<Long> taskList){
this.serviceList = serviceList ;
this.taskList = taskList ;
this.taskMap = new HashMap<>() ;
}
public TaskWorker buildService(List<String> serviceList){
if(this.serviceList == null){
this.serviceList = new ArrayList<>() ;
this.serviceList.addAll(serviceList);
}else{
this.serviceList.addAll(serviceList);
}
return this ;
}
public TaskWorker buildTask(List<Long> taskList){
if(this.taskList == null){
this.taskList = new ArrayList<>() ;
this.taskList.addAll(taskList);
}else{
this.taskList.addAll(taskList);
}
return this ;
}
/**
* 分配任务
*/
abstract void allocation();
/**
* 任务执行简化为迭代MAP 打印中其中的k - v
* 分析其中的任务ID及服务器ID 来看分配策略是否正确
*/
public void excute(){
if(this.taskMap == null){
System.out.println("无任务!");
}
else{
Set<Long > set = this.taskMap.keySet();
for(Long key : set ){
System.out.println("任务ID为:"+key+"--->执行它的服务器为:"+taskMap.get(key));
}
}
}
/**
* 总调度方法
*/
public final void processed(){
allocation() ;
excute() ;
}
}
随机分配 RandomTaskWorker
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.HashMap;
import java.util.Random;
public class RandomTaskWorker extends TaskWorker {
Log log = LogFactory.getLog(RandomTaskWorker.class);
/**
* 按IP地址随机
*/
@Override
void allocation() {
if(this.serviceList == null || this.taskList == null ||
serviceList.size()<0 || taskList.size() <0){
log.error("service or task do not exist");
return ;
}
if(this.taskMap==null) {
this.taskMap = new HashMap<>();
}
for(int i=0 ; i<this.taskList.size() ; i++){
Random rnd = new Random();
taskMap.put(this.taskList.get(i) ,serviceList.get(rnd.nextInt(serviceList.size())));
}
}
}
平均分配
import java.util.HashMap;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class AverageTaskWorker extends TaskWorker {
Log log = LogFactory.getLog(AverageTaskWorker.class);
/**
* 分配任务方式为按任务数量平均分
* 1.当任务数量比服务器数量少时,一台服务器分一个任务;
* 2.当任务数据比服务器数量多时,平分的
*/
@Override
void allocation() {
if(this.serviceList == null || this.taskList == null ||
serviceList.size()<0 || taskList.size() <0){
log.error("service or task do not exist");
return ;
}
if(this.taskMap==null) {
this.taskMap = new HashMap<>();
}
if(serviceList.size() >= taskList.size()){
int cur = 0;
for(Long taskKey :taskList){
taskMap.put(taskKey ,serviceList.get(cur));
cur ++ ;
}
}
else{
for(Long taskKey : taskList){
int left = taskKey.intValue() % serviceList.size() ;
taskMap.put(taskKey ,serviceList.get(left));
}
}
}
}
测试方法
import java.util.ArrayList;
import java.util.List;
public class TaskWorkerTest {
public static void main(String[] args){
TaskWorker tk = new AverageTaskWorker();
TaskWorker rtk = new RandomTaskWorker();
List<Long> taskList = getTask(31);
List<String> serviceList = getService(15 ) ;
tk.buildTask(taskList).buildService(serviceList) ;
tk.processed();
System.out.println("<---------我是华丽的分割线------------->");
rtk.buildTask(taskList).buildService(serviceList) ;
rtk.processed();
}
public static List<Long> getTask(int taskSize){
if(taskSize <1){
return null ;
}
List<Long> taskList = new ArrayList<>();
for(int i=0 ; i <taskSize ;i++ ){
taskList.add(new Long(i)) ;
}
return taskList ;
}
public static List<String> getService(int ServiceSize){
if(ServiceSize <1){
return null ;
}
List<String> serviceList = new ArrayList<>();
for(int i=0 ; i <ServiceSize ;i++ ){
serviceList.add("服务器00"+ i) ;
}
return serviceList ;
}
}
测试结果
任务ID为:0--->执行它的服务器为:服务器000
任务ID为:1--->执行它的服务器为:服务器001
任务ID为:2--->执行它的服务器为:服务器002
任务ID为:3--->执行它的服务器为:服务器003
任务ID为:4--->执行它的服务器为:服务器004
任务ID为:5--->执行它的服务器为:服务器005
任务ID为:6--->执行它的服务器为:服务器006
任务ID为:7--->执行它的服务器为:服务器007
任务ID为:8--->执行它的服务器为:服务器008
任务ID为:9--->执行它的服务器为:服务器009
任务ID为:10--->执行它的服务器为:服务器0010
任务ID为:11--->执行它的服务器为:服务器0011
任务ID为:12--->执行它的服务器为:服务器0012
任务ID为:13--->执行它的服务器为:服务器0013
任务ID为:14--->执行它的服务器为:服务器0014
任务ID为:15--->执行它的服务器为:服务器000
任务ID为:16--->执行它的服务器为:服务器001
任务ID为:17--->执行它的服务器为:服务器002
任务ID为:18--->执行它的服务器为:服务器003
任务ID为:19--->执行它的服务器为:服务器004
任务ID为:20--->执行它的服务器为:服务器005
任务ID为:21--->执行它的服务器为:服务器006
任务ID为:22--->执行它的服务器为:服务器007
任务ID为:23--->执行它的服务器为:服务器008
任务ID为:24--->执行它的服务器为:服务器009
任务ID为:25--->执行它的服务器为:服务器0010
任务ID为:26--->执行它的服务器为:服务器0011
任务ID为:27--->执行它的服务器为:服务器0012
任务ID为:28--->执行它的服务器为:服务器0013
任务ID为:29--->执行它的服务器为:服务器0014
任务ID为:30--->执行它的服务器为:服务器000
<---------我是华丽的分割线------------->
任务ID为:0--->执行它的服务器为:服务器001
任务ID为:1--->执行它的服务器为:服务器0014
任务ID为:2--->执行它的服务器为:服务器003
任务ID为:3--->执行它的服务器为:服务器006
任务ID为:4--->执行它的服务器为:服务器0014
任务ID为:5--->执行它的服务器为:服务器007
任务ID为:6--->执行它的服务器为:服务器0010
任务ID为:7--->执行它的服务器为:服务器007
任务ID为:8--->执行它的服务器为:服务器006
任务ID为:9--->执行它的服务器为:服务器009
任务ID为:10--->执行它的服务器为:服务器000
任务ID为:11--->执行它的服务器为:服务器003
任务ID为:12--->执行它的服务器为:服务器005
任务ID为:13--->执行它的服务器为:服务器001
任务ID为:14--->执行它的服务器为:服务器004
任务ID为:15--->执行它的服务器为:服务器004
任务ID为:16--->执行它的服务器为:服务器005
任务ID为:17--->执行它的服务器为:服务器0011
任务ID为:18--->执行它的服务器为:服务器0014
任务ID为:19--->执行它的服务器为:服务器0011
任务ID为:20--->执行它的服务器为:服务器0011
任务ID为:21--->执行它的服务器为:服务器0014
任务ID为:22--->执行它的服务器为:服务器007
任务ID为:23--->执行它的服务器为:服务器007
任务ID为:24--->执行它的服务器为:服务器0013
任务ID为:25--->执行它的服务器为:服务器0013
任务ID为:26--->执行它的服务器为:服务器007
任务ID为:27--->执行它的服务器为:服务器0012
任务ID为:28--->执行它的服务器为:服务器001
任务ID为:29--->执行它的服务器为:服务器008
任务ID为:30--->执行它的服务器为:服务器0013