当前位置: 首页 > news >正文

郑州网站推广排名公司网站推广怎么推

郑州网站推广排名公司,网站推广怎么推,wordpress自定义404页面,中国企业商铺网一、消费者消息确认是什么? 在这种机制下,消费者在接收到消息后,需要向 RabbitMQ 发送确认信息,告知 RabbitMQ 已经接收到该消息,并已经处理完毕。如果 RabbitMQ 没有接收到确认信息,则会将该消息重新加入…

一、消费者消息确认是什么?

在这种机制下,消费者在接收到消息后,需要向 RabbitMQ 发送确认信息,告知 RabbitMQ 已经接收到该消息,并已经处理完毕。如果 RabbitMQ 没有接收到确认信息,则会将该消息重新加入队列,等待其他消费者继续处理。

消费者消息确认机制能够保证消息不会因为消费者宕机或其他原因而丢失,从而保证了消息的可靠性和稳定性。

RabbitMQ 支持两种消费者消息确认机制:自动确认和手动确认。在自动确认模式下,消费者在接收到消息后,RabbitMQ 会自动将该消息标记为已经确认。在手动确认模式下,消费者需要向 RabbitMQ 显式地发送确认信息,才能完成消息的确认。

二、代码实现

1.修改application.yml 配置

spring:rabbitmq:listener:simple:# RabbitMQ开启手动确认acknowledge-mode: manual

而SpringAMQP则允许配置三种确认模式:

  1. manual:手动ack,需要在业务代码结束后,调用api发送ack。
  2. auto:自动ack,由spring监测listener代码是否出现异常,没有异常则返回ack;抛出异常则返回nack
  3. none:关闭ack,MQ假定消费者获取消息后会成功处理,因此消息投递后立即被删除

2.消费者确认

生产者发送一笔需要消费的订单到Direct Exchange直连交换机

@GetMapping("/sendDirectMessage")@ApiOperation(value = "sendDirectMessage")@ApiOperationSupport(order = 1)public String sendDirectMessage(@RequestParam String orderNo){//设置消息唯一IDString uniqueId = "MQ"+ DateUtils.dateTimeNow("yyyyMMddHHmmss")+ RandomUtil.randomNumbers(4);CorrelationData correlationData = new CorrelationData(uniqueId);log.info("------生产者发送消息,消息唯一id {},订单编号 {}-------",uniqueId,orderNo);rabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting",orderNo,correlationData);return "ok";}

下面是消费者的处理逻辑
这里的消息序号是系统自动生成的,还需要注意的是,在手动确认模式下,如果消费者在处理消息时发生了异常或错误的时候

需要确保将该消息重新加入队列或者删除队列之后将该信息保存至数据库中记录下来,否则该消息将被认为已经成功处理并确认。因此,在编写消费者代码时,需要谨慎处理异常情况,避免因为异常而导致消息丢失或重复处理等问题。

/*** 消费者,用于消费队列信息*/
@Component
@Slf4j
public class DirectConsumer {@ResourceRedisService redisService;@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueuepublic void process(Message message, Channel channel) {// 消息序号long deliveryTag = message.getMessageProperties().getDeliveryTag();//取出消息唯一标识String messageId = message.getMessageProperties().getHeader("spring_returned_message_correlation");// 取出订单编码String orderNo = new String(message.getBody(), StandardCharsets.UTF_8);log.info("------消费者收到消息,消息唯一id {},订单编号 {}-------",messageId,orderNo);try {//消费者在消费消息之前,先去redis中查看消息状态是否已被消费if (redisService.setCacheMapIfAbsent("rabbit-tag", messageId, Boolean.FALSE)){//删除过期订单.......//消费完消息后,设置key的值为trueredisService.setCacheMapValue("rabbit-tag", messageId, Boolean.TRUE);channel.basicAck(deliveryTag,false);log.info("------订单处理完毕,订单编号 {}--------", orderNo);}else {//如果从redis中获取消息的value是TRUE,表示已消费,直接发送确认信号,避免重复消费if (Boolean.TRUE.equals(redisService.getCacheMapValue("rabbit-tag",messageId))) {/*** TODO 手动确认消息* tag:消息序号* multiple:消息的标识,是否确认多条,false只确认当前一个消息收到,true确认所有consumer获得的消息(成功消费,消息从队列中删除*/channel.basicAck(deliveryTag, false);log.info("--------订单已经被消费过了,订单编号 {}-------", orderNo);}}} catch (Exception e) {e.printStackTrace();try {/*** TODO 消费者消费消息异常,手动否认信息,将消息退回到队列中* tag:消息序号* multiple:消息的标识,是否确认多条,false只确认当前一个消息收到,true确认所有consumer获得的消息(成功消费,消息从队列中删除* requeue:是否要退回到队列*/channel.basicNack(deliveryTag, true, false);redisService.setCacheMapValue("rabbit-tag", messageId, Boolean.FALSE);log.error("------------订单消费失败,已从队列删除.订单编号 {}, 原因 {}--------",orderNo, e.getMessage());} catch (IOException ex) {ex.printStackTrace();}}log.info("------消费者处理完毕-------");}
}
http://www.yayakq.cn/news/282705/

相关文章:

  • 不是网站开发语言的是浙江建设职业技术学院
  • 广州网站建设 八爪鱼申请网站建设经费
  • 在上海做兼职在哪个网站好wordpress is home
  • 什么是门户类型的网站高清素材视频去哪里找
  • php网站代做无锡网站设计系统
  • 江门网站建设junke100制作图片的软件推荐
  • 2022年国际新闻除了seo还可以做哪些推广呢
  • 做网络推广的网站赣州小程序推荐
  • 怎么做有数据库的网站哪种网站语言最好
  • 企业为何选择网站推广外包?深圳龙华新区网站建设
  • 百度怎么建设网站游乐园网站建设
  • 企业网站模板下载尽在网站排名优化推广厦门
  • h5响应式网站做动画常见的软件开发工具
  • 芜湖网站建设芜湖中国林业建设协会网站
  • 南京seo全网营销成都网站建设优化推
  • 帝国cms做微网站蓝科企业网站系统
  • 怀化网站设计流行的wordpress主题
  • 物流网站后台wordpress喜欢
  • 自己建网站步骤图标设计免费 logo
  • 郑州网站建设需要多少钱php做企业网站管理系统
  • 网站设置不可粘贴临沂市平邑县建设局网站
  • 福州做网站的公司多少钱厦门网站建设哪家公司好
  • 什么是网站开发设计与实现微信营销案例100例
  • php做p2p网站源码系统开发软件
  • 网站分享wordpress和emlog
  • 新手如何做企业网站网站开发网站维护这行业待遇怎么样
  • 点击网站宿迁建设企业网站
  • 国家建设工程信息网站php语言做的大网站
  • 金融机构网站建设费用搭建网站需要什么工具
  • 网站怎么做的支付asp做的网站如何更新