springboot+rabbitmq点对点模式和工作模式实现

0 874

前言

本笔记主要记录使用springboot简单实现rabbitmq的五种工作模式的笔记,再介绍各种模式之前,我们需要先搭建好基础环境,我们使用工具快速构建springboot项目:

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.democxy</groupId>
	<artifactId>springboot-demo-rabbitmq</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot-demo-1</name>
	<description>springboot-demo-rabbitmq</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework.amqp</groupId>
			<artifactId>spring-rabbit-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

yml文件

server:
  port: 8021
spring:
  #给项目来个名字
  application:
    name: rabbitmq-provider
  #配置rabbitMq 服务器
  rabbitmq:
    host: 192.168.200.118
    port: 5672
    username: guest
    password: guest
    #虚拟host 可以不设置,使用server默认host
    #virtual-host: JCcccHost

一 点对点模式

我们需要将消息发给唯一一个节点时使用这种模式,这是最简单的一种形式。

生产者将消息发送到队列,消费者从队列中获取消息。

//申明队列

package com.democxy.config.rabbitmq;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 点对点模式配置类
 * @author shuangerduo
 *
 */
@Configuration
public class PointToPointConfig {
	
	//申明队列(点对点)
	@Bean("POINT_TO_POINT_QUEUE")
	public Queue TEST_QUEUE() {
		return new Queue("POINT_TO_POINT_QUEUE");
	}
}

//向队列中发送消息

package com.democxy;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringbootDemo1ApplicationTests {
	@Autowired
	RabbitTemplate rabbitTemplate;
   
    /**
	 * 点对点模式模拟生产者
	 */
    @Test
	void pointToPoint() {
		
		for (int i = 0; i < 10; i++) {
			rabbitTemplate.convertAndSend("POINT_TO_POINT_QUEUE", "点对点队列信息;"+i);
			System.out.println("发送"+i+"成功。");
		}
	}

}

//消费者获取信息

package com.democxy.config.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 点对点模式消费者
 * @author shuangerduo
 *
 */
@Component
public class PointToPointConsumer {
	
	@RabbitListener(queues = {"POINT_TO_POINT_QUEUE"})
	public void getMsgs(String msg) {
		System.out.println("点对点模式:"+msg);
	}
}

运行结果:


 

二 工作模式

工作模式和点对点模式差不多,只是对于当前的队列多了一个消费者: 一个生产者、2个消费者。 一个消息只能被一个消费者获取。

 

所以我们只需要在点对点模式下的消费者再加入一个消费者即可模拟工作模式场景:

package com.democxy.config.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 点对点模式消费者
 * @author shuangerduo
 *
 */
@Component
public class PointToPointConsumer {
	
//	@RabbitListener(queues = {"POINT_TO_POINT_QUEUE"})
//	public void getMsgs(String msg) {
//		System.out.println("点对点模式:"+msg);
//	}
	
	
	@RabbitListener(queues = {"POINT_TO_POINT_QUEUE"})
	public void getMsgs_work1(String msg) {
		System.out.println("工作模式消费者1:"+msg);
	}
	
	
	@RabbitListener(queues = {"POINT_TO_POINT_QUEUE"})
	public void getMsgs_work2(String msg) {
		System.out.println("工作模式消费者2:"+msg);
	}
}

在测试类下新增一个测试方法:

/**
	 * 工作模式模拟生产者
	 */
	@Test
	void work() {
		for (int i = 0; i < 10; i++) {
			rabbitTemplate.convertAndSend("POINT_TO_POINT_QUEUE", "工作模式信息;"+i);
			System.out.println("发送"+i+"成功。");
		}
	}

运行结果


评论