b2b网站建设/营销的手段和方法

b2b网站建设,营销的手段和方法,wordpress网站托管,阿里云建设网站流程一、利用MQ自动取消未支付超时订单最佳实践 1、基于 RocketMQ 延迟消息 1.1:延迟消息 当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。 1.2:实现流程 &am…

一、利用MQ自动取消未支付超时订单最佳实践

1、基于 RocketMQ 延迟消息

1.1:延迟消息

当消息写入到 Broker 后,不会立刻被消费者消费,需要等待指定的时长后才可被消费处理的消息,称为延时消息。

1.2:实现流程

(1)用户创建订单时,发送一个延迟消息到消息队列,延时时间为订单的超时时间。
(2)消息到期后,消费者接收到消息,检查订单状态:
如果订单未支付,则关闭订单;
如果已支付,则忽略消息。

1.3:优点

高效,解耦,适合高并发场景。
失败可重试,可靠性高。

1.4:缺点

需要引入消息队列,增加系统复杂度。

2、RabbitMQ死信队列

2.1:死信队列

当 RabbitMQ 中的一条正常消息,因为过了存活时间(TTL 过期)、队列长度超限、 被消费者拒绝等原因无法被消费时,就会被当成一条死信消息,投递到死信队列。

我们可以给消息设置一个 TTL ,然后故意不消费消息,等消息过期就 会进入死信队列,我们再消费死信队列即可。

通过这样的方式,就可以达到同 RocketMQ 延迟消息一样的效果。

2.2:优点

同 RocketMQ 一样,RabbitMQ 同样可以使业务解耦,基于其集群的扩展性, 也可以实现高可用、高性能的目标。

二、RabbitMQ死信队列实现代码

1、CancelOrderSender消息的发送者

/*** 取消订单消息的发送者*/
@Component
public class CancelOrderSender {private static final Logger LOGGER = LoggerFactory.getLogger(CancelOrderSender.class);@Autowiredprivate AmqpTemplate amqpTemplate;public void sendMessage(Long orderId,final long delayTimes){//给延迟队列发送消息amqpTemplate.convertAndSend(QueueEnum.QUEUE_TTL_ORDER_CANCEL.getExchange(), QueueEnum.QUEUE_TTL_ORDER_CANCEL.getRouteKey(), orderId, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {//给消息设置延迟毫秒值message.getMessageProperties().setExpiration(String.valueOf(delayTimes));return message;}});LOGGER.info("send orderId:{}",orderId);}
}

2、CancelOrderReceiver消息的接收者

/*** 取消订单消息的接收者*/
@Component
@RabbitListener(queues = "mall.order.cancel")
public class CancelOrderReceiver {private static final Logger LOGGER = LoggerFactory.getLogger(CancelOrderReceiver.class);@Autowiredprivate OmsPortalOrderService portalOrderService;@RabbitHandlerpublic void handle(Long orderId){portalOrderService.cancelOrder(orderId);LOGGER.info("process orderId:{}",orderId);}
}

3、QueueEnum消息队列枚举类

@Getter
public enum QueueEnum {/*** 消息通知队列*/QUEUE_ORDER_CANCEL("mall.order.direct", "mall.order.cancel", "mall.order.cancel"),/*** 消息通知ttl队列*/QUEUE_TTL_ORDER_CANCEL("mall.order.direct.ttl", "mall.order.cancel.ttl", "mall.order.cancel.ttl");/*** 交换名称*/private final String exchange;/*** 队列名称*/private final String name;/*** 路由键*/private final String routeKey;QueueEnum(String exchange, String name, String routeKey) {this.exchange = exchange;this.name = name;this.routeKey = routeKey;}
}

4、OmsPortalOrderServiceImpl前台订单管理实现

这里核心是在创建订单后,发送此订单到死信队列,用于后续MQ的监听消费。

@Slf4j
@Service
public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {@Overridepublic Map<String, Object> generateOrder(OrderParam orderParam) {List<OmsOrderItem> orderItemList = new ArrayList<>();//校验收货地址if(orderParam.getMemberReceiveAddressId()==null){Asserts.fail("请选择收货地址!");}//获取购物车及优惠信息UmsMember currentMember = memberService.getCurrentMember();List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(), orderParam.getCartIds());for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {//生成下单商品信息OmsOrderItem orderItem = new OmsOrderItem();orderItem.setProductId(cartPromotionItem.getProductId());orderItem.setProductQuantity(cartPromotionItem.getQuantity());orderItem.setProductSkuId(cartPromotionItem.getProductSkuId());orderItem.setProductSkuCode(cartPromotionItem.getProductSkuCode());orderItem.setProductCategoryId(cartPromotionItem.getProductCategoryId());orderItem.setPromotionAmount(cartPromotionItem.getReduceAmount());orderItem.setPromotionName(cartPromotionItem.getPromotionMessage());orderItem.setGiftIntegration(cartPromotionItem.getIntegration());orderItem.setGiftGrowth(cartPromotionItem.getGrowth());orderItemList.add(orderItem);}//判断购物车中商品是否都有库存if (!hasStock(cartPromotionItemList)) {Asserts.fail("库存不足,无法下单");}//判断使用使用了优惠券//计算order_item的实付金额//进行库存锁定//根据商品合计、运费、活动优惠、优惠券、积分计算应付金额OmsOrder order = new OmsOrder();order.setDiscountAmount(new BigDecimal(0));order.setTotalAmount(calcTotalAmount(orderItemList));order.setFreightAmount(new BigDecimal(0));order.setPromotionAmount(calcPromotionAmount(orderItemList));order.setPromotionInfo(getOrderPromotionInfo(orderItemList));if (orderParam.getCouponId() == null) {order.setCouponAmount(new BigDecimal(0));} else {order.setCouponId(orderParam.getCouponId());order.setCouponAmount(calcCouponAmount(orderItemList));}if (orderParam.getUseIntegration() == null) {order.setIntegration(0);order.setIntegrationAmount(new BigDecimal(0));} else {order.setIntegration(orderParam.getUseIntegration());order.setIntegrationAmount(calcIntegrationAmount(orderItemList));}order.setPayAmount(calcPayAmount(order));//转化为订单信息并插入数据库order.setMemberId(currentMember.getId());order.setCreateTime(new Date());order.setMemberUsername(currentMember.getUsername());//支付方式:0->未支付;1->支付宝;2->微信order.setPayType(orderParam.getPayType());//订单来源:0->PC订单;1->app订单order.setSourceType(1);//订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单order.setStatus(0);//订单类型:0->正常订单;1->秒杀订单order.setOrderType(0);//收货人信息:姓名、电话、邮编、地址UmsMemberReceiveAddress address = memberReceiveAddressService.getItem(orderParam.getMemberReceiveAddressId());order.setReceiverName(address.getName());order.setReceiverPhone(address.getPhoneNumber());order.setReceiverPostCode(address.getPostCode());order.setReceiverProvince(address.getProvince());order.setReceiverCity(address.getCity());order.setReceiverRegion(address.getRegion());order.setReceiverDetailAddress(address.getDetailAddress());//0->未确认;1->已确认order.setConfirmStatus(0);order.setDeleteStatus(0);//计算赠送积分order.setIntegration(calcGifIntegration(orderItemList));//计算赠送成长值order.setGrowth(calcGiftGrowth(orderItemList));//生成订单号order.setOrderSn(generateOrderSn(order));//设置自动收货天数List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());if(CollUtil.isNotEmpty(orderSettings)){order.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());}//插入order表和order_item表orderMapper.insert(order);for (OmsOrderItem orderItem : orderItemList) {orderItem.setOrderId(order.getId());orderItem.setOrderSn(order.getOrderSn());}orderItemDao.insertList(orderItemList);//删除购物车中的下单商品deleteCartItemList(cartPromotionItemList, currentMember);//发送延迟消息取消订单sendDelayMessageCancelOrder(order.getId());Map<String, Object> result = new HashMap<>();result.put("order", order);result.put("orderItemList", orderItemList);return result;}
}    

具体的取消实现方法

@Overridepublic void cancelOrder(Long orderId) {//查询未付款的取消订单OmsOrderExample example = new OmsOrderExample();example.createCriteria().andIdEqualTo(orderId).andStatusEqualTo(0).andDeleteStatusEqualTo(0);List<OmsOrder> cancelOrderList = orderMapper.selectByExample(example);if (CollectionUtils.isEmpty(cancelOrderList)) {return;}OmsOrder cancelOrder = cancelOrderList.get(0);if (cancelOrder != null) {//修改订单状态为取消cancelOrder.setStatus(4);orderMapper.updateByPrimaryKeySelective(cancelOrder);OmsOrderItemExample orderItemExample = new OmsOrderItemExample();orderItemExample.createCriteria().andOrderIdEqualTo(orderId);List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);//解除订单商品库存锁定if (!CollectionUtils.isEmpty(orderItemList)) {for (OmsOrderItem orderItem : orderItemList) {int count = portalOrderDao.releaseStockBySkuId(orderItem.getProductSkuId(),orderItem.getProductQuantity());if(count==0){Asserts.fail("库存不足,无法释放!");}}}//修改优惠券使用状态updateCouponStatus(cancelOrder.getCouponId(), cancelOrder.getMemberId(), 0);//返还使用积分if (cancelOrder.getUseIntegration() != null) {UmsMember member = memberService.getById(cancelOrder.getMemberId());memberService.updateIntegration(cancelOrder.getMemberId(), member.getIntegration() + cancelOrder.getUseIntegration());}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 ChatGPT 创建专属 GPTs

文章目录 基于 ChatGPT 创建专属 GPTs一、效果展示1.1 中文命名专家1.2 行程小助手 二、核心配置2.1 Instructions2.3 Actions 三、Agent 简介3.1 功能框架3.2 工作流程3.3 意图识别 四、数据流程 基于 ChatGPT 创建专属 GPTs ChatGPT 具备定制 GPTs 的能力&#xff0c;能够通…

【数据挖掘】异构图与同构图

在图论&#xff08;Graph Theory&#xff09;中&#xff0c;异构图&#xff08;Heterogeneous Graph&#xff09;和同构图&#xff08;Homogeneous Graph&#xff09;是两种不同的图结构概念&#xff0c;它们的主要区别在于节点和边的类型是否单一。 1. 异构图&#xff08;Hete…

DeepSeek:构筑大数据平台底座的最优解

一、大数据平台底座的重要性 在数字化浪潮席卷全球的当下,数据已成为企业乃至整个社会最具价值的资产之一 。大数据平台底座作为数据处理和业务支撑的核心枢纽,其重要性不言而喻,犹如大厦的基石,关乎整个数据生态系统的稳定与发展。 从数据处理角度来看,随着互联网、物联…

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下&#xff0c;python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表&#xff1a; bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装&#xff1a; bash复制…

STM32---FreeRTOS中断管理试验

一、实验 实验目的&#xff1a;学会使用FreeRTOS的中断管理 创建两个定时器&#xff0c;一个优先级为4&#xff0c;另一个优先级为6&#xff1b;注意&#xff1a;系统所管理的优先级范围 &#xff1a;5~15 现象&#xff1a;两个定时器每1s&#xff0c;打印一段字符串&#x…

docker利用docker-compose-gpu.yml启动RAGFLOW,文档解析出错【亲测已解决】

0.问题说明 想要让RAGFLOW利用GPU资源跑起来&#xff0c;可以选择docker-compose-gpu.yml启动。&#xff08;但是官网启动案例是86平台的不是NVIDIA GPU的&#xff0c;docker-compose-gpu.yml又是第三方维护&#xff0c;所以稍有问题&#xff09; 1.问题 docker利用docker-c…

【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进

深度神经网络系列文章 【AI深度学习网络】卷积神经网络&#xff08;CNN&#xff09;入门指南&#xff1a;从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN&#xff08;卷积神经网络&#xff09;简单实现&#xff1a;手写数字识别的工程实践 引言 在当今…

【ThreeJS Basics 06】Camera

文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动&#xff08;可以看到后面&#xff09; 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注&#xff1a;本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文&#xff0c;机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】

最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…

蓝桥杯C组真题——巧克力

题目如下 思路 代码及解析如下 谢谢观看

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;毕竟那都是别人说的&#xff0c;只有自己尝试一次才知道结果。 具体操作 第一步&#xff1a;访问 deepseek 我们访问 deepseek &#xff0c;把我们想要输入的内容告诉…

初始提示词(Prompting)

理解LLM架构 在自然语言处理领域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型记忆语言模型&#xff09;架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…

【Python爬虫】利用代理IP爬取跨境电商AI选品分析

引言 随着DeepSeek的流行&#xff0c;越来越多的用户开始尝试将AI工具融入到日常工作当中&#xff0c;借助AI的强大功能提高工作效率。最近又掀起了一波企业出海的小高潮&#xff0c;那么如果是做跨境电商业务&#xff0c;怎么将AI融入工作流中呢&#xff1f;在做跨境电商的时候…

C语言——链表

大神文献&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表&#xff1f; 1.1 链表的构成 2. 链表和数组的区别 数组的特点&#xff1a; 链表的特点&#xff1a; 二者对比&#xff1a; 二…

Spring框架自带的定时任务:Spring Task详解

文章目录 一、基本使用1、配置&#xff1a;EnableScheduling2、触发器&#xff1a;Scheduled 二、拓展1、修改默认的线程池2、springboot配置 三、源码分析参考资料 一、基本使用 1、配置&#xff1a;EnableScheduling import org.springframework.context.annotation.Config…

数据库事务、乐观锁及悲观锁

参考&#xff1a;node支付宝支付及同步、异步通知、主动查询支付宝订单状态 以下容结合上述链接查看 1. 什么是数据库事务&#xff1f; 1.1. 连续执行数据库操作 在支付成功后&#xff0c;我们在自定义的paidSuccess里&#xff0c;依次更新了订单状态和用户信息。也就说这里…

SCI期刊推荐 | 免版面费 | 计算机领域:信息系统、软件工程、自动化和控制

在学术研究领域&#xff0c;选择合适的SCI期刊对科研成果的传播与认可至关重要。了解SCI期刊的研究领域和方向是基础&#xff0c;确保投稿内容与期刊主题相符。同时&#xff0c;要关注期刊的影响因子和评估标准&#xff0c;选择具有较高影响力和学术认可度的期刊。阅读期刊的投…

常见webshell工具的流量特征

1、蚁剑 1.1、蚁剑webshell静态特征 蚁剑中php使用assert、eval执行&#xff1b;asp只有eval执行&#xff1b;在jsp使用的是Java类加载&#xff08;ClassLoader&#xff09;&#xff0c;同时会带有base64编码解码等字符特征。 1.2、蚁剑webshell动态特征 查看流量分析会发现…

爬虫系列之【数据解析之bs4】《四》

目录 前言 一、用法详解 1.1 获取标签内容 1.2 获取标签属性 1.3 获取标签包裹的文本内容 1.4 获取标签列表 1.5 css 选择器&#xff1a;select 二、实战案例 完整代码 前言 HTML数据解析 1、正则 2、xpath&#xff08;居多&#xff09; 3、css 选择器&#xff08;bs…