




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
RabbitMQ介Q全称为sseQue,即消息队列,RitQ是由rlang语言开发,基于AP(Avacdessaeuee高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabitMQ地址:htp: /开发中消息队列通常有如下应用场景1、任务异步处理2、应用程序解耦市场上还有哪些消息队列5、SpringBoot默认已集成AMQP总结:AMP是一套公开的消息队列协议,最早在200年被提出,它旨在从协议层定义消息通信数据的标准格式,为的就是解决M市场上协议不统一的问题。RabitMQ就是遵循AP标准协议开发的M服务。:JMS是什么总结JS是jav提供的一套消息服务AP标准,其目的是为所有的jva应用程序提供统一的消息通信的标准,类似jv的jd,只要遵循j标准的应用程序之间都可以进行消息通信。它和AP有什么不同,j是jv语言专属的消息服务标准,它是在api层定义标准,并且只能用于jv应用;而AMP是在协议层定义的标准,是跨语言的。快速组成部分说明如Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。消息发布接收流4、Exchange将消息转发到指定的Queue(队列5、消费者接收到消息安要安装Erlang/OTP,并保持版本匹配,如下图 本项目使用Erlang/OTP20.3版本和RabbitMQ3.7.3版本1)地址如下win6420.3.exe或去老师提供的软件包中找 erlang安装完成需要配置erlang环境变量:ERLANG_HOME=D:\ProgramFiles\erl9.3在path中添2)安装
/rabbitmq/rabbitmq-或去老师提供的软件包中找 启RabbitMQService-install:安装服务RabbitMQService-remove删除服务RabbitMQService-start启动RabbitMQService-stop启动如果没有开始菜单则进入安 下 安装并运行服rabbitmq-service.batinstall安装服务rabbitmq-service.batstop停止服务rabbitmq-service.batstart启动服务管理员运行rabbitmq-plugins.batenable3、启动成功RabbitMQ注意事o按 /getstarted.html)测 搭建环java我们先用rabbitMQ提供的java 参考: 创建生产者工程和消费者工程,分别加入RabbitMQ 的依赖test-rabbitmq-consumer:消费者工程<version>4.0.3</version><!‐‐<version>4.0.3</version><!‐‐此版本与springboot1.5.9版本匹配生产在生产者工程下的test////队列名factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服//创建与RabbitMQ服务的TCP连//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任队列,如果Rabbit中没有此队列将自动创param3:队列是否独占此连param4:队列不再使用时是否自动删除此param5:队列参消息发布方param1:Exchange的名称,如果没有指定,则使用Defaultparam2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消param3:消息包含的属param4:消息默认的交换机,默认的交换机,routingKey消费在消费者工程下的test////设置MabbitMQ所在服务器的ip和端 队//定义消费方消费者接收@paramconsumerTag消费者 ,在channel.basicConsume()去指@paramenvelope消息包的内容,可从中获取消息id,消息routingkey,交换机,消息和重(收到消息失败后是否需要重新发送publicvoidhandleDelivery(StringEnvelopeenvelope,AMQP.BasicPropertiesproperties,byte[]body)throwsIOException//Stringexchange=//路由StringroutingKey=//消息longdeliveryTag=//Stringmsg=newSystem.out.println("receivemessage.."+}队列Stringqueue,booleanautoAck,Consumer12、是否自动回复,设置为true为表示消息接收到自 mq回复接收到了,mq接收到回复会删除消息,设置为false则需要手动回复3channel.basicConsume(QUEUE,true,}}2.2.4总1、发送端操作流创建创建发送创建创建接收ack回工作模RabbitMQ有以下几种工作模式:1、WorkWorkworkqueues与程序相比,多了一个消费端,两个消费端共同消费同一个队列中的消息。应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。测试工作模发布订阅模式、生产者将消息发给be,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息代案例用户通知,当用户充值成功或转账完成系统通知用户,通知方式有、邮件多种方法Exchange_fanout_inform两个队列并且绑定到此交换机,绑定时不需要指定otingy发送消息时不需要指定outingypackagepackage//队列名privatestaticfinalStringQUEUE_INFORM_ ="queue_inform_ privatestaticfinalStringQUEUE_INFORM_SMS="queue_inform_sms";privatestaticfinalStringEXCHANGE_FANOUT_INFORM="exchange_fanout_inform";publicstaticvoidmain(String[]args){Connectionconnection=null;Channelchannel=null;try//创建一个与MQ的连ConnectionFactoryfactory=newConnectionFactory();factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服器//创 connection=channel=connection.createChannel(); 交换机Stringexchange,BuiltinExchangeType参数1、交换机名2、交换机类型,fanout、topic、direct、channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM, 队 (Stringqueue,booleandurable,booleanexclusive,booleanautoDelete,Map<String,Object>arguments)参数明细1、队列名2、是否持久3、是否独占此4、队列不用是5 ,true,false,false,null);channel.queueDeclare(QUEUE_INFORM_SMS,true,false,false,null);//交换机和队列绑定Stringqueue,Stringexchange,String参数1、队列名2、交换机名3、路由 //发送消for(intStringmessage="informto//向交换机发送消息Stringexchange,StringroutingKey,BasicPropertiesbyte[]byte[]参数明1、交换机名称,不指令使用默认交换机名称Default2、routingKey(路由key),根据key名称将消息转发到具体的队列,这里填写队列名称表示息将发到此队3、消息属4、消息内channel.basicPublish(EXCHANGE_FANOUT_INFORM,"",null,message.getBytes());System.out.println("SendMessageis:'"+message+"'");}}catch(IOException{;}catch(TimeoutException{try{}catch(IOException{}catch(TimeoutException{}}try{}catch(IOException{}}}}2、邮件发送消费packagepackage@author@version@create2018‐06‐14publicclass //队列名privatestaticfinalStringQUEUE_INFORM_ ="inform_queue_ privatestaticfinalStringEXCHANGE_FANOUT_INFORM="inform_exchange_fanout";publicstaticvoidmain(String[]args)throwsIOException,TimeoutException//创建一个与MQ的连ConnectionFactoryfactory=newConnectionFactory();factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务//创 Connectionconnection=//创建与交换机的通道,每个通道代表一Channelchannel= 交换机Stringexchange,BuiltinExchangeType参数1、交换机名2、交换机类型,fanout、topic、direct、channel.exchangeDeclare(EXCHANGE_FANOUT_INFORM, 队 channel.queueDeclare(Stringqueue,booleandurable,booleanexclusive,booleanautoDelete,Map<String,Object>arguments)参数明细1、队列名2、是否持久3、是否独占此4、队列不用是5 ,true,false,false,//交换机和队列绑定Stringqueue,Stringexchange,String参数1、队列名2、交换机名3、路由 //定义消费方DefaultConsumerdefaultConsumer=new{1,true,3、发送消费参考上边的邮件发送消费者代码编写测思1、publish/subscribe与workqueues有什么区别。workqueues不用定义交换机,而publish/subscribepulish/subscrib的生产方是面向交换机发送消息,workqees的生产方是面向队列发送消息(pubis/subscibe需要设置队列和交换机的绑定,workqueues不需要设置,实质上workqueues会将队列绑定到默认的交换机。相同所以两者实现的发布/订阅的效果是一样的,多个消费端同一个队列不会重复消费消息2、实质工作用什么publish/subscribe还是workqueues建议使用pulish/subscribe,发布订阅模式比工作队列模式更强大,并且发布订阅模式可以指定自己的交换机。工作模路由模式代exchange_routing_inform两个队列并且绑定到此交换机,绑定时需要指定otingy发送消息时需要指定outingyimportimport//队列名//创建一个与MQfactory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服器//创 connection=channel=connection.createChannel(); 交换机Stringexchange,BuiltinExchangeType参数1、交换机名2、交换机类型,fanout、topic、direct、 队 channel.queueDeclare(Stringqueue,booleandurable,booleanexclusive,booleanautoDelete,Map<String,Object>arguments)参数明细1、队列名2、是否持久3、是否独占此4、队列不用是5 ,true,false,false,null);channel.queueDeclare(QUEUE_INFORM_SMS,true,false,false,null);//交换机和队列绑定Stringqueue,Stringexchange,String参数1、队列名2、交换机名3、路由 //发送邮件消for(intStringmessage= informto//向交换机发送消息Stringexchange,StringroutingKey,BasicPropertiesbyte[]息将发到此
参数1、交换机名称,不指令使用默认交换机名称Default2、routingKey(路由key),根据key名称将消息转发到具体的队列,这里填写队列名称表3、消息属4、消息内channel.basicPublish(EXCHANGE_ROUTING_INFORM, ,System.out.println("SendMessageis:'"+message+byte[]
消for(intStringmessage="smsinformto//向交换机发送消息Stringexchange,StringroutingKey,BasicPropertieschannel.basicPublish(EXCHANGE_ROUTING_INFORM,QUEUE_INFORM_SMS,System.out.println("SendMessageis:'"+message+}}catch(IOException{;}catch(TimeoutException{try{}catch(IOException{}catch(TimeoutException{}}try{}catch(IOException{}}}}}2、邮件发送消费packagepackageimportpublicclass //队列名privatestaticfinalStringQUEUE_INFORM_ ="inform_queue_ privatestaticfinalStringEXCHANGE_ROUTING_INFORM="inform_exchange_routing";publicstaticvoidmain(String[]args)throwsIOException,TimeoutException//创建一个与MQ的连ConnectionFactoryfactory=newConnectionFactory();factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服务//创 Connectionconnection=//创建与交换机的通道,每个通道代表一Channelchannel= 交换机Stringexchange,BuiltinExchangeType参数1、交换机名2、交换机类型,fanout、topic、direct、 队 channel.queueDeclare(Stringqueue,booleandurable,booleanexclusive,booleanautoDelete,Map<String,Object>arguments)参数明细1、队列名2、是否持久3、是否独占此4、队列不用是5 ,true,false,false,//交换机和队列绑定Stringqueue,Stringexchange,String参数1、队列名2、交换机名3、路由 //定义消费方DefaultConsumerdefaultConsumer=new{publicvoidhandleDelivery(StringconsumerTag,Envelope////,true,3、发送消费测4.4.4思1、Routing模式和Publish/subscibe有啥区工作模路由模式代案例根据用户设置去通知用户,设置接收 param1param2:交换机类型四种交换机类型:direct、fanout、topic、 通",null,"inform.sms",null,",null,完整代码importimport//队列名//创建一个与MQ的连factory.setVirtualHost("/");//rabbitmq默认虚拟机名称为“/”,虚拟机相当于一个独立的mq服//接//创建与交换机的通道,每个通道代表一个会1、交换机名2、交换机类型,fanout、topic、direct、channel.exchangeDeclare(EXCHANGE_TOPICS_INFORM, 队参数明细1、队列名2、是否持久3、是否独占此4、队列不用是5 ,true,false,false,null);channel.queueDeclare(QUEUE_INFORM_SMS,true,false,false,null);byte[]
//发送邮件消for(intStringmessage= informto//向交换机发送消息Stringexchange,StringroutingKey,BasicProperties参数1、交换机名称,不指令使用默认交换机名称Default2、routingKey(路由key),根据key名称将消息转发到具体的队列,这里填写队列名称表息将发到此
3、消息属4、消息内channel.basicPublish(EXCHANGE_TOPICS_INFORM, ",System.out.println("SendMessageis:'"+message+} 消for(intStringmessage="smsinformtouser"+i;channel.basicPublish(EXCHANGE_TOPICS_INFORM,"inform.sms",null,System.out.println("SendMessageis:'"+message+} for(intStringmessage="smsand informtouser"+i;channel.basicPublish(EXCHANGE_TOPICS_INFORM,"inform.sms. ",null,System.out.println("SendMessageis:'"+message+}}catch(IOException{}catch(TimeoutException{中间以“.”分隔 队 交换//绑定sms通知测思使用Routing模式也可以实现本案例,共设置三个routingkey,分别 、sms、 队列绑 all,sms队列绑定sms和all,这样就可以实现上边案例的功能,实现过程比topics复杂Headerheader模式与routing不同的地方在于,header模式取消rouingkey,使用header中的keyvalue(键值对)匹配队列。案例根据用户设置去通知用户,设置接收 代码生产通知headers.put("inform_type",headers.put("inform_type"," ");//匹通知消费者绑定的 "sms");//匹配sms通知消费者绑定的 通channel.basicPublish(EXCHANGE_HEADERS_INFORM,"",properties.build(),发送邮件消费channel.exchangeDeclare(EXCHANGE_HEADERS_INFORM,channel.exchangeDeclare(EXCHANGE_HEADERS_INFORM,//交换机和队列绑,true,RPC即客户端调用服务端的方法,使用MQ可以实现RPC的异步调用,基于Direct交换机实现,流程如下2、服务端RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结 Spring整
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Jackrabbit以MongoDB为底层存储系统架构的设计与应用
- 我国农村环境污染治理法律问题的现状及完善建议
- 烟囱电缆施工方案
- 井架加工合同范例
- 2025届高考政治二轮复习时事热点专题27多措并举推动2024年国资国企改革走向纵深练习含解析
- 2025年全自动精密贴片机合作协议书
- 出售内蒙平房合同范本
- 买房中介返现合同范例
- 中介贷款协议合同范例
- 加油船出租合同范本
- 第13课《 卖油翁 》课件统编版2024-2025七年级语文下册
- 2025年江苏省职业院校技能大赛中职组(新型电力系统运行与维护)参考试题库资料及答案
- 2025年黑龙江商业职业学院单招职业技能测试题库带答案
- 下肢外骨骼康复机器人
- 新建铁路专用线工程可行性研究报告
- 【地理】自然环境课件-2024-2025学年七年级地理下学期(人教版2024)
- 北京大兴区公开招考社区服务站专职工作者高频重点提升(共500题)附带答案详解
- 2024年中国作家协会所属单位招聘考试真题
- 2025年贵州贵阳市贵安新区产业发展控股集团有限公司招聘笔试参考题库附带答案详解
- 梁昆淼_数学物理方法第7章
- 强力还原剂安全技术说明书
评论
0/150
提交评论