热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Springboot消息JMSAMQPRabbbitMQSpringboot整合篇13/14/15/16/17/18/19

应用场景1----异步处理:写进消息队列只用5ms然后异步处理。2.应用解耦3.流量削峰队列是定长的,没进队列的话就返回秒杀失败。消息代理࿱

       

  应用场景1----异步处理:

                 

                 写进消息队列只用5ms 然后异步处理。 

2.应用解耦

               

    3.流量削峰

             队列是定长的,没进队列的话就返回秒杀失败。

                         

                   消息代理:就是消息中间件的服务器。消息发到服务器,服务器把消息发到指定的目的地。

                   通信机制如下图:对于点对点的只要有人拿到了其他人就不能拿到了。

                    

           4就是出队和入队5就是消息发布者发布到一个主题里面,bcd监听,只要一到达就可以收到。

           JMS:AMQP是规范,不同

           

           

           spring使用的话只要导入starter就可以了,然后就是自动配置类。

           AMQP是跨平台的有的比较多的。

13------------------------------------------------------------------------------------------------------------------------

           

        这个是由erlang实现的。

        消息生产者将消息发送到服务器--消息代理,发给服务器里面的交换机。接收消息,路由到消息队列。队列和交换器的关联关系是绑定,就是路由关系表。

           

            信道:解决登陆复用的。就是一条tcp连接的多个信道。

消费者和消息队列用tcp复用进行连接。

14-------------------------------------------------------------------------------------------------------------------------

        

      消息队列和交换器是多对多的关系。

交换器的四种类型。

direct:直连,路由件和绑定的一模一样的时候才发送。

fanout:就是交换器消息抵达fanout交换器的时候,就是绑定的队列每人发一份的,就是广播模式。JMS里面发布订阅的参考实现。

topic:允许对路由件进行模糊匹配有选择的发给队列。类似于正则表达式。

headers:这个用的比较少的。

 

总结:

15--------------------------------------------------------------------------------------------------------------------------------------

         讲解了如何用docker下载镜像。

         搭建RabbitMQ:

                     

            安装带management的是带管理界面的。

            

             

             

                 

docker pull rabbitmq:3-management

  启动运行镜像:

       

docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 1f53405491bcd是后台运行 -p是暴露端口 两个端口 5672是容器的 15672web端口

    访问下:http://192.168.244.130:15672/

    

用户名和密码是guest

03:44

中间绿色的是四个队列。此外层是绑定规则。

新建exchange

        

      添加交换器  Durable是是否持久化就是下次再来是不是数据还在。

     

       新建两个交换机。

   目前有三个交换器,继续添加消息队列。

   继续添加:

-----------------------------------------------------------------------------

    交换器绑定队列:

    点进去交换器:

    

     按照以上得方法给其他得交换机也绑定队列。

topic的

     

      解释下上面第一个的意思 只要是队列的名字是atguigu.XXXXX我的exchange都绑定上。

      绑定主要绑定的是exchange和queue

      三步:建交换机-队列-绑定队列

------------------------------------------------------------

      给交换器发送消息看哪个队列能收到消息。

      测试下消息,点击交换器:

                    

  在队列atguigu里面查看:

         fanout的路由发送。

         可以看到全部发出了。

       -----------------------------------------------

         最后测试topic,根据匹配规则发送给队列。

         

都发了。

应答之后删除掉。选择这个。

     

  就是不同的类型的exchange绑定queue设置名称,按照名称和规则绑定。

16--------------------------------------------------------------------------------------------------------------------------

         创建过程整合测试rabbitmq     

          

  选择web和rabbitmq

org.springframework.bootspring-boot-starter-amqp

   看到这个。

    分析下自动配置的原理:

                   

我们可以看下这个自动配置类,都是在自动配置的配置文件里面的。

点进去这个配置文件:

根据配置文件我们开始配置。    

spring.rabbitmq.host=192.168.244.130
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=5672
#spring.rabbitmq.virtual-host=

基本的配置看自动配置配置的。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

如何发送消息和接受消息呢?我们还看自动配置

redisTemplate这个类的作用是给rabbitMq发送和接受消息的。 

    

这个是系统管理组件,声明交换器和队列管理什么的。

注入消息组件。

---------------------------------

测试几个消息:    

/*** 1、单播&#xff08;点对点&#xff09;*/&#64;Testpublic void contextLoads() {//Message需要自己构造一个;定义消息体内容和消息头&#xff0c;最后一哥参数查看Message类//rabbitTemplate.send(exchage,routeKey,message);//object默认当成消息体&#xff0c;只需要传入要发送的对象&#xff0c;自动序列化发送给rabbitmq&#xff1b;//rabbitTemplate.convertAndSend(exchage,routeKey,object);Map map &#61; new HashMap<>();map.put("msg","这是第一个消息");map.put("data", Arrays.asList("helloworld",123,true));//对象被默认序列化以后发送出去 参数分别是交换器的名字 路由键 和消息体rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",new Book("西游记","吴承恩"));
}

   发送测试。

 这个会有乱码是因为序列化是默认的java的序列化的方式。

 接受消息&#xff0c;肯定在队列里面接受消息&#xff1a;

//接受数据,如何将数据自动的转为json发送出去&#64;Testpublic void receive(){//参数是队列的名字Object o &#61; rabbitTemplate.receiveAndConvert("atguigu.news");System.out.println(o.getClass());System.out.println(o);}

    ----------------------------------------------------------------------------------------------------

       注意一点收到消息队列就没了因为就出队了&#xff0c;不是广播的只保证有一个收到。

         如何将数据自动转为json发送出去&#xff1a;

         原始的结果&#xff1a;

         

       点进去simpleMessageConverter()&#xff1a;

         

         我们可以换一个MessageConverter。

         

         看这个自动配置不为null的话就用我们自己定义的。

         

                     

package com.atguigu.config;import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;&#64;Configuration
public class MyAMQPConfig {&#64;Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}
}

在次测试&#xff1a;

现在存取对象&#xff1a;

package com.atguigu.bean;public class Book {private String bookName;private String author;public Book() {}public Book(String bookName, String author) {this.bookName &#61; bookName;this.author &#61; author;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName &#61; bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author &#61; author;}&#64;Overridepublic String toString() {return "Book{" &#43;"bookName&#61;&#39;" &#43; bookName &#43; &#39;\&#39;&#39; &#43;", author&#61;&#39;" &#43; author &#43; &#39;\&#39;&#39; &#43;&#39;}&#39;;}
}

广播&#xff1a;

/*** 广播*/&#64;Testpublic void sendMsg(){Map map &#61; new HashMap<>();map.put("msg","这是第二个消息");map.put("data", Arrays.asList("helloworld",123,true));//参数依次是转换器的名称(广播) 路由件 消息体rabbitTemplate.convertAndSend("exchange.fanout","",map);}

17--------------------------------------------------------------------------------------------------------------------------

实际开发要需要监听场景&#xff1a;

类似库存系统和订单系统。   

场景&#xff1a;两个系统订单系统和库存系统。下单的信息放在消息队列里面&#xff0c;库存系统实时的监听订单系统的消息。

           一旦有新的订单进来库存系统由相应的操作。

package com.atguigu.service;import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;&#64;Service
public class BookService {//监听是监听的下消息队列 直接将消息反序列化为book对象 相当于强转&#64;RabbitListener(queues &#61; "atguigu.news")public void receive(String book){System.out.println("收到消息&#xff1a;"&#43;book);}&#64;RabbitListener(queues &#61; "atguigu")public void receive02(Message message){System.out.println(message.getBody());System.out.println(message.getMessageProperties());}
}

  注意这个使用之前要加上这个&#xff0c;开启基于注解的RabbitMQ&#xff1a;

     切记。 

 清空队列了。

测试如下方法&#xff1a;

1.主程序开启基于注解的RabbltMQ。

2.注解监控消息,一旦在队列加入了值&#xff0c;直接监控器就会取出来。

18-----------------------------------------------------------------------------------------------------------------------------

管理系统&#xff1a;创建消息队列什么的。这个的目的是在程序中创建消息队列 交换器 绑定规则 和消息队列

 测试类里面测试&#xff0c;注入&#xff1a;

&#64;AutowiredAmqpAdmin amqpAdmin;

在自动配置类RabbitAutoConfiguration

里面找到这个组件&#xff1a;

搜索下Exchange&#xff0c;看下继承关系。

创建交换器&#xff1a;

&#64;Testpublic void createExchange(){//创建exchangeamqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));System.out.println("创建完成");amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));//创建绑定规则//参数&#xff1a;目的地就是绑定到哪个队列&#xff0c;绑定的类型是队列还是交换器&#xff0c;绑定的交换器给哪个交换器绑定&#xff0c;路由件&#xff0c;其他是nullamqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null));}

 运行&#xff1a;http://192.168.244.130:15672/

创建队列&#xff1a;      

&#64;Testpublic void createExchange(){//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","amqp.haha",null));//amqpAdmin.de}

     

   创建绑定队则&#xff1a;

&#64;Testpublic void createExchange(){//amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));//System.out.println("创建完成");//amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));//创建绑定规则//参数&#xff1a;目的地就是绑定到哪个队列&#xff0c;绑定的类型是队列还是交换器&#xff0c;
绑定的交换器给哪个交换器绑定&#xff0c;路由件&#xff0c;其他是nullamqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqp.haha",null));//amqpAdmin.delete......}

        

19-----------------------------------------------------------------------------------------------------------------------------

github地址&#xff1a;https://github.com/FandyWw/spring-boot-02-amqp


推荐阅读
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • 容器管理与容器监控influxDB
    容器管理与容器监控-influxDB什么是influxDBinfluxDB安装(1)下载镜像(2)创建容器(3 ... [详细]
  • (九)Docker常用安装
    一、总体步骤1、搜索镜像2、拉取镜像3、查看镜像4、启动镜像5、停止镜像6、移除镜像二、安装tomcat1、dockerhub上面查找tomcat镜像 dockersearchto ... [详细]
author-avatar
Libra
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有