美文网首页Java学习笔记程序员
状态机匹配(三)(从零实现)

状态机匹配(三)(从零实现)

作者: 奈文摩尔定律 | 来源:发表于2018-02-03 11:31 被阅读46次

之前一直配合源码,来讲,可能有点生硬,所以花了会功夫构思了支付相关的应用场景,写了一个简化版的mapFunc的匹配案例,欢迎提建议

/*
支付相关的状态机
 */
@Component
@Slf4j
@Builder
public class PayFuncMap implements IMapFunction {

    /*
    状态入口:交易请求进入
     */
    @MapFunctionListener(name = "交易请求检查",group = "deal",code = "requestEnter")
    public StateNode dealRequestEnter(StateNode<HttpServletRequest, ResultDTO> currentNode){
        log.info("交易请求进入");
        /*
        注意此处声明是servlet的请求体,最原始请求数据,便于统一处理
         */
        log.info(currentNode.getRequestDto().toString());
        /*
        跟据当前节点的请求入参数去匹配子状态机
         */
        /*
        这里加入一个子检查状态机,签名校验,ip检查,身份验证,交易能力,匹配请求成功或失败
         */

        /*
        拿到子检查状态机的结果回归主线状态机匹配
         */
        boolean 校验成功 = true;
        if(校验成功){
            return StateNode.builder().nodeCode("business_match").build();
        }
        //否则进入交易异常
        return StateNode.builder().nodeCode("deal_exception").build();
    }

    /*
    用于匹配交易的实体
     */
    static class BusinessInfo{}

    @MapFunctionListener(name = "匹配具体交易",group = "business",code = "match")
    public StateNode businessMatch(StateNode<BusinessInfo,ResultDTO> currentNode){
        log.info("business_match");

        log.info(currentNode.getRequestDto().toString());

        /*
        根据请求体去匹配 具体的第三方的支付或退款或账单其他操作,等等
        可以依据实际情况选择是否分离子状态机
         */
        return StateNode.builder().response(ResultDTO.builder().message("测试终点状态").build()).build();
    }
    @MapFunctionListener(name = "支付宝支付",group = "alipay",code = "o2oPay")
    public StateNode alipayO2oPay(StateNode currentNode){
        log.info("alipayO2oPay");
        // 支付宝支付 子状态机
        /*
        1.证书
        2.特有参数组装
        3.发起支付请求
        4.判断请求成功与否
        5.加入订单(等待第三方的支付结果回调,此处也许一个处理)
         */
        return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
    }

    @MapFunctionListener(name = "支付宝退款",group = "alipay",code = "o2orenfund")
    public StateNode alipayO2oRefund(StateNode currentNode){
        log.info("alipayO2oRefund");
        log.info("alipayO2oPay");
        // 支付宝支付 子状态机
        /*
        1.证书
        2.特有参数组装
        3.发起退款请求
        4.判断请求成功与否
        5.加入订单(等待第三方的支付结果回调,此处也许一个处理)
        6.如果第三方不支持回调,此处需要加入一个异步轮询任务池
         */
        return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
    }


    @MapFunctionListener(name = "交易结束",group = "deal",code = "end")
    public StateNode dealEnd(StateNode currentNode){
        log.info("test02");
        return StateNode.builder().response(ResultDTO.builder().message("测试终点状态").build()).build();
    }

    @MapFunctionListener(name = "交易异常",group = "deal",code = "exception")
    public StateNode dealException(StateNode currentNode){
        log.info("test03");
        //测试异常
        int ss = 1/0;
        return StateNode.builder().nodeCode("t_test02").build();
    }
}

相关文章

  • 状态机匹配(三)(从零实现)

    之前一直配合源码,来讲,可能有点生硬,所以花了会功夫构思了支付相关的应用场景,写了一个简化版的mapFunc的匹配...

  • 状态机匹配(一)(从零实现)

    之所以是要做状态机,是因为最近工作上的业务成分实在侵入性太多,代码可以搞定,但是不易维护,更不够优雅。比如一个搜索...

  • 状态机匹配(二)(从零实现)

    状态机的组成及使用状态机组件本身需要依赖很多泛型类型使用1.比如状态节点的泛型,状态节点内部也需要节点传入请求体的...

  • 浅析 Redis 主从复制实现原理

    本篇主要分三部分讨论Redis主从复制的实现原理:主从复制过程、状态机、源码解析。Redis从节点使用了状态机机制...

  • 设计模式-状态机

    对于一个状态机来说,需要分成2个部分来考虑状态机,一是状态机本身,二是状态机的实现。 状态机推演 只有状态机本身是...

  • Lintcode -正则表达式

    实现支持'.'和'*'的正则表达式匹配。 '.'匹配任意一个字母。 '*'匹配零个或者多个前面的元素。 匹配应该覆...

  • 正则表达式匹配

    实现支持'.'和'*'的正则表达式匹配。 '.'匹配任意一个字母。 '*'匹配零个或者多个前面的元素。 匹配应该覆...

  • LintCode 154. 正则表达式匹配

    题目描述 实现支持'.'和'*'的正则表达式匹配。 '.'匹配任意一个字母。 '*'匹配零个或者多个前面的元素。 ...

  • 64 - 状态模式

    状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统开发中。不过,状态机的实现方式有多种,除了状态模式...

  • 从零实现ImageLoader(一)—— 架构

    目录 从零实现ImageLoader(一)—— 架构从零实现ImageLoader(二)—— 基本实现从零实现Im...

网友评论

    本文标题:状态机匹配(三)(从零实现)

    本文链接:https://www.haomeiwen.com/subject/plcuzxtx.html