代码评审---》 策略模式+线程池

1 ,调用类

 public static  void taskProcessing(CWfTaskCommand req) {
        String flowCodes = req.getFlowCode();
        SceneInterFace strategy = StrategyFactory.getPayStrategy(flowCodes);
        strategy.execute(req);
    }

2 ,策略实现

/**
 * @author TYL
 * @date 2020/12/25 16:10
 */
public class StrategyFactory {
    /**
     * 使用策略工厂获取具体策略实现
     * @param code
     * @return
     */
    public static SceneInterFace getPayStrategy(String code) {
        try {
            return (SceneInterFace) Class.forName(TaskSceneEnum.getClassNameByCode(code)).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3 枚举类

/**
 * @author tyl
 * @version V1.0
 * @Description: 任务处理状态
 * @date 2020/12/25 14:46
 */
public enum TaskSceneEnum {

    //场景1
    OWN_PENDING("005005001","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
    OWN_INPROESS("005005002","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
    OWN_REASSIGNMENT("005005003","com.jy.claim.workflow.service.impl.task.SceneOneServiceImpl"),
    //场景2
    LINK_PENDING("005006001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LINK_INPROESS("005006002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LINK_REPORT("005006004","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LINK_FINISH("005006009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LOSS_ASSESSMENT_PENDING("005007001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LOSS_ASSESSMENT_INPROESS("005007002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    LOSS_ASSESSMENT_FINISH("005007009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_ASSESSMENT_PENDING("006007001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_ASSESSMENT_INPROESS("006007002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_ASSESSMENT_FINISH("006007009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_PRICING_PENDING("007006001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_PRICING_INPROESS("007006002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_PRICING_FINISH("007006009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_PRICING_RETURN("007006017","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_LOSS_PENDING("007005001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_LOSS_INPROESS("007005002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_LOSS_FINISH("007005009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    ASSESSMENT_LOSS_RETURN("007005017","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_LOSS_PENDING("006005001","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_LOSS_INPROESS("006005002","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_LOSS_FINISH("006005009","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    PRICING_LOSS_RETURN("006005007","com.jy.claim.workflow.service.impl.task.SceneTwoServiceImpl"),
    //场景三
    ASSESSMENT_PRICING_PENDING_THREE("00000000","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_PRICING_INPROESS_THREE("007006002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_PRICING_FINISH_THREE("007006009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_PRICING_RETURN_THREE("007006017","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_LOSS_PENDING_THREE("007005001","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_LOSS_INPROESS_THREE("007005002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_LOSS_FINISH_THREE("007005009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ASSESSMENT_LOSS_RETURN_THREE("007005017","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    PRICING_LOSS_PENDING_THREE("006005001","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    PRICING_LOSS_INPROESS_THREE("006005002","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    PRICING_LOSS_FINISH_THREE("006005009","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    PRICING_LOSS_RETURN_THREE("006005007","com.jy.claim.workflow.service.impl.task.SceneThreeServiceImpl"),
    ;

    /**
     * 场景三
     * @return
     */
    public static List<String> getReturnList(){
        ArrayList list = new ArrayList();
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_PENDING.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_INPROESS.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_FINISH.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_RETURN.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_PENDING.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_INPROESS.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_FINISH.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_RETURN.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_PENDING.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_INPROESS.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_FINISH.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_RETURN.getCode());
        return list;
    }
    /**
     * 场景1
     * @return
     */
    public static List<String> getOwnList(){
        ArrayList list = new ArrayList();
        list.add(TaskSceneEnum.OWN_PENDING.getCode());
        list.add(TaskSceneEnum.OWN_INPROESS.getCode());
        list.add(TaskSceneEnum.OWN_REASSIGNMENT.getCode());
        return list;
    }

    /**
     * 场景2
     * @return
     */
    public static List<String> getLinkList(){
        ArrayList list = new ArrayList();
        list.add(TaskSceneEnum.LINK_PENDING.getCode());
        list.add(TaskSceneEnum.LINK_INPROESS.getCode());
        list.add(TaskSceneEnum.LINK_REPORT.getCode());
        list.add(TaskSceneEnum.LINK_FINISH.getCode());
        list.add(TaskSceneEnum.LOSS_ASSESSMENT_PENDING.getCode());
        list.add(TaskSceneEnum.LOSS_ASSESSMENT_INPROESS.getCode());
        list.add(TaskSceneEnum.LOSS_ASSESSMENT_FINISH.getCode());
        list.add(TaskSceneEnum.PRICING_ASSESSMENT_PENDING.getCode());
        list.add(TaskSceneEnum.PRICING_ASSESSMENT_INPROESS.getCode());
        list.add(TaskSceneEnum.PRICING_ASSESSMENT_FINISH.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_PENDING.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_INPROESS.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_FINISH.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_PRICING_RETURN.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_PENDING.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_INPROESS.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_FINISH.getCode());
        list.add(TaskSceneEnum.ASSESSMENT_LOSS_RETURN.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_PENDING.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_INPROESS.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_FINISH.getCode());
        list.add(TaskSceneEnum.PRICING_LOSS_RETURN.getCode());
        return list;
    }

    private String code;
    private String className;

    TaskSceneEnum(String code, String className) {
        this.code = code;
        this.className = className;
    }

    public static String getClassNameByCode(String code) {
        String className = "";
        if (StringUtils.isEmpty(code)) {
            return className;
        }

        for (TaskSceneEnum e : TaskSceneEnum.values()) {
            if (e.code.equalsIgnoreCase(code)) {
                className = e.className;
                break;
            }
        }
        return className;
    }
    public String getCode() {
        return code;
    }

    public String getClassName() {
        return className;
    }
}

4 接口 实现类
在这里插入图片描述

5 策略1

/**
 * @author TYL
 * @date 2020/12/25 15:10
 */
@Service
@Slf4j
public class SceneOneServiceImpl implements  SceneInterFace{

    private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);

    /**
     * @author TYL
     * @param req
     * @deprecated 场景1:删除、新增,只有当前环节=>当前环节;调度、改派
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void execute(CWfTaskCommand req) {
        CountDownLatch countDownLatch=new CountDownLatch(2);
        CWfTask cWfTask= new CWfTask();
        BeanUtils.copyProperties(req,cWfTask);
        cWfTask.setId(CommonUtil.getUUID());
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(10));
        executor.execute(() -> {
            icWfTaskService.deleteById(req.getId());
            log.info("删除数据成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        executor.submit(()-> {
            icWfTaskService.save(cWfTask);
            log.info("删除数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
           executor.shutdown();
        }
    }
}

6 策略2


/**
 * @author TYL
 * @date 2020/12/25 15:10
 */
@Service
@Slf4j
public class SceneTwoServiceImpl implements SceneInterFace {
    private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);
    /**
     * 任务处理
     * 场景2:完成当前任务,新增任务,只有环节变更情况;任务流转
     */
    @Override
    public void execute(CWfTaskCommand req) {
        CountDownLatch countDownLatch=new CountDownLatch(2);
        CWfTask cWfTask= new CWfTask();
        BeanUtils.copyProperties(req,cWfTask);
        cWfTask.setId(CommonUtil.getUUID());

        CWfTask updateWfTask= new CWfTask();
        BeanUtils.copyProperties(req,updateWfTask);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(10));
        executor.execute(() -> {
            icWfTaskService.updateById(updateWfTask);
            log.info("更新数据成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        executor.submit(()-> {
            icWfTaskService.save(cWfTask);
            log.info("新增数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            executor.shutdown();
        }
    }
}

7 策略3


/**
 * @author TYL
 * @date 2020/12/25 15:10
 */
@Service
@Slf4j
public class SceneThreeServiceImpl implements SceneInterFace {

    private static ICWfTaskService icWfTaskService = SpringContextUtils.getBean(ICWfTaskService.class);

    /**
     * 场景3:退回时,完成当前任务,删除原任务,新增任务;任务退回
     * @param req
     */
    @Override
    public void execute(CWfTaskCommand req) {
        CountDownLatch countDownLatch=new CountDownLatch(3);
        CWfTask cWfTask= new CWfTask();
        BeanUtils.copyProperties(req,cWfTask);
        cWfTask.setId(CommonUtil.getUUID());
        CWfTask updateWfTask= new CWfTask();
        BeanUtils.copyProperties(req,updateWfTask);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(10));
        executor.execute(() -> {
            CWfTask updateWfTaskTaskClass= new CWfTask();
            updateWfTaskTaskClass.setId(req.getId());
            updateWfTaskTaskClass.setTaskStatus("009");
            icWfTaskService.update(updateWfTask);
            log.info("更新状态已完成成功id[{}],线程名[{}]",req.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        executor.submit(()-> {
            icWfTaskService.deleteById(req.getId());
            log.info("删除数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        executor.submit(()-> {
            icWfTaskService.save(cWfTask);
            log.info("新增数据成功id[{}],线程名[{}]",cWfTask.getId(),Thread.currentThread().getName());
            countDownLatch.countDown();
        });
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            executor.shutdown();
        }
    }
}

8 接口

/**
 * @author TYL
 * @date 2020/12/25 15:10
 */
public interface SceneInterFace {
    public void execute(CWfTaskCommand req);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值