|
|
package com.njupt.swg.message;
|
|
|
|
|
|
import com.njupt.swg.common.utils.JsonUtil;
|
|
|
import com.njupt.swg.service.ICartService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.amqp.rabbit.annotation.Exchange;
|
|
|
import org.springframework.amqp.rabbit.annotation.Queue;
|
|
|
import org.springframework.amqp.rabbit.annotation.QueueBinding;
|
|
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
|
* @Author swg.
|
|
|
* @Date 2019/1/7 13:23
|
|
|
* @CONTACT 317758022@qq.com
|
|
|
* @DESC 这个类(MessageReceiver)是一个消息接收者组件,用于处理通过消息队列(RabbitMQ)接收到的消息,
|
|
|
* 在整个项目架构中,它承担着从消息队列获取消息并基于消息内容执行相应业务逻辑的职责,例如这里接收到消息后会调用购物车服务来清除对应用户的购物车。
|
|
|
*/
|
|
|
@Component
|
|
|
// 使用 @Component注解将这个类标记为Spring的一个组件,这样Spring容器会自动扫描并管理这个类的实例,使其可以参与依赖注入等Spring相关的功能。
|
|
|
|
|
|
@Slf4j
|
|
|
// 通过 @Slf4j注解,使用Lombok的功能自动为这个类添加一个名为log的日志记录器,方便在类中记录各种运行时的日志信息,有助于调试、监控和追踪代码的执行情况。
|
|
|
public class MessageReceiver {
|
|
|
|
|
|
// 通过Spring的依赖注入机制,自动注入ICartService接口的实现类对象,用于调用购物车相关的业务逻辑方法,
|
|
|
// 在这里具体用于执行清除购物车的操作,依赖注入使得代码的耦合性更低,方便替换不同的购物车服务实现类,并且符合Spring的面向接口编程的理念。
|
|
|
@Autowired
|
|
|
private ICartService cartService;
|
|
|
|
|
|
/**
|
|
|
* 这个方法是一个消息监听器方法,通过 @RabbitListener注解配置了它与消息队列的绑定关系,用于监听特定队列("cart-queue")中的消息,
|
|
|
* 当有消息到达该队列时,这个方法就会被触发执行,它会接收消息队列传递过来的消息,并基于消息内容进行相应的业务逻辑处理,在这里主要是清除对应用户的购物车操作。
|
|
|
*
|
|
|
* @param message 表示从消息队列中接收到的消息内容,在这里消息内容预期是一个可以转换为整数类型的字符串(代表用户的ID),
|
|
|
* 它的具体格式和含义由发送消息的一端决定,本方法接收到消息后会对其进行解析并转化为相应的业务操作参数(userId),进而执行后续的清除购物车操作。
|
|
|
*/
|
|
|
@RabbitListener(bindings = @QueueBinding(
|
|
|
value = @Queue("cart-queue"),
|
|
|
exchange = @Exchange("cart-exchange")
|
|
|
))
|
|
|
public void proess(String message) {
|
|
|
// 使用日志记录器记录接收到的消息内容,方便在运行时查看接收到的消息具体是什么,有助于调试和排查问题,例如查看消息是否符合预期格式等情况。
|
|
|
log.info("接收到的消息为:{}", message);
|
|
|
|
|
|
// 将接收到的消息(预期是一个字符串形式的整数)转换为实际的整数类型(userId),这里假设发送过来的消息内容就是有效的用户ID字符串表示形式,
|
|
|
// 如果消息格式不符合要求,可能会抛出NumberFormatException异常,在实际应用中可能需要更完善的错误处理机制来应对这种情况。
|
|
|
Integer userId = Integer.parseInt(message);
|
|
|
|
|
|
// 再次使用日志记录器记录解析后的用户ID信息,便于在日志中清晰地看到处理的用户相关数据,方便后续查看消息处理的具体情况以及追踪问题,比如查看是否处理了正确的用户的购物车清除操作等。
|
|
|
log.info("【MQ解析数据,前者为userId,后者为productId:{}】", userId);
|
|
|
|
|
|
// 调用ICartService的removeCart方法,传入解析得到的用户ID(userId),执行清除对应用户购物车的业务操作,
|
|
|
// 这个操作可能涉及到数据库中购物车相关记录的删除等具体的持久层操作,具体由ICartService的实现类中对应的方法逻辑来决定。
|
|
|
cartService.removeCart(userId);
|
|
|
}
|
|
|
} |