2.2_springboot2.x消息RabbitMQ整合&amqpAdmin管理组件的使用
5.1.1、基本测试
1.引 spring-boot-starter-amqp**
 <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
自动配置原理说明 RabbitAutoConfiguration
1、有自动配置了连接工厂CachingConnectionFactory;获取与rabbitmq连接信息
@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
	@Configuration
	@ConditionalOnMissingBean(ConnectionFactory.class)
	protected static class RabbitConnectionFactoryCreator {
		@Bean
		public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties properties,
				ObjectProvider<ConnectionNameStrategy> connectionNameStrategy) throws Exception {
           ...
        }
        ...
2、RabbitProperties封装了 RabbitMQ的配置
@ConfigurationProperties(prefix = "spring.rabbitmq")
public class RabbitProperties {
	/**
	 * RabbitMQ host.
	 */
	private String host = "localhost";
	/**
	 * RabbitMQ port.
	 */
	private int port = 5672;
    ....
application.yml配置
spring:
  rabbitmq:
    host: xxx.xxx.xxx.xxx
    username: guest
    password: guest
    port: 5672
3、RabbitTemplate:给RabbitMQ发送和接收消息
@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
    ....
	@Configuration
	@Import(RabbitConnectionFactoryCreator.class)
	protected static class RabbitTemplateConfiguration {
		private final RabbitProperties properties;
		private final ObjectProvider<MessageConverter> messageConverter;
		private final ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers;
		public RabbitTemplateConfiguration(RabbitProperties properties,
				ObjectProvider<MessageConverter> messageConverter,
				ObjectProvider<RabbitRetryTemplateCustomizer> retryTemplateCustomizers) {
			this.properties = properties;
			this.messageConverter = messageConverter;
			this.retryTemplateCustomizers = retryTemplateCustomizers;
		}
		@Bean
		@ConditionalOnSingleCandidate(ConnectionFactory.class)
		@ConditionalOnMissingBean(RabbitOperations.class)
		public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
			PropertyMapper map = PropertyMapper.get();
			RabbitTemplate template = new RabbitTemplate(connectionFactory);
			MessageConverter messageConverter = this.messageConverter.getIfUnique();
			if (messageConverter != null) {
				template.setMessageConverter(messageConverter);
			}
			template.setMandatory(determineMandatoryFlag());
			RabbitProperties.Template properties = this.properties.getTemplate();
			if (properties.getRetry().isEnabled()) {
				template.setRetryTemplate(new RetryTemplateFactory(
						this.retryTemplateCustomizers.orderedStream().collect(Collectors.toList())).createRetryTemplate(
								properties.getRetry(), RabbitRetryTemplateCustomizer.Target.SENDER));
			}
			map.from(properties::getReceiveTimeout).whenNonNull().as(Duration::toMillis)
					.to(template::setReceiveTimeout);
			map.from(properties::getReplyTimeout).whenNonNull().as(Duration::toMillis).to(template::setReplyTimeout);
			map.from(properties::getExchange).to(template::setExchange);
			map.from(properties::getRoutingKey).to(template::setRoutingKey);
			map.from(properties::getDefaultReceiveQueue).whenNonNull().to(template::setDefaultReceiveQueue);
			return template;
		}
}
4、AmqpAdmin:RabbitMQ系统管理组件,用来声明队列,交换器等 , 当没有在网页端自己创建queue、exchange、Binding时可采用 AmqpAdmin:创建和删除queue、exchange、Binding
@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
    ...
        @Bean
		@ConditionalOnSingleCandidate(ConnectionFactory.class)
		@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic", matchIfMissing = true)
		@ConditionalOnMissingBean
		public AmqpAdmin amqpAdmin(ConnectionFactory connectionFactory) {
			return new RabbitAdmin(connectionFactory);
		}
}
2.测试RabbitMQ
1)单波-点对点
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02AmqpApplicationTests {
    @Autowired
    RabbitTemplate rabbitTemplate;
      @Test
    public void contextLoads() {
        //message需要自己定义,定义一个消息体内容
        //rabbitTemplate.send(exchage,routeKey,message);
        //常用的convertAndSend,消息体会自动转换,object:默认当成消息体,只要传入要发送的对象,自动序列化Babbitmq
        //rabbitTemplate.convertAndSend(exchange,routeKey,object);
        Map<String,Object> maps = new HashMap<String,Object>();
        maps.put("msg","这是一个消息");
        maps.put("data", Arrays.asList("helloworld",123,true));
        //对象被默认序列化以后发送出去(jdk)
        rabbitTemplate.convertAndSend("exchange.direct","jatpeo.news",new Book("西游记","吴承恩"));
    }
    //接收数据,如何将数据自动转为json发送出去?
    @Test
    public void receive(){
        Object o = rabbitTemplate.receiveAndConvert("jatpeo.news");
        System.out.println(o.getClass());
        System.out.println(o);
    }
 常用的convertAndSend,消息体会自动转换,object:默认当成消息体,只要传入要发送的对象,自动序列化Babbitmq,对象被默认序列化以后发送出去(jdk)
源码分析:
public class RabbitTemplate extends RabbitAccessor // NOSONAR type line count
		implements BeanFactoryAware, RabbitOperations, MessageListener,
			ListenerContainerAware, PublisherCallbackChannel.Listener, Lifecycle, BeanNameAware {
                	private MessageConverter messageConverter = new SimpleMessageConverter();
调用SimpleMessageConverter
public class SimpleMessageConverter extends WhiteListDeserializingMessageConverter implements BeanClassLoaderAware {
      content = new String(message.getBody(), encoding);
                } catch (UnsupportedEncodingException var8) {
                    throw new MessageConversionException("failed to convert text-based Message content", var8);
                }
            } else if (contentType != null && contentType.equals("application/x-java-serialized-object")) {
                try {
                    content = SerializationUtils.deserialize(this.createObjectInputStream(new ByteArrayInputStream(message.getBody()), this.codebaseUrl));
                } catch (IllegalArgumentException | IllegalStateException | IOException var7) {
                    throw new MessageConversionException("failed to convert serialized Message content", var7);
                }
            }
}
自定义MessageConvert
新建MyAMQPConfig
@EnableRabbit//开启基于注解的RabbitMQ
@Configuration
public class MyAMQPConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}
2)广播
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02AmqpApplicationTests {
    @Autowired
    RabbitTemplate rabbitTemplate;
     /**
     * 2、广播
     *
     * 广播路由键无所谓
     * */
    @Test
    public void Test(){
        rabbitTemplate.convertAndSend("exchange.fanout","",new Book("红楼梦","曹雪芹"));
    }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TNAhBooF-1571057027287)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1571056120180.png)]
5.1.2、@RabbitListener和@EnableRabbit
@EnableRabbit + @RabbitListener 监听消息队列的内容
@RabbitListener:监听队列
@EnableRabbit:开启基于注解的RabbitMq
@Service
public class BookService {
    //只要这个消息队列收到消息就打印消息,要让此注解生效要在配置类中开启注解@EnableRabbit
    @RabbitListener(queues = "jatpeo.news")
    public void receive(Book book){
        System.out.println("收到消息。。。打印");
    }
    @RabbitListener(queues = "jatpeo")
    public void receive02(Message message){
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }
}
5.1.3、AmqpAdmin:RabbitMQ
AmqpAdmin:RabbitMQ系统管理组件,用来声明队列,交换器等
当没有在网页端自己创建queue、exchange、Binding时可采用* AmqpAdmin:创建和删除queue、exchange、Binding
注入AmqpAdmin
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02AmqpApplicationTests {
    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    AmqpAdmin amqpAdmin;
    @Test
    public void createExchange(){
        //创建DirectExchange
       /* amqpAdmin.declareExchange(new DirectExchange("amqpAdmin.exchange"));
        System.out.println("创建完成");*/
        //创建队列
       //amqpAdmin.declareQueue(new Queue("amqpAdmin.queue",true));
        //创建绑定规则
        amqpAdmin.declareBinding(new Binding("amqpAdmin.queue", Binding.DestinationType.QUEUE,
                "amqpAdmin.exchange","amqpAdmin.haha",null));
    }
网页端查看:

等。
2.2_springboot2.x消息RabbitMQ整合&amqpAdmin管理组件的使用的更多相关文章
- SpringBoot消息篇Ⅲ --- 整合RabbitMQ
		知识储备: 关于消息队列的基本概念我已经在上一篇文章介绍过了(传送门),本篇文章主要讲述的是SpringBoot与RabbitMQ的整合以及简单的使用. 一.安装RabbitMQ 1.在linux上 ... 
- java框架之SpringBoot(12)-消息及整合RabbitMQ
		前言 概述 大多数应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦的能力. 消息服务中两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送 ... 
- springboot核心技术(五)-----消息(rabbitmq)
		消息 1. 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者发 ... 
- SpringBoot日记——MQ消息队列整合(一)
		除了之前讲到的缓存,我们还会用到消息队列来存储一些消息,为了提升系统的异步性能等等: 消息服务有两个概念需要知道:消息代理-message broker,目的地-destination.消息发送由代理 ... 
- SpringBoot与消息(RabbitMQ)
		1. JMS和AMQP JMS(Java Message Service): ActiveMQ是JMS实现; AMQP(Advanced Message Queuing Protocol) 兼容JMS ... 
- rabbitmq之后台管理和用户设置(三)
		前言 前面介绍了erlang环境的安装和rabbitmq环境安装,接下来介绍rabbitmq的web管理和用户设置. 启用后台管理插件 通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等. ... 
- RabbitMQ交换机、RabbitMQ整合springCloud
		目标 1.交换机 2.RabbitMQ整合springCloud 交换机 蓝色区域===生产者 红色区域===Server:又称Broker,接受客户端的连接,实现AMQP实体服务 绿色区域===消费 ... 
- 消息中间件——RabbitMQ(十)RabbitMQ整合SpringBoot实战!(全)
		前言 1. SpringBoot整合配置详解 publisher-confirms,实现一个监听器用于监听Broker端给我们返回的确认请求:RabbitTemplate.ConfirmCallbac ... 
- Rabbitmq与spring整合之重要组件介绍——AMQP声明式配置&RabbitTemplate组件
		上一节是使用rabbitAdmin的管理组件进行声明队列,交换器,绑定等操作,本节则是采用AMQP声明式配置来声明这些东西.AMQP声明主要是通过@Bean注解进行的. 配置: package com ... 
随机推荐
- CentOS7用rpmforge源!
			确认系统是否安装了priority这个yum的插件,这个插件用来保证安装软件时候软件仓库先后次序,一般是默认先从官方base或者镜像安装,然后从社区用户contribute的软件中安装,再从第三方软件 ... 
- JavaScript笔记(第一章,第二章)
			JavaScript笔记(第一章,第二章) 第一章: <meta http-equiv="Content-Type" content="text/html; cha ... 
- 框架-.NET:Spring.Net
			ylbtech-框架-Spring.Net:Spring.Net Spring.NET为建立企业级应用提供了一套轻量级的解决方案.通过Spring.NET,我们可以用统一且透明的方式来配置应用程序.S ... 
- maven surefire入门
			一.maven常用命令: mvn compile mvn install mvn test mvn clean mvn dependency:resolve -X #查看完整的debug信息!!! ... 
- Java并发主要操作
			核心Java提供对多线程程序的完全控制. 也可以开发一个可以根据您的要求完全暂停,恢复或停止的多线程程序. 有各种静态方法可以用于线程对象来控制它们的行为. 下表列出了这些方法 - 编号 方法 说明描 ... 
- 【转】console.dir()和console.log()的区别
			原文链接:https://blog.csdn.net/ky1in93/article/details/80828499 console对象详解:https://segmentfault.com/a/1 ... 
- linux常用命令-2网络相关命令
			1.ip [选项] 操作对象{link|addr|route...} ip addr show #显示网卡IP信息 2.修改IP配置 1) root权限 2) cd /etc/sy ... 
- <el-table>序号逐次增加,翻页时继续累加,解决翻页时从编号1开始的情况
			注释: scope.$index 当前序号 cuePage 表示当前页码 pageSize 表示每页显示的条数 
- hadoop.io.native.NativeID$Windows.access0 报错问题解决
			系统:win10 hadoop-2.6.0版本 java:1.8 版本32位 wordcount在本地运行时报错: Exception in thread "main" jav ... 
- leetcood学习笔记-59-螺旋矩阵二
			题目描述: 参考后的提交: class Solution: def generateMatrix(self, n: int): #l = [[0] * n] * n 此创建方法错误 l = [[] f ... 
