策略
定义策略context类
定义策略类
这里可以考虑用枚举优化,以及策略类通过spring根据策略接口获取
模板
orderMsgDingding对应数据库表,存储权限命名的类和订单状态关系,这样当涉及改变,只需要修改类和订单状态即可,
public class OrderStatusExec implements BeanFactoryAware {
@Autowired
private OrderMsgDingdingService orderMsgDingdingService;
@Autowired
private OrderDingTimerService orderDingTimerService;
private static BeanFactory beanFactory;
private static ThreadPoolExecutor executor;
public final static int DEFAULT_TASKQUEUE_SIZE = 30;
private static int maxThread = 10;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
//@Scheduled(fixedRate = 10000)
@Scheduled(cron="0 0 */1 * * ? ")
public void handle() throws InterruptedException {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
List<Integer> execTask = Lists.newArrayList();
//查询所有开启以及开启定时提醒的钉钉提醒定时任务
List<OrderDingTimer> list1 = orderDingTimerService.list(Wrappers.<OrderDingTimer>lambdaQuery().eq(OrderDingTimer::getStatus, 1).eq(OrderDingTimer::getRegular, 1));
for (int i = list1.size() - 1; i >= 0; i--) {
OrderDingTimer k = list1.get(i);
execTask.add(k.getCode());
}
/* executor = new ThreadPoolExecutor(maxThread, maxThread, 0L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(
DEFAULT_TASKQUEUE_SIZE), new ThreadPoolExecutor.CallerRunsPolicy());*/
List<OrderMsgDingding> list = orderMsgDingdingService.list(Wrappers.<OrderMsgDingding>lambdaQuery().in(OrderMsgDingding::getId, execTask));
//CountDownLatch countDownLatch = new CountDownLatch(list.size());
for (OrderMsgDingding k : list) {
//list.forEach(k -> {
// executor.execute(() -> {
try {
String processService = k.getProcessService();
MsgExec msgExec = (MsgExec) beanFactory.getBean(processService);
msgExec.execMsg(k);
//countDownLatch.countDown();
} catch (BeansException e) {
//countDownLatch.countDown();
e.printStackTrace();
}
//});
//});
}
//countDownLatch.await();
//executor.shutdown();
//executor = null;
}
}
责任链
订单模块使用
/**
* 责任链模式
*/
public interface OrderStatus {
/**
* 设置下一个处理器
*
* @param nextOrderStatus
*/
public void setNextOrderStatus(OrderStatus nextOrderStatus);
/**
* 执行下一个处理器
*
* @param orderStatusDingMsg
*/
public void execNextHandler(OrderStatusDingMsg orderStatusDingMsg);
/**
* 对外提供执行工作,封装校验+执行流程
*
* @param orderStatusDingMsg
*/
public void service(OrderStatusDingMsg orderStatusDingMsg);
/**
* 校验是否拦截
*
* @param orderStatusDingMsg
* @return
*/
abstract boolean check(OrderStatusDingMsg orderStatusDingMsg);
/**
* 执行当前处理器核心工作,交由具体子类实现
*
* @param orderStatusDingMsg
*/
abstract void execCurrentHandler(OrderStatusDingMsg orderStatusDingMsg);
}
这里有模板
public abstract class OrderStatusBase implements OrderStatus {
protected OrderStatus nextOrderStatus;
public void setNextOrderStatus(OrderStatus nextOrderStatus) {
this.nextOrderStatus = nextOrderStatus;
}
public void execNextHandler(OrderStatusDingMsg orderStatusDingMsg) {
if (this.nextOrderStatus != null) nextOrderStatus.service(orderStatusDingMsg);
}
public void service(OrderStatusDingMsg orderStatusDingMsg) {
if (check(orderStatusDingMsg)) {
execCurrentHandler(orderStatusDingMsg);
} else {
execNextHandler(orderStatusDingMsg);
}
}
public void sendMsg(UrlDataInfo urlDataInfo){
MessageProcessBase messageProcessBase = new MessageProcessBase();
messageProcessBase.sendMsg(urlDataInfo);
}
}
@Service
public class PrestatusWaitcheckOrderstatus extends OrderStatusBase implements OrderStatus, CommandLineRunner {
@Override
public void run(String... args) throws Exception {
OrderStatus prestatusHadcheckOrderstatus = new PrestatusHadcheckOrderstatus();
OrderStatus formalstatusNormalOrderStatus = new FormalstatusNormalOrderStatus();
OrderStatus FormalstatusExceptionOrderStatus = new FormalstatusExceptionOrderStatus();
OrderStatus formalstatusCompleteOrderStatus = new FormalstatusCompleteOrderStatus();
setNextOrderStatus(prestatusHadcheckOrderstatus);
prestatusHadcheckOrderstatus.setNextOrderStatus(formalstatusNormalOrderStatus);
formalstatusNormalOrderStatus.setNextOrderStatus(FormalstatusExceptionOrderStatus);
FormalstatusExceptionOrderStatus.setNextOrderStatus(formalstatusCompleteOrderStatus);
}
@Autowired
private PreOrderHeadService preOrderHeadService;
@Autowired
private OrderMsgDingdingService orderMsgDingdingService;
private String getStatus() {
return PRESTATUS_WAITCHECK;
}
private Integer getType() {
return type;
}
@Override
public void execCurrentHandler(OrderStatusDingMsg orderStatusDingMsg) {
PreOrderHead preOrderHead = preOrderHeadService.queryByPreOrderCode(orderStatusDingMsg.getOrderCode());
Map<String, List<String>> stringListMap = preOrderHeadService.converShopNameAndPreOrderCode(Lists.newArrayList(preOrderHead));
//发送钉钉
OrderMsgDingding one = orderMsgDingdingService.getOne(Wrappers.<OrderMsgDingding>query()
.lambda().eq(OrderMsgDingding::getStatus, PRESTATUS_WAITCHECK)
.eq(OrderMsgDingding::getType, type).eq(OrderMsgDingding::getActive, 1));
if (one != null) {
sendMsg(new UrlDataInfo(one.getToken(), data.toString()));
}
}
public boolean check(OrderStatusDingMsg orderStatusDingMsg) {
return getType().equals(orderStatusDingMsg.getType()) && getStatus().equals(orderStatusDingMsg.getConsignPlatformConstan());
}
}