SpringBoot整合RabbitMQ

1.导入相关依赖

  		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.编写配置文件

spring:
  datasource:
    username: root
    password: 
    url: jdbc:mysql://
    driver-class-name: com.mysql.cj.jdbc.Driver
  rabbitmq:
    host: 192.168.0.177
    virtual-host: /
    port: 5672

3.开启RabbitMQ

@EnableRabbit
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

4.编写测试代码

public class ApplicationTests {

    @Autowired
    AmqpAdmin amqpAdmin;

    //amqpAdmin.declareExchange();//创建一个交换机
    //amqpAdmin.declareQueue();//创建一个队列
    //amqpAdmin.declareBinding();//创建一个绑定关系
    @Test
    public void createExchane() {

        DirectExchange directExchange = new DirectExchange("hello-java-exchange",true,false);
        amqpAdmin.declareExchange(directExchange);
        log.info("Exchange创建成功");
    }
    @Test
    public void createQueue() {
        //String name, 队列名
        // boolean durable, 是否持久化、Rabbit重启后数据还在
        // boolean exclusive,是否排他,就是只有一个连接能连上,其他连接无法连接,一般不会设置
        // boolean autoDelete,是否自动删除
        // Map<String, Object> arguments  而外参数
        Queue queue = new Queue("hello-java-queue",true,false,false);
        amqpAdmin.declareQueue(queue);
        log.info("queue创建成功");
    }

    @Test
    public void createBinding() {
        //String destination, 目的地
        // Binding.DestinationType destinationType,目的地类型
        //String exchange,交换机
        // String exchange, String routingKey,路由键
        // Map<String, Object> arguments 而外参数
        Binding binding = new Binding("hello-java-queue", Binding.DestinationType.QUEUE,"hello-java-exchange","hello.java",null);
        amqpAdmin.declareBinding(binding);
        log.info("binding创建成功");
    }

}

交换机创建成功!
在这里插入图片描述
队列创建成功!
在这里插入图片描述
绑定关系建立成功!
在这里插入图片描述

发送纯文本消息

    @Test
    public void sendMessageTest() {
        String msg="Hello World";
        rabbitTemplate.convertAndSend("hello-java-exchange","hello.java",msg);
        log.info("消息发送成功!!!");
    }

在这里插入图片描述

发送对象消息
创建实体类

@Data
public class TObject implements Serializable {
    private static final long serializableUID=1L;
    public String name;
    public int age;
}

发送

  	@Test
    public void sendMessageTest() {
        TObject tObject = new TObject();
        tObject.setName("TAO");
        tObject.setAge(18);
        rabbitTemplate.convertAndSend("hello-java-exchange", "hello.java", tObject);
        log.info("消息发送成功!!!");
    }

在这里插入图片描述
发送成功,这里是字节流,这里需要将发送的对象序列化一下,否则发实体类无法发送出去!
如果在多系统环境下光字符串和JAVA实体类对象是搞不定的,那么我们可以将对象转换为JSON!

序列化JSON消息
创建Rabbit序列化转换器

/**
* @description: Rabbit核心配置
* @author TAO
* @date 2020/8/4 20:48
*/
@Configuration
public class MyRabbitConfig {

    //讲对象序列化为JSON
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

测试代码不动!
在这里插入图片描述
搞定!

消息接收

编写监听实现类
这个监听的方法必须在容器内!!!

@Service
public class RabbitImpl {

    @RabbitListener(queues={"hello-java-queue"})
    public void recieveMessage(Object message){
        System.out.println("接收到消息=>"+message+"类型=>"+message.getClass());

    }
}

使用上面写好的单元测试给hello-java-queue中发送消息
查看消息
在这里插入图片描述
接收成功!

直接获取消息内容

 /**
     *message-原生消息详细信息:message中包含消息头+消息体
     *  tObject-发送时的实体类数据
     *  channel-客户端的通道
     * @param message
     */
    @RabbitListener(queues={"hello-java-queue"})
    public void recieveMessage(Message message, TObject tObject, Channel channel){
        System.out.println("接收到消息=>"+message);
        System.out.println("消息内容=>"+tObject);
    }

在这里插入图片描述
在多消息情况下,消费端不是一次性接收所有消息,而是一条一条的消费!

一个队列中存在多种类型的消息

@Service
@RabbitListener(queues={"hello-java-queue"})//标注这个类可以监听这个队列中的所有消息
public class RabbitImpl {

	//这个只接收消息类型为TObject1 的
    @RabbitHandler
    public void recieveMessage(Message message, TObject1 tObject1, Channel channel){
        System.out.println("接收到消息=>"+message);
        System.out.println("消息内容=>"+tObject1);
    }

	//这个只接收消息类型为TObject2的
    @RabbitHandler
    public void recieveMessage(Message message, TObject2 tObject2, Channel channel){
        System.out.println("接收到消息=>"+message);
        System.out.println("消息内容=>"+tObject2);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员劝退师-TAO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值