springboot与rabbitmq消息队列 整合

rabbitmq简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 ----百度百科

安装rabbitmq

我之前在我的阿里云的docker里装了一个rabbitmq,带图形化界面的,大家有需要可以去我的docker学习四来学习怎么在docker里面装,即装即用非常方便

与Springboot整合

pom文件中添加

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

添加aoolication.yml配置你的rqbbitmq

  rabbitmq:
    username: guest
    host: 你的公网ip
    password: guest

这个端口默认为5672,访问你的根目录

主类开启@EnableRabbit

@SpringBootApplication
@MapperScan("com.fehead.testproject.dao")
@EnableRabbit//开启注解的rabbitmq
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        SpringApplication.run(App.class,args);
    }
}

新建一个配置类,改变rabbitmq默认的jdk序列化

package com.fehead.testproject.configuration;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAMQPConfig {

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

测试类测试

这里首先要注入 RabbitTemplate

 @Autowired
 private RabbitTemplate rabbitTemplate;

单播

 @Test
    public void contextLoads(){
        //Message需要自己构造一个;定义消息体的内容和消息头
        // rabbitTemplate.send(exchange,routeKey,message);
        //object默认当成消息体,只需要传入要发送的对象,自动化序列发给irabbitmq
        //rabbitTemplate.convertAndSend(exchange,routeKey,object);
        Map<String,Object> map=new HashMap<>();
        map.put("name",Arrays.asList("dasd",1323,"dsada"));
        //单播,对象经序列化后发出去
        rabbitTemplate.convertAndSend("exchange.direct","kaikai.news",map);
    }
  • convertAndSend跟三个参数,第一个参数为你的交换器名字(广播,单播等等),第二个参数为你的队列名字,第三个参数为你消息

这个方法可以直接连接到我们的rabbitmq指定交换器与队列名发送消息


这个测试方法用来接收指定队列的消息,返回一个object类型

@Test
    public void receive(){
        Object mes= rabbitTemplate.receiveAndConvert("kaikai.news");
        System.out.println(mes.getClass());
        System.out.println(mes);
    }
  • receiveAndConvert跟的参数为队列名字

返回值的类型与值入下
在这里插入图片描述


广播

/**
     * 广播模式
     */
    @Test
    public void sending(){
        UserDO userDO=new UserDO();
        userDO.setId(2);
        userDO.setUserEmail("[email protected]");
        rabbitTemplate.convertAndSend("exchange.fanout","",userDO);
    }

开启广播即可不用指定队列名,这里我们传入一个对象做消息

在这里插入图片描述
后台在队列中即可看见消息头和消息体


我们想要实时监听消息怎么办呢
这里我们建了个service层,在里面监听接受消息的队列

@Service
public class UserserviceImpl implements UserService {

    @RabbitListener(queues = "kaikai.news")
    public void receive(UserDO userDO){
        System.out.println("received! Meg:" + userDO);
    }
    @RabbitListener(queues = "kaikai")
    public void receive2(Message message){
        System.out.println(message.getMessageProperties());
        System.out.println(message.getBody());

    }

}
  • @RabbitListener(queues = “kaikai.news”),运用注解监听指定队列名

可以返回你的useDO实体类,也可以返回一个Message对象

  • getMessageProperties(),得到消息头
  • getBody(),得到消息体

返回如下信息

received! Meg:UserDO(id=2, userName=null, userPhone=null, userAge=null, userEmail=aijiajia@qq.com)
MessageProperties [headers={__TypeId__=com.fehead.testproject.dataobject.UserDO}, contentType=application/json, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=exchange.fanout, receivedRoutingKey=, deliveryTag=3, consumerTag=amq.ctag-Ar-TE6kXA3VfrZcVEmFdUA, consumerQueue=kaikai]
[B@11b4d10

制作不易,转载请标注

发布了69 篇原创文章 · 获赞 54 · 访问量 9586

猜你喜欢

转载自blog.csdn.net/kingtok/article/details/102614836