SpringBoot的RabbitMQ消息队列: 五、第四模式"Routing"

Routing模式,官方的解释是Receiving messages selectively,它的结构是

SpringBoot的RabbitMQ消息队列: 五、第四模式

消费者各自监控自己的队列;交换机确定生产者的消息放入那个队列。其实这就是用Diret类型的交换机实现。

1、建立工程, 通过http://start.spring.io,建立Direct工程

2、下载、解压,导入eclipse

3、修改pom.xml,以便于热部署

4、增加日志文件logback.xml

5、修改application.properties

 #服务器配置  
spring.application.name=rabbitmq-direct  
server.port=9080   
#rabbitmq连接参数  
spring.rabbitmq.host=localhost  
spring.rabbitmq.port=5672  
spring.rabbitmq.username=test  
spring.rabbitmq.password=123456  
6、配置文件。增加类DirectRabbitConfig,编制代码为
package com.example;

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

@Configuration
public class DirectRabbitConfig {

	@Bean
	public Queue AMessage() {
		return new Queue("direct.A");
	}

	@Bean
	public Queue BMessage() {
		return new Queue("direct.B");
	}

	@Bean
	DirectExchange directExchange() {
		return new DirectExchange("directExchange");
	}

	@Bean
	Binding bindingExchangeMessage(Queue AMessage, DirectExchange exchange) {
		return BindingBuilder.bind(AMessage).to(exchange).with("orange");
	}

	@Bean
	Binding bindingExchangeMessageBOfBlack(Queue BMessage, DirectExchange exchange) {
		return BindingBuilder.bind(BMessage).to(exchange).with("black");
	}

	@Bean
	Binding bindingExchangeMessageBOfGreen(Queue BMessage, DirectExchange exchange) {
		return BindingBuilder.bind(BMessage).to(exchange).with("green");
	}

}
A、定于两个队列

B、定义一个Direct交换机

C、三个绑定策略

7、消息发送。增加类DirectSender,编制代码为

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DirectSender {


	protected static Logger logger=LoggerFactory.getLogger(DirectSender.class); 
	
	@Autowired
    private AmqpTemplate rabbitTemplate;
	public void sendOrange() {
	    String context = "hi, i am message orange";
	    logger.debug("Sender : " + context);
	    this.rabbitTemplate.convertAndSend("directExchange", "orange", context);
	}

	public void sendBlack() {
	    String context = "hi, i am messages black";
	    logger.debug("Sender : " + context);
	    this.rabbitTemplate.convertAndSend("directExchange", "black", context);
	}
	
	public void sendGreen() {
	    String context = "hi, i am messages green";
	    logger.debug("Sender : " + context);
	    this.rabbitTemplate.convertAndSend("directExchange", "green", context);
	}
}
 
  

 8、消息接收1.增加类DirectReceiver,编制代码为 
  

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "direct.A")
public class DirectReceiver {

	protected static Logger logger=LoggerFactory.getLogger(DirectReceiver.class); 
	
    @RabbitHandler
    public void process(String message) {
        logger.debug("direct.A Receiver  : " + message);
    }

}
9、消息接收2.增加类TopicReceiver2,编制代码为

package com.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "direct.B")
public class DirectReceiver2 {
	
	protected static Logger logger=LoggerFactory.getLogger(DirectReceiver2.class); 
	

    @RabbitHandler
    public void process(String message) {
        logger.debug("direct.B Receiver  : " + message);
    }

}
10、RestController。增加类DirectController,编制代码为

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DirectController {
	
	@Autowired
    private DirectSender directSender;
	
	@RequestMapping("/send1")
	public String send1() {
		directSender.sendOrange();
		return "send1 orange ok";
	}
	
	@RequestMapping("/send2")
	public String send2() {
		directSender.sendBlack();
		return "send2  black ok";
	}
	
	@RequestMapping("/send3")
	public String send3() {
		directSender.sendGreen();
		return "send3 green ok";
	}
}
11、运行工程。在工程所在文件夹打开cmd,输入mvn spring-boot:run

12、在浏览器中分别输入http://localhost:9080/send1 ,http://localhost:9080/send2,http://localhost:9080/send3,查看控制台输出

13、小结

A、在配置文件中,定义了一个DirectExchange,然后对两个队列,分别配置了绑定规则。(变更绑定规则测试时,先停止命令行的spring-boot,再删除rabbitmq management中的队列)。

B、发送器,发送send1会匹配到第一个Receiver收到消息,发送send2、send3都匹配到Receiver2收到消息。

     发送器在发送消息时,使用的方法是需要传入一个特定的交换机的,以及路由规则

C、接收器,依然各自监控自己的队列;


你可能感兴趣的:(springboot,rabbitmq)