RabbitMQ---SpringBoot整合RabbitMQ(Direct交换器)

Direct交换器特点:

      各个队列与Direct交换器之间的路由键配置唯一,发送者发送一条消息,只有路由键完全匹配的队列才会接收到消息。

创建消息生产者module:配置交换器名称和路由键信息。消息发送时,需要指定交换器和路由键。

       pom.xml导入RabbitMQ坐标

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

       application.properties配置RabbitMQ信息

#RabbitMQ基本信息
spring.rabbitmq.host=182.61.40.184
spring.rabbitmq.port=5672
spring.rabbitmq.username=rabbitmq
spring.rabbitmq.password=rabbitmq

#自定义配置
#设置交换器名称
spring.rabbitmq.exchange=directExchange
#设置路由键A
spring.rabbitmq.routingkeyA=routingkey.A
#设置路由键B
spring.rabbitmq.routingkeyB=routingkey.B

       创建Controller,通过浏览器请求,发送消息到RabbitMQ

@Controller
public class RabbitMQController {
	
	@Autowired
	AmqpTemplate amqpTemplat;
	
	@Value("${spring.rabbitmq.exchange}")
	String exchangeName;	//交换器名称
	
	@Value("${spring.rabbitmq.routingkeyA}")
	String routingKeyA;		//路由键A
	
	@Value("${spring.rabbitmq.routingkeyB}")
	String routingKeyB;		//路由键B
	
	@RequestMapping(value="/sendMessageA",method=RequestMethod.GET)
	@ResponseBody
	public void sendMessA() throws InterruptedException {
		String message="Direct A";
		int flag=0;
		while (true) {
			Thread.sleep(1000);
			//参数1:交换器       参数2:路由键       参数3:要发送的消息
			amqpTemplat.convertAndSend(exchangeName,routingKeyA,message + flag);  
			flag++;
		}
	}
	
	
	@RequestMapping(value="/sendMessageB",method=RequestMethod.GET)
	@ResponseBody
	public void sendMessB() throws InterruptedException {
		String message="Direct B";
		while (true) {
			Thread.sleep(1000);
			//参数1:交换器       参数2:路由键       参数3:要发送的消息
			amqpTemplat.convertAndSend(exchangeName,routingKeyB,message);  
		}
	}
		
}

创建消息消费者module:配置队列名称,交换器名称和类型,路由键信息和它们之间绑定信息,编写队列消息处理组件。

        pom.xml导入RabbitMQ坐标

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

       application.properties配置RabbitMQ信息

#RabbitMQ基本信息
spring.rabbitmq.host=182.61.40.184
spring.rabbitmq.port=5672
spring.rabbitmq.username=rabbitmq
spring.rabbitmq.password=rabbitmq

#自定义配置
#设置交换器名称
spring.rabbitmq.exchange=directExchange
#设置队列A的名称
spring.rabbitmq.queueA=QUEUEA
#设置路由键A
spring.rabbitmq.routingkeyA=routingkey.A
#设置队列B的名称
spring.rabbitmq.queueB=QUEUEB
#设置路由键B
spring.rabbitmq.routingkeyB=routingkey.B

        队列A消息处理组件

/**
 * @RabbitListener:
 * 	 @QueueBinding
 * 	      value:指定队列,autoDelete = "true"表示为此队列为临时队列
 *  	  exchange:指定交换器,并指定其类型为DIRECT类型
 *  	  key:指定此队列和此交换器之间的路由键
 *
 */
@Component
@RabbitListener(
	bindings = @QueueBinding(
		value = @Queue(value="${spring.rabbitmq.queueA}",autoDelete = "true"),
		exchange = @Exchange(value="${spring.rabbitmq.exchange}",type=ExchangeTypes.DIRECT),
		key="${spring.rabbitmq.routingkeyA}"
	)
)
public class RabbitMQReciveA {
	
	//对接收到的消息进行处理
	@RabbitHandler
	public void getMessage(String message) {
		System.out.println("队列A接收到消息:   "+message);
	}
	
}

        队列B消息处理组件

/**
 * @RabbitListener:
 * 	 @QueueBinding
 * 	    value:指定队列,autoDelete = "true"表示为此队列为临时队列
 *  	exchange:指定交换器,并指定其类型为DIRECT类型
 *  	key:指定此队列和此交换器之间的路由键
 *
 */
@Component
@RabbitListener(
	bindings = @QueueBinding(
		value = @Queue(value="${spring.rabbitmq.queueB}",autoDelete = "true"),
		exchange = @Exchange(value="${spring.rabbitmq.exchange}",type=ExchangeTypes.DIRECT),
		key="${spring.rabbitmq.routingkeyB}"
	)
)
public class RabbitMQReciveB {
	
	@RabbitHandler
	public void getMessage(String message) {
		System.out.println("队列B接收到消息:   "+message);
	}
	
}

测试:

        启动两个module,访问Controller。

发布了62 篇原创文章 · 获赞 25 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_39115469/article/details/104571639