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

网站的管理在线包装设计软件

网站的管理,在线包装设计软件,网络流量统计工具,文章修改网站一、简介 在rabbitMQ中常用的交换机有三种#xff0c;直连交换机、广播交换机、主题交换机#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可#xff1b; 主题交换机最大的特…一、简介 在rabbitMQ中常用的交换机有三种直连交换机、广播交换机、主题交换机 直连交换机中队列与交换机需要约定好routingKey去进行绑定 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可 主题交换机最大的特点可以通过*和#去匹配队列 而死信队列其实就是平常的队列的一种通常我会使用直连交换机来作为死信队列所以说死信队列其实就是我们在处理业务中慢慢衍生出来的一个名词、一种方案它和普通的队列是一样的。 二、使用场景 我们知道在使用队列时有几种应答模式,比如自动应答auto、手动应答manual等而在使用自动应答时无论消息是否成功消费达到重试次数后就会自动的把此消息给删除掉了当然我们是不想把没有消费成功的消息给删除掉的。而开启手动应答时配置的重试机制会失效 当有消费失败的消息时 会进入死循环。 那么为了解决此场景就引入了死信队列。当有不能正常消费的消息时 就把此消息给打到死信队列中然后再根据实际情况去处理此信息。 关于自动应答和手动应答可参考这篇博客  rabbitMQ手动应答与自动应答_骑着蜗牛打天下的博客-CSDN博客 在 RabbitMQ 中充当主角的就是消息在不同场景下消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式这些场景包括 1. 消息被拒绝访问即 RabbitMQ返回 basicNack 的信号时。 或者拒绝basicReject 2. 消费者发生异常超过重试次数 。 3. 消息的 TTL 过期时。 4. 消息队列达到最大长度。 三、代码实现 父pom文件 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.1/version !-- version2.2.5.RELEASE/version--relativePath/ !-- lookup parent from repository --/parentgroupIdcom.chensir/groupIdartifactIdspring-boot-rabbitmq/artifactIdversion0.0.1-SNAPSHOT/versionnamespring-boot-rabbitmq/namepropertiesjava.version8/java.versionhutool.version5.8.3/hutool.versionlombok.version1.18.24/lombok.version/propertiesdescriptionspring-boot-rabbitmq/descriptionpackagingpom/packagingmodulesmoduledirect-exchange/modulemodulefanout-exchange/modulemoduletopic-exchange/modulemodulegame-exchange/modulemoduledead-letter-queue/modulemoduledelay-queue/modulemoduledelay-queue2/module/modulesdependencyManagementdependenciesdependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion${hutool.version}/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion${lombok.version}/version/dependency/dependencies/dependencyManagement/projectpom文件 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.chensir/groupIdartifactIdspring-boot-rabbitmq/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIddead-letter-queue/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.springframework.amqp/groupIdartifactIdspring-rabbit-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project配置文件 server.port8084 #host spring.rabbitmq.host121.40.100.66 #默认5672 spring.rabbitmq.port5672 #用户名 spring.rabbitmq.usernameguest #密码 spring.rabbitmq.passwordguest #连接到代理时用的虚拟主机 spring.rabbitmq.virtual-host/ #每个消费者每次可最大处理的nack消息数量 spring.rabbitmq.listener.simple.prefetch1 #表示消息确认方式其有三种配置方式分别是none、manual(手动)和auto(自动)默认auto spring.rabbitmq.listener.simple.acknowledge-modeauto #监听重试是否可用 spring.rabbitmq.listener.simple.retry.enabledtrue #最大重试次数 spring.rabbitmq.listener.simple.retry.max-attempts5 #最大重试时间间隔 spring.rabbitmq.listener.simple.retry.max-interval3000ms #第一次和第二次尝试传递消息的时间间隔 spring.rabbitmq.listener.simple.retry.initial-interval1000ms #应用于上一重试间隔的乘数 spring.rabbitmq.listener.simple.retry.multiplier2 #决定被拒绝的消息是否重新入队默认是true与参数acknowledge-mode有关系 spring.rabbitmq.listener.simple.default-requeue-rejectedfalseconfig 正常队列config package com.chensir.config;import org.springframework.amqp.core.*; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class RabbitConfig {Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}Beanpublic DirectExchange directExchange(){return new DirectExchange(DirectExchange,true,false);}Beanpublic Queue directQueueLong(){return QueueBuilder.durable(DirectQueue).deadLetterExchange(DeadLetterExchange).deadLetterRoutingKey(dead)//20s还没消费就打到死信队列中.ttl(20000)//当队列中长度有500个消息,也打入死信队列.maxLength(500).build();}Beanpublic Binding binding(){return BindingBuilder.bind(directQueueLong()).to(directExchange()).with(direct123);} } 死信队列config package com.chensir.config;import org.springframework.amqp.core.*; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** 死信队列 一般由运维在rebbitMQ服务创建交换机和队列 不需要代码配置*/ //Configuration public class DeadLetterConfig {Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}Beanpublic DirectExchange directExchange() {DirectExchange directExchange new DirectExchange(DeadLetterExchange);return directExchange;}Beanpublic Queue queue() {Queue deadLetterQueue QueueBuilder.durable(DeadLetterQueue).build();return deadLetterQueue;}Beanpublic Binding binding() {Binding binding BindingBuilder.bind(queue()).to(directExchange()).with(dead);return binding;}}生产者 package com.chensir.provider;import cn.hutool.json.JSONUtil; import com.chensir.model.OrderIngOk; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Component;import javax.annotation.Resource;Component public class DirectProvider {Resourceprivate RabbitTemplate rabbitTemplate;public void send(){// 死信队列 // rabbitTemplate.convertAndSend(DeadLetterExchange, dead,123);for (int i1;i7;i){OrderIngOk orderIngOk new OrderIngOk();orderIngOk.setOrderNo(202308289687-i);orderIngOk.setId(i);orderIngOk.setUserName(倪海杉); // String s JSONUtil.toJsonStr(orderIngOk);rabbitTemplate.convertAndSend(DirectExchange, direct123,orderIngOk);}}}消费者 正常队列消费者 package com.chensir.consumer;import cn.hutool.json.JSONUtil; import com.chensir.model.OrderIngOk; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;import java.io.IOException;Component public class DirectConsumer {RabbitHandlerRabbitListener(queues DirectQueue )public void process(OrderIngOk orderIngOk) throws IOException {try {// 处理业务开始if(orderIngOk.getId().equals(5)){int a 0;int b 2/a;}System.out.println(接受到消息,并正常处理结束 JSONUtil.toJsonStr(orderIngOk));} catch (Exception ex){System.out.println(ex.getMessage());System.out.println(接受到消息,发生异常 JSONUtil.toJsonStr(orderIngOk));//自动应答 当消费者成功消费消息时会自动把消息删除,而没有成功消费消息时需要给重试机制抛出个异常 重试机制才会开启重试throw ex;//手动模式//channel.basicReject(deliveryTag,true);//channel.basicNack(deliveryTag,false,true);}} } 死信队列消费者 package com.chensir.consumer;import com.chensir.model.OrderIngOk; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;Component public class DeadConsumer {RabbitHandlerRabbitListener(queues DeadLetterQueue)public void process(OrderIngOk orderIngOk) {System.out.println(这条信息在运行时发生了未知的异常此信息被打到了死信队列,被死信队列消费者消费成功orderIngOk);} }结果 接受到消息,并正常处理结束{id:1,OrderNo:202308289687-1,userName:倪海杉} 接受到消息,并正常处理结束{id:2,OrderNo:202308289687-2,userName:倪海杉} 接受到消息,并正常处理结束{id:3,OrderNo:202308289687-3,userName:倪海杉} 接受到消息,并正常处理结束{id:4,OrderNo:202308289687-4,userName:倪海杉} / by zero 接受到消息,发生异常{id:5,OrderNo:202308289687-5,userName:倪海杉} / by zero 接受到消息,发生异常{id:5,OrderNo:202308289687-5,userName:倪海杉} / by zero 接受到消息,发生异常{id:5,OrderNo:202308289687-5,userName:倪海杉} / by zero 接受到消息,发生异常{id:5,OrderNo:202308289687-5,userName:倪海杉} / by zero 接受到消息,发生异常{id:5,OrderNo:202308289687-5,userName:倪海杉} 2023-08-28 16:45:39.848 WARN 24432 --- [ntContainer#1-1] o.s.a.r.r.RejectAndDontRequeueRecoverer : Retries exhausted for message (Body:[B1a6e663a(byte[58]) MessageProperties [headers{__TypeId__com.chensir.model.OrderIngOk}, contentTypeapplication/json, contentEncodingUTF-8, contentLength0, receivedDeliveryModePERSISTENT, priority0, redeliveredfalse, receivedExchangeDirectExchange, receivedRoutingKeydirect123, deliveryTag5, consumerTagamq.ctag-f9Up1UES-F3rDvb-AK16xw, consumerQueueDirectQueue])这条信息在运行时发生了未知的异常此信息被打到了死信队列,被死信队列消费者消费成功OrderIngOk(id5, OrderNo202308289687-5, userName倪海杉) 接受到消息,并正常处理结束{id:6,OrderNo:202308289687-6,userName:倪海杉}
http://www.sadfv.cn/news/56004/

相关文章:

  • 温州市城市建设档案馆网站做三网站
  • 网站建设开发图片wordpress设定主页
  • 茂名专业做网站公司网络教育平台登录入口
  • 大淘客做网站自己建设一个网站需要多少钱
  • 有没有电脑做兼职的网站吗重庆旅游网站制作公司
  • 安徽网站建设价格工作室注册条件
  • 做外贸网站可以收付款吗高端品牌网站建设的目的
  • 易语言做钓鱼网站国家企业信用公示信息系统官网
  • 网站设计精美案例做网站免费
  • 购物类网站的设计特点湖南门户网站建设
  • 忻州市建设厅网站首页网站运营成本预算
  • 兰州网站建设|兰州网站制作|兰州网站设计公司|兰州网络公司搜索优化是什么意思
  • 成都市做网站静态网站代做
  • 怎样找网站做蔬菜线上的网站
  • 洛阳网站建设哪家好数字短链接生成
  • dede手机网站模板购物网站页面设计思路
  • 策划案需要给做网站吗dw做网站怎么连接gif图片
  • 绍兴手机网站建设网站内页
  • dedecms做门户网站开发app需要多少钱?
  • 太原网站建设总部在哪wordpress主题显示不完整
  • 有男女做暖暖的视频网站ps网页素材
  • 有做网站的吗 优帮云面备案网站建设
  • 软件发布网站源码好的网站设计机构
  • 有哪些做问卷调查的网站好天门做网站
  • 如何优化网站tkddw和sql做网站
  • 东莞建站公司运转全网天下有 名电子商务专业怎么样
  • 微网站免费搭建平台wordpress顺序
  • 网站怎么经营网站建设哪家公司便宜
  • 网站优化软件方案网站ftp查询
  • 如何做个网站推广自己产品在线设计平台有什么用