Spring+rabbitMQ进行通信,目录工作队列工作队列模式的生产者消费者发布订阅模式生产者代码​编辑消费者通配符模式基于Spring+rabbitMQ进行通信

目录

工作队列

工作队列模式的生产者

消费者

发布订阅模式

生产者代码​编辑

消费者

通配符模式

基于Spring+rabbitMQ进行通信

生产者


 

工作队列

1.引入依赖

2.配置rabbitMq

3.生产者

4.消费者

5.测试

工作队列模式的生产者

package com.example.rabbbitmq.springboot.controller;

import com.example.rabbbitmq.springboot.constant.Constants;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/producter")
@RestController
public class ProducterController {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @RequestMapping("/work")
    public String work() {
        //使用内置交换机,RoutingKey,和队列名称一致
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend("", Constants.WORK_QUEUE, "hello spring amqp: work .." + i);
        }
            return "发送成功";

    }

}

消费者

@RabbitListener是Spring框架中用于监听RabbitMQ队列的注解,通过使用这个注解,可以定义一个方法,便于从RabbitMQ队列中接收消息,该注解支持多种参数类型,这些参数类型代表了从RabbitMQ接收到的消息和相关消息:

String:返回消息的内容

Message:Spring的AMQP的MESSAGE类,便于从RabbitMQ中接收消息,该注解支持多种

Channel:RabbitMQ的通道对象,可以用于更高级的操作,比如手动确认消息。

package com.example.rabbbitmq.springboot.listener;

import com.example.rabbbitmq.springboot.constant.Constants;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class WorkListener {
    @RabbitListener(queues = Constants.WORK_QUEUE)
    public  void queueListener(Message message, Channel channel){
        System.out.println("listener 1 ["+ Constants.WORK_QUEUE+"]接收到消息:"+message+",channel:+"+channel);
    }
    @RabbitListener(queues = Constants.WORK_QUEUE)
    public  void queueListener2(Message message){
        System.out.println("listener2 ["+ Constants.WORK_QUEUE+"]接收到消息:"+message);
    }
}

发布订阅模式

Fanout广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式)

Direct:定向,把消息交给指定routing key的队列(Routing模式)

Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)

生产者代码


路由模式Routing

交换机类型为Direct

生产者

 @RequestMapping("/direct/{routingKey}")
    //从路径中拿到routingKey获取到,
            public String direct(@PathVariable("routingKey") String routingKey){
        rabbitTemplate.convertAndSend(Constants.DIRECT_EXCHANGE,routingKey,"hello spring amqp:direct,my routing key" +
                "is"+routingKey);
        return "发送成功";

    }

消费者

package com.example.rabbbitmq.springboot.listener;

import com.example.rabbbitmq.springboot.constant.Constants;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class DirectListener {
    @RabbitListener(queues = Constants.DIRECT_QUEUE1)
    public  void queueListener(String message){
        System.out.println("listener 1 ["+ Constants.DIRECT_QUEUE1+"]接收到消息:"+message);
    }
    @RabbitListener(queues = Constants.DIRECT_QUEUE2)
    public  void queueListener2(String message){
        System.out.println("listener2 ["+ Constants.DIRECT_QUEUE2+"]接收到消息:"+message);
    }
}

通配符模式

Topic(通配符模式)


使用以上这些模式常见问题

1.复制粘贴时候,绑定类型出错

2.不能把原先是持久化的,变成非持久化(可以回界面,把这个删除了,再去声明)w

3.没有指定队列名称(他会找不到)

基于Spring+rabbitMQ进行通信

RabbitMQ用户下单成功后,会通知物流系统,进行发货

使用JSON格式传递对象,需要手动创建一个rabbitMQConfig

package com.example.orderservice.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean("orderQueue")
    public Queue orderQueue(){
        return QueueBuilder.durable("order.create").build();
    }
    @Bean
    //他会自动根据yml里面单信息帮助我们生成对象
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory,Jackson2JsonMessageConverter jsonMessageConverter){
        RabbitTemplate rabbitTemplate=new RabbitTemplate(factory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter);
        return rabbitTemplate;
    }
    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }

}

生产者

package com.example.orderservice.controller;

import com.example.orderservice.model.OrderInfo;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;
import java.util.UUID;

@RequestMapping("/order")
@RestController
public class OrderController {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @RequestMapping("/create")
    public  String create(){
        //不是真下单,不然需要参数校验,数据库保存,业务代码省略等等
        //发送消息
        OrderInfo orderInfo=new OrderInfo();
        orderInfo.setOrderId(UUID.randomUUID().toString());
        orderInfo.setName("商品"+new Random().nextInt(100));
        rabbitTemplate.convertAndSend("","order.create","订单信息,订单ID:"+orderInfo);
        return "下单成功";
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值