首页 > 编程语言 > 详细

Spring AMQP下RabbitAdmin类使用

时间:2021-06-23 00:44:39      阅读:29      评论:0      收藏:0      [点我收藏+]

RabbitAdmin类用来管理RabbitMQ;

 

创建方法:

ConnectionFactory connectionFactory = new CachingConnectionFactory();

RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);

  

RabbitAdmin功能

  • declareExchange:创建交换机
  • deleteExchange:删除交换机
  • declareQueue:创建队列
  • deleteQueue:删除队列
  • purgeQueue:清空队列
  • declareBinding:新建绑定关系
  • removeBinding:删除绑定关系
  • getQueueProperties:查询队列属性

 

CachingConnectionFactory是Spring AMQP下一个连接工厂,适合SpringBoot的深度整合的连接工厂;

从构造方法出发

org.springframework.amqp.rabbit.connection.CachingConnectionFactory#CachingConnectionFactory()

技术分享图片

 

最终会调用这个有参构造方法

org.springframework.amqp.rabbit.connection.CachingConnectionFactory#CachingConnectionFactory(java.lang.String, int)

技术分享图片

 

CachingConnectionFactory最终会调用RabbitMQ的原生API,对RabbitMQ Client包下的ConnectionFactory的包装;

技术分享图片

 

对于下面的这个写法,这个ConnectionFactory是Spring AMQP包下的,它继承了AbstractConnectionFactory,而AbstractConnectionFactory实现了Spring AMQP包下的ConnectionFactory;如下图;

ConnectionFactory connectionFactory = new CachingConnectionFactory();

技术分享图片

 

org.springframework.amqp.core.Exchange实现类,每种实现对应一种交换机类型,如下图;

技术分享图片

 

org.springframework.amqp.core.Queue#Queue(java.lang.String) 对应的参数,如下图;

技术分享图片

 

org.springframework.amqp.core.Binding#Binding 对应的参数,如下图;

技术分享图片

 

org.springframework.amqp.rabbit.core.RabbitAdmin#declareExchange RabbitAdmin使用该方法将交换机进行绑定,使用了RabbitTemplate对RabbitMQ Client包进行了封装;

技术分享图片

 

最终在org.springframework.amqp.rabbit.core.RabbitAdmin#declareExchanges会有调用RabbitMQ Client的原生API,如下图;

技术分享图片

 

测试代码

@Slf4j
@Configuration
public class RabbitConfig {

	@PostConstruct
	public void initRabbit() {
		CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
		connectionFactory.setHost("192.168.211.135");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("/dev");
		connectionFactory.setUsername("admin");
		connectionFactory.setPassword("password");

		RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);

		Exchange exchange = new TopicExchange("exchange.order");
		// 创建交换机
		rabbitAdmin.declareExchange(exchange);

		Queue queue = new Queue("queue.order");
		// 创建队列
		rabbitAdmin.declareQueue(queue);

		Binding binding = new Binding(
				"queue.order",
				Binding.DestinationType.QUEUE,
				"exchange.order",
				"key.order",
				null
		);
		// 新建绑定关系
		rabbitAdmin.declareBinding(binding);
	}
}

  

服务重启后,在RabbitMQ的管控台会出现新建的队列,交换机;

技术分享图片

技术分享图片

 

RabbitAdmin声明式配置

  • 将Exchange,Queue,Binding声明为Bean;
  • 再将RabbitAdmin声明为Bean;
  • Exchange,Queue,Binding即可自动创建;

代码如下:

@Slf4j
@Configuration
public class RabbitConfig {

	@Bean
	public ConnectionFactory connectionFactory() {
		CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
		connectionFactory.setHost("192.168.211.135");
		connectionFactory.setPort(5672);
		connectionFactory.setVirtualHost("/dev");
		connectionFactory.setUsername("admin");
		connectionFactory.setPassword("password");
//		connectionFactory.createConnection();
		return connectionFactory;
	}

	@Bean
	public Exchange exchange() {
		Exchange exchange = new TopicExchange("exchange.order");
		return exchange;
	}

	@Bean
	public Queue queue() {
		Queue queue = new Queue("queue.order");
		return queue;
	}

	@Bean
	public Binding binding() {
		Binding binding = new Binding(
				"queue.order",
				Binding.DestinationType.QUEUE,
				"exchange.order",
				"key.order",
				null
		);
		return binding;
	}

	@Bean
	public RabbitAdmin rabbitAdmin(@Autowired ConnectionFactory connectionFactory) {
		RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
		// 自动创建打开
		rabbitAdmin.setAutoStartup(true);
		return rabbitAdmin;
	}

}

  

  不过@Bean这种注入方式有点懒加载的意思,就是当你注入的Bean没有被使用时,它是不会被加载的;上面配置的Bean如果没有在其他地方被使用,这些Bean是不会被加载;

 

技术分享图片

org.springframework.amqp.rabbit.core.RabbitAdmin类中实现了ApplicationContextAware,InitializingBean接口;之前讲过ApplicationContextAware是可以获取Spring容器的上下文,从而可以注入别的组件注入到该对象;InitializingBean是Bean创建后进行初始化的操作,此时是Bean对象已经创建;

 

RabbitAdmin实现的InitializingBean接口的afterPropertiesSet方法,有如下一个操作;

技术分享图片

 

org.springframework.amqp.rabbit.connection.CachingConnectionFactory#addConnectionListener

技术分享图片

RabbitMQ进行连接的时候会回调添加的listener;

 

RabbitAdmin实现的afterPropertiesSet方法,最终会调用一个initialize方法;

技术分享图片

 

org.springframework.amqp.rabbit.core.RabbitAdmin#initialize

技术分享图片

 通过applicationContext获取到所有的Exchange,Queue,Binding类型的Bean;

 

技术分享图片

最终会创建相应的 Exchange,Queue,Binding;

 

当ConnectionFactory执行createConnection,相应的 Exchange,Queue,Binding通过Spring容器被创建;

connectionFactory.createConnection();

 

Spring AMQP下RabbitAdmin类使用

原文:https://www.cnblogs.com/coder-zyc/p/14891769.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!