最近研究了很多关于SpringBoot的文章,它能和很多框架进行整合,尤其是中间件的整合,我们公司用的最多的就是整合redis了,但是我对rabbitMQ比较感兴趣,就想自己整合下玩玩,看了很多文章后,开始撸起袖子加油干。

  • 以direct exchange直连型交换机为例
第一步 安装RabbitMQ (windows 端) 和 Erlang 客户端

这个网上的教程很多,不过建议直接从官网下载,解压之后,和配置JDK一样配置系统变量,之后设置rabbitMQ的用户和密码。一切OK后,开始建项目。

第二步 创建RabbitMQ 的生产者端(Provider)

基于SpringBoot 建立

spring整合protobuf Spring整合rabbitmq消息生产端 jdk1.7_springboot

生产端和消费端都需要引入的依赖
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
DirectRabbitConfig

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;

/*
 * 【Time】2020年11月16日 上午11:29:02
 * 【Function】direct exchange(直连型交换机) 有一个队列绑定到一个直连交换机上,同时赋予一个路由键 routing key 。
然后当一个消息携带着路由值为X,这个消息通过生产者发送给交换机时,交换机就会根据这个路由值X去寻找绑定值也是X的队列 
 * 另外两种交换机 
 * Fanout Exchange扇型交换机(个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。)
 * Topic Exchange 主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的
 */
@Configuration
public class DirectRabbitConfig {
	
	// 设一个队列名 testProvider 
	@Bean
	public Queue testProvider() {
		return new Queue("testProvider",true);
	}
	//Direct交换机
	@Bean
	DirectExchange testDirectExchange() {
		return new DirectExchange("testDirectExchange", true, false);
	}
	// 将上面两个绑定起来 并设置用于匹配键 TestDirectRouting
	@Bean
	Binding bindingDirectExchange() {
		return BindingBuilder.bind(testProvider()).to(testDirectExchange()).with("testDirectRouting");
	}
	@Bean
	DirectExchange lonelyDirectExchange() {
		 return new DirectExchange("lonelyDirectExchange");
	}
}
开始生产消息
@RestController
public class TestController {
	 @Autowired
	 RabbitTemplate rabbitTemplate; 
	 
	  @GetMapping("/sendDirectMessage")
	  public String sendDirectMessage() {
		  	Map<String,Object> map=new HashMap<>();
	        map.put("messageData","MQ,hello ");
	        map.put("createTime",Clock.systemUTC());
	        //将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
	        rabbitTemplate.convertAndSend("testDirectExchange", "testDirectRouting", map);
	        return "ok";	
	  }

}
application.yml
server:
  port: 8081
spring:
  #给项目来个名字
  application:
    name: rabbitmq-provider
  #配置rabbitMq 服务器
  rabbitmq:
    host: localhost
    port: 5672
    username: sch
    password: 1234
    
  management:
    health:
    rabbit:
    enabled: false
第三步 比葫芦画瓢,创建消费端(Consumer)
DirectRabbitConfig
@Configuration
public class DirectRabbitConfig {
	    
	   @Bean
	    public Queue testComsumer() {
	        return new Queue("TestComsumer",true);
	    }
	 
	    //Direct交换机 起名:TestDirectExchange
	    @Bean
	    DirectExchange TestDirectExchange() {
	        return new DirectExchange("testDirectExchange");
	    }
	 
	    //绑定  将队列和交换机绑定, 并设置用于匹配键:TestDirectRouting
	    @Bean
	    Binding bindingDirect() {
	        return BindingBuilder.bind(testComsumer()).to(TestDirectExchange()).with("testDirectRouting");
	    }
}
DirectReceiver

这个是用于获取从生产端过来的信息的。需要注意的是 这里可以设置多个DirectReceiver 用于消息的接收,而不会重复。其实就类似于多线程接收消息。

@Service
@RabbitListener(queues="testProvider")
public class DirectReceiver {
	
	@RabbitHandler
	public void process(Map map) {
		System.out.println("DirectReceiver得到了消息提供者发送的消息:"+map);
	}
}
@Service
@RabbitListener(queues="testProvider")
public class DirectReceiver2 {
	
	@RabbitHandler
	public void process(Map map) {
		System.out.println("DirectReceiver2得到了消息提供者发送的消息:"+map);
	}
}
第四步 两端同时开启,生产端不断生产消息,看消费端能否消费到

spring整合protobuf Spring整合rabbitmq消息生产端 jdk1.7_中间件_02

  • 这里的交换机DirectExchange 大家可以换成另外两个进行测试,Fanout Exchange扇型交换机 Topic Exchange 主题交换机 ,针对不同的消息类型进行不同的接收处理,大家可以尝试一下。