您好,欢迎访问一九零五行业门户网

rabbitmqjava教程(rabbitmq高级特性)

本文主要介绍rabbitmqjava教程(rabbitmq的高级特性),下面一起看看rabbitmqjava教程(rabbitmq的高级特性)相关资讯。
rabbitmq 1的高级应用。消息可靠性传递使用rabbitmq时,生产者要想知道消息是否成功传递到对应的交换机和队列,有两种方法可以控制消息传递的可靠性模式。
从上图中的整个消息传递过程来看,生产者 s消息在进入中间件时会先到达交换机,然后再从交换机转移到队列,分两步策略。那么消息的丢失就会发生在这两个阶段,rabbitmq为我们提供了这两部分可靠的新交付模式:
确认模式。返回模式。使用这两种回调模式来确保可靠的消息传递。
1.1.确认模式消息从生产者到交换机的传输将返回confirmcallback。您可以直接在rabbittemplate实例中设置确认逻辑。如果您使用xml配置,您需要打开publisher-confirms = 真实 在工厂里的配置,与publisher-confirm-typ:和yaml的配置直接相关。默认情况下,它是none,所以您需要手动打开它。
@ run with(spring junit 4 class runner . class)@ context configuration(locations = class path : spring-rabbit mq . xml )public class producer { @ autowired private rabbit template rabbit template;@test public void producer抛出interrupted exception { rabbit template . setconfirm callback(new rabbit template。confirm callback{ @ override public void confirm(correlation data correlation data,boolean b,string s){ system . out . println;如果(!b) {//消息重传system.out.println(s)等处理;}else { system . out . println( 交换机成功接收消息);} } });rabbit template . convertandsend( 默认_交换 , 默认队列 , hello world beordie );时间单位。秒.睡眠(5);}}上面的确认是由一个confirm函数执行的,该函数携带三个参数,第一个是配置相关信息,第二个表示交换机是否成功接收到报文,第三个参数是指报文没有成功接收的原因。
1.2.返回模式如果从交换机到消息队列的传递失败,将返回returncallback。打开回退模式publisher-returns = 真实 在出厂配置中设置交换机处理报文失败的模式(默认为false直接丢弃报文),并增加回退处理的逻辑。
@ run with(spring junit 4 class runner . class)@ context configuration(locations = class path : spring-rabbit mq . xml )公共类生产者{ @ autowired private rabbit template rabbit template;@test public void producer抛出interrupted exception { rabbit template . set mandatory(true);rabbittemplate . setreturncallback(新rabbit template。return callback{ @ override public void returned message(message message,int replycode,string reply text,string exchange,string routing key){//重传逻辑处理system . out . println(message . getbody 消息队列传递失败 );} });rabbit template . convertandsend( 默认_交换 , 默认_队列e , hello world beordie );时间单位。秒.睡眠(5);}}返回的消息携带五个参数,分别指消息对象、错误代码、错误消息、交换机和路由关键字。
1.3.确认机制在消费者抓取消息队列中的数据进行消费后会有一个确认机制对消息进行确认,防止抓取消息后由于消费不成功导致消息丢失。有三种方法可以确认:
自动确认:确认= 无
人工确认:确认= 手册
根据异常情况确认:acknowledge = 汽车与娱乐
自动确认是指消息一旦被消费者抓取,默认自动成功,消息从消息队列中删除。如果此时消费者的消费出现问题,会默认消息消费成功,但实际上并不成功,即当前消息丢失。默认情况是自动确认机制。
如果设置了手动确认模式,则需要回拨确认频道。普通消费信息后的基本并手动签收。如果在业务处理过程中出现异常,调用channel.basicnack重新发送消息。
首先需要配置队列绑定时的确认机制,设置为手动签到。
!-绑定队列-兔子:器-容器连接-工厂= 兔子工厂 自动声明= 真实 确认= 手册 兔子:听众。ref = 兔子消费者和消费者协会队列名称= 默认队列 //rabbit : listener-container生产者不需要改变,只需要改变消费者 的实现来自动为消息签名。如果业务正常执行,就会签收消息。如果业务出现错误,消息将被拒绝,消息将被重新传输或丢弃。
公共类使用者ack实现channelawaremessagelist { @ override public void on message(message message,channel)throws exception {//message unique id long tag = mes。sage.getmessageproperties。getdeliverytag;请尝试{ string msg = new string(message . getbody, utf-8和);channel.basicack(标签,真);system . out . println( 接收消息: 味精);} catch(异常e) {system。out . println( 收到的消息异常 );channel.basicnack(tag,true,true);e . printstacktrace;}}}涉及到三个简单的签到函数,一个是正确签到的basicack,一个是单次拒签的basicreject,第三个是批量拒签的basic ack。
basicack的第一个参数表示消息在通道中的唯一id,只针对当前通道;第二个参数表示是否批量同意。如果为false,它将只同意用当前id对消息进行签名,并将其从消息队列中删除。如果为真,此id之前的所有消息都将被同意签名。basicreject的第一个参数仍然指示消息的唯一id,第二个参数指示是否将消息发送回队列。false表示消息被直接丢弃,或者有死信队列要接收。true表示消息被发送回队列,所有操作只针对当前消息。basicnack比第二个多了一个参数,就是中间一个布尔值,表示是否批量进行。2.消费端限流增加了消息中间件在用户请求和db服务处理之间的隔离,使得所有突发流量都能被消息队列抵御,降低了服务器被冲走的可能性。让所有的请求都存储在队列中,消费者只需要匀速取出消息进行消费,这样可以保证运行效率,客户端不会因为后台的阻挡而得到正常的响应(当然是指一些不需要同步echo的任务)。
你只需要在消费者绑定消息队列的时候指定取消息的速率,需要使用手动登录,每次登录都会从队列中取下一条数据。
!-绑定队列-兔子:器-容器连接-工厂= 兔子工厂 自动声明= 真实 确认= 手册 预取= 1 兔子:听众ref = 兔子消费者和消费者协会队列名称= 默认队列 //rabbit : listener-container 3、消息过期时间消息队列提供队列中存储的消息的过期时间。分两个方向实现,一个是针对整个队列中的所有消息,即队列的到期时间,另一个是针对当前消息的到期时间,即针对单个消息单独设置。
设置队列的到期时间非常简单。您只需要在创建队列时指定到期时间,也可以通过控制台直接创建指定的到期时间。一旦队列过期,队列中所有未被使用的消息都将过期,队列也将过期。
rabbit : queue id = 默认队列 name = 默认队列 自动声明= 真实 rabbit : queue-arguments entry key = x-消息-ttl 价值= 10000英镑值类型= 整数 //rabbit : queue-arguments/rabbit : queue单个消息的失效时间需要在发送时单独指定,配置的附加信息在发送时指定,配置由配置类编写。
如果一个消息过期了,但此时它在队列中间,就不会被处理,只有在后面处理的时候才会判断它是否过期。
messagepostprocessor messagepostprocessor = new messagepostprocessor{ @ override public message postprocessmessage(message message)抛出amqpexception {//设置消息的过期时间。getmessageproperties。set expiration( 5000英镑);//返回消息;}};rabbit template . convertandsend( 交换与交易, 路线和路线, 味精 ,消息发布处理器);如果同时设置了消息的过期时间和队列的过期时间,那么最终的过期时间是由最短的时间决定的,也就是说,如果当前消息的过期时间没有到,但是整个队列的过期时间到了,那么队列中的所有消息都会自然过期,执行过期处理策略。
4.死信队列4.1。死信概念死信队列指的是死信交换机。当一个报文成为死信时,可以重新发送到另一个交换机进行处理,这个进行处理的交换机称为死信交换机。
在几种情况下,消息会变成死信。当队列的消息长度达到限制时,当消费者拒绝接收消息时,消息将不会被放回队列。队列有消息过期设置,未使用的消息有过期时间。送到消费者手中时,发现已经过期。创建队列时,可以指定相关信息,如死信开关和队列长度等。,然后一系列工作都不会由程序员操作,mq会自己完成配置好的事件响应。
rabbit : queue id = 默认队列 name = 默认队列 自动声明= 真实 rabbit : queue-arguments!-死信开关-输入键= x-死信交换 值类型= dlx _ exchane /!-路由输入键= x-死信路由键 值类型= dlx _路由 /!-队列到期时间-输入键= x-消息-ttl 价值= 10000英镑值类型= 整数 /!-队列长度-条目关键字= x-最大长度 值类型= 整数 价值= 10 //兔子: queue-arguments/兔子: queue 4.2、延迟队列延迟队列是指消息进入队列后不会立即消耗,而是在到达指定时间后才会消耗,也就是需要有一个时间判断条件。
事实上,消息队列并不提供延迟队列的实现,但是可以通过ttl死信队列来完成。建立了一个队列,它不会被任何使用者使用,所有传入的消息都将存储在其中。的过期时间,一旦队列过期,所有消息将被转移到绑定的死信队列。
然后特定的消费者消费死信队列中的消息,从而实现延迟排队的功能。
例如,可以通过下单的加班费实现取消订单的功能:
标签:
队列消息
了解更多rabbitmqjava教程(rabbitmq的高级特性)相关内容请关注本站点。
其它类似信息

推荐信息