文章目录
安装
我在服务器上用命令的时候报错了,建议使用其他方式,比如Ubantu无网环境下安装RabbitMQ(使用.deb包)
SpringBoot集成RabbitMQ
- 添加依赖(版本取决于parent)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
</parent>
添加“parent”标签里的内容后,“spring-boot-starter-parent”会为开发者提供常用jar的版本管理,所以我们不需要指定版本,使用人家提供好的就可以了。
2.application.properties 中添加配置信息:
spring.rabbitmq.host=121.4.2##.2## (主机ip)
spring.rabbitmq.port=5672 (端口号)
spring.rabbitmq.username=sun (登录账号)
spring.rabbitmq.password=666 (登录密码)
spring.rabbitmq.virtual-host=/ (虚拟主机)
RabbitMQ的4种交换机模式
优化秒杀系统
优化思路
1.从redis中查库存,库存不足直接返回,否则进入2。
2.请求进入消息队列,返回排队中的状态。
3.请求出队,下订单减库存。
4.前端轮询,查询是否秒杀成功。
后端代码
秒杀接口
public static HashMap<Long, Boolean> localOverMap = new HashMap<Long, Boolean>();
@PostMapping(value="/do_miaosha")
@ResponseBody
public Result<Integer> miaosha(Model model,MiaoshaUser user,
@RequestParam("goodsId")Long goodsId) {
//内存标记,减少redis访问
Boolean over = localOverMap.get(goodsId);
if(over!=null && over) {
return Result.error(CodeMsg.MIAO_SHA_OVER);
}
//预减库存
long stock = redisService.decr(GoodsKey.getGoodsStock, ""+goodsId);//10
if(stock < 0) {
localOverMap.put(goodsId, true);
return Result.error(CodeMsg.MIAO_SHA_OVER);
}
//判断是否已经秒杀到了
MiaoshaOrder order = orderService.getOrderByUserAndGoods(user.getId(), goodsId);
if(order != null) {
return Result.error(CodeMsg.REPEATE_MIAOSHA);
}
//入队
Message mm = new Message(user,goodsId);
sender.send(mm);
return Result.success(0);//排队中
}
Sender.java用来发送消息
@Service
public class Sender {
public static Logger logger = LoggerFactory.getLogger(Receiver.class);
@Autowired
AmqpTemplate amqpTemplate;
public void send(Message msg){
String msgstr = RedisService.beanToString(msg); //把bean转为String
amqpTemplate.convertAndSend(MQConfig.Queue1,msgstr);
}
}
MQConfig.java用来定义队列
@Configuration
public class MQConfig<