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

公司宣传资料模板seo推广seo技术培训

公司宣传资料模板,seo推广seo技术培训,网络舆情监测与研判考试重点,亚马逊 怎么做国外网站rabbitMQ在发送消息时,会出现交换机不存在(交换机名字写错等消息),这种情况如何会退给生产者重新处理?【交换机层】 生产者发送消息时,消息未送达到指定的队列,如何消息回退? 核心&…

rabbitMQ在发送消息时,会出现交换机不存在(交换机名字写错等消息),这种情况如何会退给生产者重新处理?【交换机层】
生产者发送消息时,消息未送达到指定的队列,如何消息回退?

核心:对类RabbitTemplate.ConfirmCallback 和RabbitTemplate.ReturnCallback的重写。

RabbitTemplate.ConfirmCallback:交换机在收到消息或者没收到消息时会被触发
RabbitTemplate.ReturnCallback:消息进入交换机,不能达到指定目的地时被出发。

开启交换机确认
开启消息不可达回退

配置文件不开启 这两项

spring:rabbitmq:
#    交换机进行确认消息publisher-confirm-type: correlated
#   交换机不可以路由消息时 消息回退publisher-returns: true
配置类声明
package com.esint.configs;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 发布确认**/
@Configuration
public class ConfirmConfig {//交换机public static final String CONFIRM_EXCHANGE = "confirm.exchange";//队列public static final String CONFIRM_QUEUE = "confirm.queue";//routing-keypublic static final String CONFIRM_ROUTING_KEY = "key1";//声明 交换机@Bean("confirmExchange")public DirectExchange confirmExchange(){return new DirectExchange(CONFIRM_EXCHANGE);}//声明 队列@Bean("confrimQueue")public Queue confrimQueue(){return QueueBuilder.durable(CONFIRM_QUEUE).build();}//绑定@Beanpublic Binding queueBindingExchange(@Qualifier("confrimQueue") Queue confrimQueue,@Qualifier("confirmExchange") DirectExchange confirmExchange){return  BindingBuilder.bind(confrimQueue).to(confirmExchange).with(CONFIRM_ROUTING_KEY);}
}

消费者:

package com.esint.controller;import com.esint.configs.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
@RequestMapping("/confirm")
public class ProducerController {@Autowiredprivate RabbitTemplate rabbitTemplate;//发消息@GetMapping("/sendMessage/{message}")public void sendMessage(@PathVariable String message){//普通发送模式 无是否发送成功回调CorrelationData correlationData = new CorrelationData("101");rabbitTemplate.convertAndSend(ConfirmConfig.CONFIRM_EXCHANGE,ConfirmConfig.CONFIRM_ROUTING_KEY+"123",message);log.info("发送消息为:{}",message);}}

消费者:

package com.esint.consumer;import com.esint.configs.ConfirmConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class Consumer {@RabbitListener(queues = ConfirmConfig.CONFIRM_QUEUE)public void receiveConfrimMessage(Message message){log.info("接收到的消息为:" + new String(message.getBody()));}
}
核心修改的重写的类:
package com.esint.consumer;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Slf4j
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnCallback{/***  注入:本类为实现了RabbitTemplate的内部类,所以在RabbitTemplate发送消息的时候不会调用到我们自己的实现,所以需要把这个类在注入到RabbitTemplate中。*/@Autowiredprivate RabbitTemplate rabbitTemplate;@PostConstructpublic void init(){rabbitTemplate.setConfirmCallback(this);rabbitTemplate.setReturnCallback(this);}/*** RabbitTemplate.ConfirmCallback  是在【生产者】发送【交换机】 交换机的感知回应调去方法** 交换机确认回调方法* 1.交换机接收消息成功*   参数1  correlationData保存了回调消息ID和相关信息*   参数2  交换机收到消息 true*   参数3  失败原因 为 null* 2.交换机接受消息失败*   参数1  correlationData保存了回调消息ID和相关信息*   参数2  交换机收到消息 false*   参数3  失败原因* @param correlationData  来源于生产者 所以在发消息时 需要带有这个属性* @param ack* @param cause*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {String id = correlationData != null ? correlationData.getId() : "";if(ack){log.info("交换机确认收到 ID:{}" ,id);}else {log.info("交换机未收到ID:{}的消息,原因:{}",id,cause);//这里实现发送交换机失败的存储逻辑}}/*** 回退消息* 在消息传递过程不可达目标地时 返还给生产者  只有消息不可达,才会执行这个方法** @param message* @param replyCode* @param replyText* @param exchange* @param routingKey*/@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.error("消息{} 被交换机{} 退回,原因:{} 路由:{}",new String(message.getBody()),exchange,replyText,routingKey);//这里实现发送消息不到达的逻辑 发送消息无法被逻辑 默认就会被交换机丢掉 这里重写后 可以在这里处理存储}
}

故意发送一个错误路由时:
在这里插入图片描述
消息能发出 交换机有确认 消息可以被回退

http://www.yayakq.cn/news/342555/

相关文章:

  • wordpress浏览时间插件下载排名优化上首页怎么做
  • 漫画网站模板免费自取ppt模板
  • 企业网站源码 thinkphp中小企业做网站贷款
  • 求个a站东莞 网站 建设 雕塑
  • 长汀网站建设小程序云开发的弊端
  • 宝安中心地铁站是几号线网站根目录怎么写
  • 创建网站的步骤是广州系统软件app开发公司
  • 网站建设河南公司wordpress站点进入时弹窗
  • 取名网站排名吉安高端网站建设公司
  • 网站开发行业竞争大吗阿克苏网站设计
  • 广州新塘做网站外网设计灵感网站
  • 网站怎么做实名认证重庆电子工程职业学院校园网
  • wordpress 建站教程 .pdf南京网络推广平台
  • 网站建设实训收获宁波seo网站推广
  • win8怎么建设网站中国国家培训网
  • 贵州网站制作公司揭阳网站制作案例
  • 门户网站建设公司哪家好wordpress 屏蔽 n
  • 2018做网站的视频基层建设是哪个网站的
  • 网站首眉怎么做2019做seo网站
  • 做软件网站wordpress 加入js
  • 做影视网站需要多少钱wordpress 调用form
  • 织梦小说网站模板下载地址Wordpress搜索结果页插件
  • 北京电商网站开发平台网站管理与建设教程
  • 柳州建网站网页毕业设计说明书
  • 广州市门户网站建设wordpress 时尚网
  • 网站维护工作的基本内容河北网站制作 网站开发
  • 苏州园区网站建设公司南部县房产网
  • 手机网站主页面文艺万网企业网站建设
  • 可以做淘宝推广的网站网页游戏排行榜2024
  • 江西中企动力做的网站做网站免费服务器哪家好