首页 > 编程知识 正文

京东订单查询,客户订单

时间:2023-05-05 09:36:18 阅读:32709 作者:4616

目录

前言

支付系统的作用

核心流程

模式映射

代码流程

在线程池中向MQ发送消息,以处理持久化数据库

支付成功后,消息传递流程图

订单作为消费者消费信息

测试

前言中的图像和摘录不是来自一篇文章,所以细节并不完全对应。 值得借鉴的是开发思路:

使用整体功能模块; 进入核心流程; 到系统实现的框架; 代码流程(可以采用序列图)。 前两点是业务需求,后两点是功能实现。

支付系统的作用https://www.cn blogs.com/ve blen/p/10992167.html

核心流程

http://www.woshi pm.com/PD/1392102.html

订单支付:

用户支付订单后,需要获取订单的支付信息,如支付流号、支付时间等。 订单支付完毕后,下一个商家会等待发货,但在发货过程中,根据平台的业务模式不同,可能会导致订单的分割。

体系结构图https://blog.csdn.net/eg workspace/article/details/78900438? epth _1- UTM _ source=distribute.PC _ relevant.none-task UTM _ source=distribute.PC _ relevant.none-task

在标记的序列号之后,您可以跟踪申请是如何开始的。 序列诊断程序将被免除。 过程说明如下。

如果客户端需要开始支付,Submit a pay task会首先将新的支付任务添加到支付任务队列中,然后异步完成此过程。 根据客户端提交的参数,构建新的支付任务; Offer a task,打开异步任务,向MQ添加新的支付任务,等待被消耗; Pay task description在成功创建异步任务后,会将第一步构建的支付任务信息直接返回到客户端。 Poll a task,与此同时,支付任务的消费者需要轮询并执行新的支付任务的Send a pay request,这一步骤需要根据实际情况进行。 对于微信,并不是所有的支付请求都通过第三方支付平台(如支付宝(Alipay ) ),您必须使用支付参数申请prepay_id,然后通过客户端开始支付,Response,什么都没有可以在Redis中缓存任务的执行结果(无论成功与否),并随时等待客户端访问。 Query result,客户端在提交支付任务后,间隔一段时间,开始请求(建议2 ) 3s )结果查询; Query,直接进入Redis查找结果; 同步,这是异步操作,将支付任务的执行结果“顺便”同步到Mon

goDB中,并删除Redis中缓存的任务执行结果。持久化到MongoDB主要是为后续的容错,重试,数据分析等提供落地的数据源;Return,由Redis返回给应用服务器;Return payment,应用服务器再将最终的支付对象返回给客户端。

让我们更深入一点,我们来看三张Class Diagram:

① 先说说支付任务(PayTask)部分。PayTask和Payment两个都是MongoDB中的Document对象,但在任务执行期间,PayTask是用Redis进行缓存的,方便客户端随时发起Query,任务执行成功后,会生成Payment对象,最终PayTask和Payment都会持久化到MongoDB中。在PayService中,有对支付任务的一些基本操作,包括任务提交,取消,重试,构建等等。

② 再说说任务的执行(runner)。这部分和RabbitMQ紧密相关,一旦一个支付任务形成了,就会放入任务执行队列中,由消费者取出执行。在TaskRunner中,有两个基本的接口方法:run(task)、retry(task),分别是执行任务和重试任务。在AbstractPayTaskRunner中已经封装好了这两个方法,继承AbstractPayTaskRunner需要实现doTask方法,从返回值可以看出,这个过程是异步化的。关于Retry机制,用户可以设置重试与否,一旦设置了TaskInfo.needRetry=true(不出意外,默认就是允许重试),就启用了Retry机制。还可以设置重试的次数(TaskInfo.retryTimes),默认三次,分别间隔1s,2s,3s,间隔时间以公差为1的等差数列组成。当然不会让用户无限重试,系统内置有一个最大重试次数,最大重试次数内置为5次。

为什么是5次?

你感受一下,1s,2s,3s,4s,5s,整个请求链条就被拉长到了15s,这对客户端简直就是灾难了!!

代码流程

创建支付

 

线程池中处理发送消息到MQ、持久化的数据库

支付成功后,消息分发流程图 订单作为消费者消费消息

测试

在测试程序中调用sendMessage

因为发送消息是在线程池中,当测试程序(主程序)停止运行,线程池也就停止运行,所以,为了让主程序不停止,在方法末尾加上:System.in.read();

System.in.read()可以实现输入字符,返回字符的Unicode码,但是缺点是只能输入一个字符
System.in.read() 返回的是输入数值的 ASKII 码(一个 int 整数)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。