株洲专业做网站设计的,如何在相关网站免费做宣传广告,php建站模板,嵌入式开发工程师解决办法#xff1a;
1、做好消息确认机制#xff08;pulisher、consumer[手动ACK]#xff09; 2、每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍
消息确认机制#xff1a;
生产者确认模式#xff1a;确认消息是否发送到broker#xff0c;失败…解决办法
1、做好消息确认机制pulisher、consumer[手动ACK] 2、每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍
消息确认机制
生产者确认模式确认消息是否发送到broker失败原因是什么。配置类PostConstruct方法里调用setConfirmCallback()方法参数是Lambda表达式生产者退回模式确认消息是否发送到队列。配置类PostConstruct方法里调用setReturnCallback()方法参数是Lambda表达式消费者ack机制消费者方法的Channel参数、Message参数、消息实体类参数。一定要手动ack消费成功才移除消息。 /*** 定制RabbitTemplate* 1、服务器收到消息就回调* 1、spring.rabbitmq.publisher-confirmstrue* 2、设置确认回调ConfirmCallback* 2、消息正确抵达队列进行回调* 1、 spring.rabbitmq.publisher-returnstrue* spring.rabbitmq.template.mandatorytrue* 2、设置确认回调ReturnCallback** 3、消费端确认保证每个消息被正确消费此时才可以broker删除这个消息。* spring.rabbitmq.listener.simple.acknowledge-modemanual 手动签收* 1、默认是自动确认的只要消息接收到客户端会自动确认服务端就会移除这个消息* 问题* 我们收到很多消息自动回复给服务器ack只有一个消息处理成功宕机了。就会发生消息丢失* 消费者手动确认模式。只要我们没有明确告诉MQ货物被签收。没有Ack* 消息就一直是unacked状态。即使Consumer宕机。消息不会丢失会重新变为Ready下一次有新的Consumer连接进来就发给他* 2、如何签收:* channel.basicAck(deliveryTag,false);签收业务成功完成就应该签收* channel.basicNack(deliveryTag,false,true);拒签业务失败拒签*/
// PostConstruct //MyRabbitConfig对象创建完成以后执行这个方法public void initRabbitTemplate(){//设置确认回调rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {/**** 1、只要消息抵达Broker就acktrue* param correlationData 当前消息的唯一关联数据这个是消息的唯一id* param ack 消息是否成功收到* param cause 失败的原因*/Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {/*** 1、做好消息确认机制pulisherconsumer【手动ack】* 2、每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍*///服务器收到了//修改消息的状态System.out.println(confirm...correlationData[correlationData]ack[ack]cause[cause]);}});//设置消息抵达队列的确认回调rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {/*** 只要消息没有投递给指定的队列就触发这个失败回调* param message 投递失败的消息详细信息* param replyCode 回复的状态码* param replyText 回复的文本内容* param exchange 当时这个消息发给哪个交换机* param routingKey 当时这个消息用哪个路由键*/Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {//报错误了。修改数据库当前消息的状态-错误。System.out.println(Fail Message[message]replyCode[replyCode]replyText[replyText]exchange[exchange]routingKey[routingKey]);}});}