RabbitMQ信息发送和接纳形式概览 (rabbit中文翻译)
一、发送信息的几种形式
1.1、自动替换机和routingKey----(团体不介绍经常使用)
经常使用自动的替换机exchange或routingKey。
图片
调用方法:
图片
1.2、经常使用指定routingKey的形式发送(自动的替换机)
经常使用自动的替换机,routingKey必需为quenue队列的称号。
调用方法:
图片
案例:
/***@Authoryangyalin*@Description测试发送信息(间接经常使用队列发送,经常使用自动的替换机)routingKey:即为对列的称号即可**/publicvoidtestSendMsg(Stringmessage){rabbitTemplate.convertAndSend(RabbitMQConvertConfig.TEST_QUEUE,message);}
1.3、指定替换机和routingKey的形式发送
经常使用指定的替换机,若绑定routingKey,必需经常使用指定的形式;若没有绑定,可设置为""。
调用方法:
图片
案例:
publicvoidsendDecreStockMessage(DecreStockFromRabbitdecreStockFromRabbit){CorrelationDatacorrelationData=newCorrelationData();correlationData.setId(decreStockFromRabbit.getMessageId());/***exchange:替换机routingKey:路由键message:信息体内容correlationData:信息惟一ID**/rabbitTemplate.convertAndSend(RabbitMQConvertConfig.ORDER_EXCHANGE,RabbitMQConvertConfig.ORDER_ROUTINGKEY,decreStockFromRabbit,correlationData);}或:rabbitTemplate.convertAndSend("test-exchange","",message);
![rabbit中文翻译](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
二、接纳信息的几种形式
2.1、自动替换机,提早创立好队列(TestDirectQueue)
/***性能形容:当生产同一个队列的时刻,可经过设置成性能则多劳,*信息轮询形式订阅*@MethodName:process11*@MethodParam:[testMessage]*@Return:void*@Author:yyalin*@CreateDate:2022/4/917:10*/@RabbitListener(queues="TestDirectQueue")//监听的队列称号TestDirectQueuepublicvoidprocess11(MaptestMessage)throwsInterruptedException{log.info("生产者收到信息222:"+testMessage.toString());Thread.sleep(200);}
2.2、自动替换机,智能创立队列(TEST_QUEUE2)
@RabbitListener(queuesToDeclare=@Queue(TopicExchangeConfig.TEST_QUEUE2))@RabbitHandlerpublicvoidreceiveTestMsg2(@PayloadStringstr)throwsException{log.info("开局接纳信息。。。。。");log.info("接纳到的信息:"+str);}
2.3、智能创立替换机和队列----(团体介绍)
智能创立且替换机和队列绑定,key可指定也可不指定(默以为队列称号)。
/******************打算二:经常使用注解的形式绑定队列在替换机上*******************/@RabbitListener(bindings=@QueueBinding(value=@Queue(name="directQueue"),exchange=@Exchange(name="directExchange",type=ExchangeTypes.DIRECT),key={"red","blue"}))//监听的队列称号TestDirectQueuepublicvoiddirectConsumer(Stringmessage){log.info("生产者收到direct信息555:"+message);}@RabbitListener(bindings=@QueueBinding(value=@Queue(name="topicQueue2"),exchange=@Exchange(name="topicExchange",type=ExchangeTypes.TOPIC,ignoreDeclarationExceptions="true"),key="#.new"))publicvoidtopicConsumer2(Stringmessage){log.info("生产者收到topic信息888:"+message);}
备注:ignoreDeclarationExceptions="true":即使性能产生了失误也不至于整个运行程序都启动失败的状况。
1、channel.basicQos(0,1,false):0示意对信息的大小有限度,1示意每次只准许生产一条,false示意该限度不作用于channel。
同时,咱们驳回手工ACK的形式,由于咱们性能文件性能了spring.rabbitmq.listener.simple.acknowledge-mode=manual:
2、channel.basicAck(deliveryTag,false):deliveryTag示意处置的信息条数(普通为1),从heaers中取,false示意不批量ack。
/***性能形容:生产端加上手动确认信息被接纳*@MethodName:process*@MethodParam:[message]*@Return:void*@Author:yyalin*@CreateDate:2022/4/1819:10*/@RabbitListener(queues="TestDirectQueue3")//监听的队列称号TestDirectQueuepublicvoidprocess(Stringmessage,Channelchannel)throwsIOException{log.info("DirectReceiver生产者收到信息1:"+message);longmsgId=1111L;//信息IDtry{//手动确认信息已生产channel.basicAck(msgId,false);}catch(IOExceptione){//把信息失败的信息从新放入到队列channel.basicNack(msgId,false,true);e.printStackTrace();}}
对于NodeJS如何操作消息队列RabbitMQ的分析
这篇文章主要介绍了关于对NodeJS如何操作消息队列RabbitMQ的分析,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下一. 什么是消息队列?消息(Message)是指在应用间传送的数据。 消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。 消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。 这样发布者和使用者都不用知道对方的存在。 二. 常用的消息队列有哪些?RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq。 甚至现在部分NoSQL也可做消息队列,如Redis。 三. 消息队列的使用场景?异步处理应用解耦流量削峰四. 使用案例上规模的公司都会有自己的日志分析系统,日志系统是怎么实现的呢?图解:用户在访问应用的时候,我们要记录下用户的操作记录和系统的异常日志,常规的做法是将系统产生的日志保存到服务器磁盘,在服务器中开启定时任务,定时将磁盘的日志信息传入mq中(生产者),也定时将mq中的消息取出并存到相应的数据库,如ElasticSearch或Hive中。 五. 如何安装RabbitMQ?上面的案例介绍了MQ的一个使用场景,我这里是用RabbitMQ举例,现实项目中可能用到的是Kafka。 首先安装brew(mac为例)/usr/bin/ruby -e $(curl -fsSL安装RabbitMQbrew install rabbitmq运行RabbitMQ进入到 /usr/local/Cellar/rabbitmq/3.7.7,执行sbin/rabbitmq-server启动插件进入到 /usr/local/Cellar/rabbitmq/3.7.7/sbin./rabbitmq-plugins enable rabbitmq_management登陆管理界面打开浏览器输入:,RabbitMQ默认端口六. Nodejs操作RabbitMQ 网上可以找到好几个相应的Node SDK,这里推荐amqplib1.生产者/** * 对RabbitMQ的封装 */let amqp = require(amqplib);class RabbitMQ { constructor() { = []; = 0; = ; = ([]); } sendQueueMsg(queueName, msg, errCallBack) { let self = this; (function (conn) { return (); }) (function (channel) { return (queueName)(function (ok) { return (queueName, new Buffer(msg), { persistent: true }); }) (function (data) { if (data) { errCallBack && errCallBack(success); (); } }) (function () { setTimeout(() => { if (channel) { (); } }, 500) }); }) (function () { let num = ++; if (num <= - 1) { = ([num]); } else { == 0; } }); }}2. 消费者/** * 对RabbitMQ的封装 */let amqp = require(amqplib);class RabbitMQ { constructor() { = ([]); } receiveQueueMsg(queueName, receiveCallBack, errCallBack) { let self = this; (function (conn) { return (); }) (function (channel) { return (queueName) (function (ok) { return (queueName, function (msg) { if (msg !== null) { let data = (); (msg); receiveCallBack && receiveCallBack(data); } }) (function () { setTimeout(() => { if (channel) { (); } }, 500) }); }) }) (function () { let num = ++; if (num <= - 1) { = ([num]); } else { = 0; = ([0]); } }); }3. 通过生产者向MQ发送一个消息,并创建队列let mq = new RabbitMQ();(testQueue, my first message, (error) => { (error)})执行之后,我们打开管理平台,发现RabbbitMQ已经接受到了一条消息:并且RabbbitMQ新增了一个队列testQueue4. 获取指定队列的消息let mq = new RabbitMQ();(testQueue,(msg) => { (msg)})// 输出结果:my first message此时打开RabbitMQ管理平台,消息数量已经变为0综上:我们简单讲述了消息队列及RabbitMQ相关的一些知识,以及我们如何通过nodejs来生产与消费消息。
消息队列(mq)是什么?
是生产者先将消息投递一个叫队列的容器中,然后再从这个容器中取出消息,最后再转发给消费者。
消息队列是 Microsoft 的消息处理技术,它在任何安装 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。
消息队列网络是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。
消息队列的类型介绍:
消息队列目前主要有两种类型:POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用。每个消息队列都有一个队列头,用结构struct msg_queue来描述。队列头中包含了该消息队列的大量信息。包括消息队列键值、用户ID、组ID、消息队列中消息数目等等。
消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。