springboot集成RabbitMQ传递实体对象、集合

1.创建了两个项目 :

(1)rabbitmq-send 消息发送者

(2)rabbitmq-receive 消息接受者

2. 添加rabbitmq依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
       <version>1.2.7</version>
 </dependency>

3.编写具体的消息发送者

(1)配置application.yml

server:
  port: 8980
spring:
  application:
    name: rabbitmq-send
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
#不分配端口,默认使用8080

(2)创建rabbitmq配置类,添加一个名为hello的队列

@Configuration
public class RabbitConfig {
    public final static String QUEUE_NAME = "hello";

    @Bean
    public Queue helloQueue(){
      return new Queue(QUEUE_NAME);
    }

}

(3)编写具体的发送组件
先创建一个user实体类,属性id、name、age。

/**
 * @Title:消息发送者
 */
@Component
public class Sender {

    //通过注入的这个类来传递消息
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send(){
    	// 传输集合
		/*
		 * List<User> userList = new ArrayList<>(); for (int i = 1; i <= 10; i++) { User
		 * user = new User(i, "user"+i, (i+10)); userList.add(user); } String jsonString
		 * = JSON.toJSONString(userList); System.out.println("Sender :"+ jsonString);
		 * this.rabbitTemplate.convertAndSend("hello",jsonString);
		 */
        
        // 传输实体类
        User user = new User(new Random().nextInt(10)+1, "tom", new Random().nextInt(30)+1);
    	String userString = JSON.toJSONString(user);
    	System.out.println("Sender :"+ userString);
        this.rabbitTemplate.convertAndSend(RabbitConfig.QUEUE_NAME,userString);
    }

}

(4)创建一个访问接口,用以发送消息

/**
 * @Title:发送消息的接口
 */
@RestController
public class SendController {

    @Resource
    private Sender sender;

    @GetMapping("send")
    public String send(){
        sender.send();
        return "消息已发送..";
    }
}

4. 编写具体的消息接受者

(1)application.yml

spring:
  application:
    name: rabbitmq-receive
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
server:
  port: 8981

(2)编写消息接受者组件‘

@RabbitListener定义在类表示此类是消息监听者并设置要监听的队列
@RabbitHandler:在类中可以定义多个@RabbitHandler,spring boot会根据不同参数传送到不同方法处理

package org.lhj.pro.receive;

import org.lhj.pro.config.RabbitConfig;
import org.lhj.pro.entity.User;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject;

/**
 * @author luhongjun
 * @Title:消息接受者
 * @Description:
 * @date 2019/11/26
 */
@Component
//监听hello队列
@RabbitListener(queues = RabbitConfig.QUEUE_NAME)
public class Receive {

    //处理接受到的消息
    @RabbitHandler
    public void process(String jsonString){
    	// 接收json集合字符串,转换成集合
		/*
		 * List<User> parseArray = JSON.parseArray(jsonString, User.class); for (User
		 * user : parseArray) { System.out.println("Receiver:"+user); }
		 */
    	
    	// 接收json实体类字符串,转换成实体
        User user = JSONObject.parseObject(jsonString, User.class);
    	System.out.println("Receiver:"+user);
    }
}

5. 测试

(1)启动消息发送者,多次访问http://localhost:8980/send

前端返回

消息已发送 ...

控制台输出:
在这里插入图片描述

注意这时候我们还没有启动消息接受者,所有发送的消息都在消息队列里面

可以访问 http://localhost:15672/ 查看rabbitmq的管理页面

我们可以看到消息队列里面有1条消息

在这里插入图片描述

(2)我们启动消息接受者应用

可以看到应用启动好以后,接收到了消息,控制台输出

在这里插入图片描述

我们再次访问http://localhost:15672

发现队列此时已经没有消息.

在这里插入图片描述

这样一个简单的RabbitMQ应用就完成了.

发布了68 篇原创文章 · 获赞 5 · 访问量 9809

猜你喜欢

转载自blog.csdn.net/weixin_44407691/article/details/103255159