模板模式实现任务分配

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/mottohlm/article/details/81152924