rabbitmq工作机制 使用spring 整合rabbitmq 应用场景 (延迟队列,实现订单失效)

生产者通过建立connection,创建channel,可以指定exchange(路由器),以及rountingkey(路由键),进行消息的发布,消费者通过监听exchange以及队列来完成消费的工作,消费时通过ack机制,来确保消息消费的可靠性。

应用场景:订单失效

通常情况下,用户进行购物生成订单之后,在一定时间范围内,完成付款的工作,否则订单到期之后,就会自动关闭。
通过rabbitmq来实现延迟队列(概念):生成订单之后,将订单号写入一个普通的队列,设置消息的存活时间为30分钟,当消息失效之后,通过死信路由,在转发给一个普通队列,消费者线程一直在监听该队列,取到订单号,查询数据库,看用户是否已经付款,如果没付款,再拿着订单号,去调第三方支付服务的查询接口对账,如果发现没付款,直接设置订单为已过期,如果已付款,直接修改订单状态为已付款。

第一步对spring-rabbitmq进行整合
连接:https://blog.csdn.net/weixin_42275175/article/details/99707340
第二步在订单生成的controllter中发布消息(先注入RabbitTemplate rabbitClient)

// 生成订单之后,插入订单号到rabbitmq当中的指定队列
		MessageProperties prop=new MessageProperties();
		Message message=new Message((orders.getOrderId()+"").getBytes(),prop);
		rabbitClient.send(message);

第三步骤设置一个监听器实现MessageListener接口

	/**
	 * 当消费得到消息之后,提供的一个消息处理的方法
	 */
	public void onMessage(Message message) {
		String ordersId = new String(message.getBody());
		Orders orders = ordersService.findOrdersDetailById(Integer.parseInt(ordersId));
		if (orders.getStaus() == 1) {
			// 意味着30分钟都过去了还没付款,先去对账在设置失效
			// 对账
			orders.setStaus(-1);
			ordersService.updateOrdersByOrders(orders);
		} else if (orders.getStaus() == 2) {
			// 意味着已经付款,不做处理
		}

	}

第四步,在你的订单页中展示。

	public String orders(int id, HttpServletRequest req) {
		// id为订单Id
		Orders orders = ordersService.findOrdersDetailById(id);
		// 取到订单的失效时间
		Date createdate = orders.getOrderTime();
		Date expiredate = new Date(createdate.getTime() + 60 * 1000);
		req.setAttribute("orders", orders);
		if (expiredate.after(new Date())) {
			req.setAttribute("expiredate", expiredate);
		}
		return "index/order";

	}

启动项目,日志打印
rabbitmq工作机制 使用spring 整合rabbitmq 应用场景 (延迟队列,实现订单失效)_第1张图片
说明监听成功。

你可能感兴趣的:(rabbitmq)