接收平台消息,模板模式实践

模板抽象类

@Service
public abstract class BaseMessageService {

    private static final Logger logger = LoggerFactory.getLogger(KwaiOrderMessageService.class);

    /**
     * Description: 数据处理
     * Date: 2021/9/15 11:17
     * @Author: wangwenying10
     * @Param: [parentMessage]
     * @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
     */
    protected abstract Response<Boolean> dataHandle(KwaiParentMessage parentMessage);

    /**
     * Description: 任务执行 先处理数据再进行业务处理
     * Date: 2021/9/15 11:13
     * @Author: wangwenying10
     * @Param: [parentMessage]
     * @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
     */
    public Response<Boolean> execute(KwaiParentMessage parentMessage) {
        Response<Boolean> kwaiParentMessageResponse = dataHandle(parentMessage);
        if (!kwaiParentMessageResponse.isOk()) {
            logger.error(kwaiParentMessageResponse.getMsg());
            return Response.fail("参数解析失败");
        }
        return bussiness(parentMessage);
    }

    /**
     * Description: 业务处理
     * Date: 2021/9/15 11:17
     * @Author: wangwenying10
     * @Param: [parentMessage]
     * @Return: com.gome.retail.boot.model.Response<java.lang.Boolean>
     */
    protected abstract Response<Boolean> bussiness(KwaiParentMessage parentMessage);
}

继承模板类的子类

@KwaiEvent({"kwaishop_order_statusChange"})
@Service
public class KwaiOrderMessageService extends BaseMessageService {

    private static final Logger logger = LoggerFactory.getLogger(KwaiOrderMessageService.class);

    @Resource
    private KwaiApiService kwaiApiService;

    @Resource
    private KwaiExtchCfgService kwaiExtchCfgService;

    @Resource
    private KwaiMcoOrderService kwaiMcoOrderService;

    @Override
    protected Response<Boolean> dataHandle(KwaiParentMessage parentMessage) {
        try {
            if (StringUtils.isEmpty(parentMessage.getInfo())) {
                return Response.fail("缺少消息体");
            }
            KwaiMessageOrder kwaiMessageOrder = JSON.parseObject(parentMessage.getInfo(), KwaiMessageOrder.class);
            parentMessage.setKwaiMessage(kwaiMessageOrder);
        } catch (Exception e) {
            logger.error("参数解析失败message:{}", JSON.toJSONString(parentMessage), e);
            return Response.fail("参数解析失败");
        }
        return Response.ok();
    }

    @Override
    protected Response<Boolean> bussiness(KwaiParentMessage parentMessage) {
        KwaiExtchCfg kwaiExtchCfg = kwaiExtchCfgService.obtainCacheExtchCfg(String.valueOf(parentMessage.getUserId()));
        KwaiMessageOrder kwaiMessageOrder = (KwaiMessageOrder) parentMessage.getKwaiMessage();
        logger.info("消息单个订单获取 oid:{}", kwaiMessageOrder.getOid());
        OpenSellerOrderDetailResponse response = kwaiApiService.orderInfoGet(kwaiMessageOrder.getOid(), kwaiExtchCfg);
        logger.info("消息单个订单获取返回 oid:{} response:{}", kwaiMessageOrder.getOid(), JSON.toJSONString(response));
        if (response.isSuccess() && null != response.getData()) {
            Response<Boolean> singleResponse = kwaiMcoOrderService.singleOrder(response.getData(), kwaiExtchCfg);
            logger.info("消息单个订单处理结果oid:{}, res:{}", kwaiMessageOrder.getOid(), JSON.toJSONString(singleResponse));
        }
        return Response.ok();
    }
}

实现类缓存

@Component
public class KwaiAcceptServiceFactory {

    private static final Logger logger = LoggerFactory.getLogger(KwaiAcceptServiceFactory.class);

    /**
     * 消息service注册表
     */
    private Map<String, BaseMessageService> messageServiceMap;

    @PostConstruct
    private void init() {
        messageServiceMap = new HashMap<>();
        initMessageService();
    }

    /**
     * 初始化service注册表
     */
    private void initMessageService() {
        Map<String, BaseMessageService> result = SpringBeanUtil.getApplicationContext().getBeansOfType(BaseMessageService.class);
        if (CollectionUtils.isEmpty(result)) {
            logger.warn("初始化获取失败,没有发现策略实现 bean。");
            throw new RuntimeException("初始化消息处理类失败");
        }
        for (Map.Entry<String, BaseMessageService> entry : result.entrySet()) {
            String beanName = entry.getKey();
            BaseMessageService value = entry.getValue();

            KwaiEvent dataAnnotation = value.getClass().getAnnotation(KwaiEvent.class);
            if (null != dataAnnotation) {
                for (String string : dataAnnotation.value()) {
                    messageServiceMap.put(string, value);
                }
            } else {
                logger.info("初始化,operateType is null, bean:{}", beanName);
            }
        }
    }

    /**
     * Description: 获取消息处理类
     * Date: 2021/9/14 19:21
     *
     * @Author: wangwenying10
     * @Param: [operateType]
     * @Return: cn.com.gome.scot.alamein.mco.kwai.job.business.domain.message.BaseMessageService
     */
    public BaseMessageService obtainMessageService(String operateType) {
        if (operateType == null) {
            logger.error("[McoServiceFactory.getExtchDataSaveService] the input param is null, return [null].");
            return null;
        }
        return messageServiceMap.get(operateType);
    }
}

调用


            BaseMessageService service = kwaiAcceptServiceFactory.obtainMessageService(kwaiMessage.getEvent());
            dispatchExecutorsPool.getDefaultThreadPool().execute(() -> service.execute(kwaiMessage));