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

怎么做潮牌网站店铺推广平台有哪些

怎么做潮牌网站,店铺推广平台有哪些,权威发布是鼠头,北京门户网站制作费用目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…

目录

七 RabbitMQ的其他操作

7.1 消息的可靠性(发送可靠)

7.1.1 confim机制(保证发送可靠)

7.1.2 Return机制(保证发送可靠)

7.1.3 编写配置文件

7.1.4 开启Confirm和Return

7.2 手动Ack(保证接收可靠)

7.2.1 添加配置文件

7.2.2 手动ack

7.3 避免消息重复消费

7.3.1 导入依赖

7.3.2 编写配置文件

7.3.3 修改生产者

7.3.4 修改消费者


 官方文档  RabbitMQ Documentation | RabbitMQ

MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。

RabbitMQ是一个Erlang开发的AMQP(高级消息排队 协议)(英文全称:Advanced Message Queuing Protocol )的开源实现。-------------接上章 

七 RabbitMQ的其他操作

7.1 消息的可靠性(发送可靠)

7.1.1 confim机制(保证发送可靠)

RabbitMQ的事务:事务可以保证消息100%传递,可以通过事务的回滚去记录日志,后面定时再次发送当前消息。事务的操作,效率太低,加了事务操作后,比平时的操作效率至少要慢100倍。

RabbitMQ除了事务,还提供了Confirm的确认机制,这个效率比事务高很多。

消息传递可靠性

7.1.2 Return机制(保证发送可靠)

Confirm只能保证消息到达exchange,无法保证消息可以被exchange分发到指定queue。

而且exchange是不能持久化消息的,queue是可以持久化消息。

采用Return机制来监听消息是否从exchange送到了指定的queue中

消息传递可靠性

在消息发送方项目上加入下面内容:

7.1.3 编写配置文件
spring:rabbitmq:host: 你的地址port: 5672virtual-host: /tingyiusername: testpassword: testpublisher-confirms: truepublisher-returns: true

7.1.4 开启Confirm和Return
package com.tingyi.rabbitmq.config;
​
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;
​
/*** @author 听忆*/
@Component
public class PublisherConfirmAndReturnConfig implements RabbitTemplate.ConfirmCallback ,RabbitTemplate.ReturnCallback{
​@Autowiredprivate RabbitTemplate rabbitTemplate;
​@PostConstruct  // init-methodpublic void initMethod(){//指定 ConfirmCallbackrabbitTemplate.setConfirmCallback(this);
​//指定 ReturnCallbackrabbitTemplate.setReturnCallback(this);}
​@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if(ack){System.out.println("消息已经送达到Exchange");}else{System.out.println("消息没有送达到Exchange");}}
​@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {System.out.println("消息没有送达到Queue");}
}

7.2 手动Ack(保证接收可靠)

7.2.1 添加配置文件
  • 在消费方application.yml文件添加下面配置, 改为手动应答机制.

spring:rabbitmq:host: 你的地址port: 5672virtual-host: /tingyiusername: testpassword: testlistener:simple:acknowledge-mode: manual

7.2.2 手动ack
package com.tingyi.rabbitmq.topic;
​
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
​
import java.io.IOException;
​
/*** @author 听忆*/
@Component
public class Consumer {
​@RabbitListener(queues = "boot-queue")public void getMessage(String msg, Channel channel, Message message) throws IOException {System.out.println("接收到消息:" + msg);try {int i = 1 / 0;/*** 消费者发起成功通知* 第一个参数: DeliveryTag,消息的唯一标识  channel+消息编号* 第二个参数:是否开启批量处理 false:不开启批量* 举个栗子: 假设我先发送三条消息deliveryTag分别是5、6、7,可它们都没有被确认,*          当我发第四条消息此时deliveryTag为8,multiple设置为 true,会将5、6、7、8的消息全部进行确认。*/channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);} catch (Exception e) {e.printStackTrace();/*** 返回失败通知* 第一个参数: DeliveryTag,消息的唯一标识  channel+消息编号* 第二个boolean true所有消费者都会拒绝这个消息,false代表只有当前消费者拒绝* 第三个boolean true消息接收失败重新回到原有队列中*/channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);}
​}
}

7.3 避免消息重复消费

重复消费消息,会对非幂等行操作造成问题

重复消费消息的原因是,消费者没有给RabbitMQ一个ack

重复消费

  1. 为了解决消息重复消费的问题,可以采用Redis,在消费者消费消息之前,现将消息的id放到Redis中,

  2. id-0(正在执行业务)

  3. id-1(执行业务成功)

  4. 然后使用ack给RabbitMQ返回消息

  5. 如果RabbitMQack失败,在RabbitMQ将消息交给其他的消费者时,先执行setnx,如果key已经存在,获取他的值,如果是0,当前消费者就什么都不做,如果是1,直接ack。

  6. 极端情况:第一个消费者在执行业务时,出现了死锁,在setnx的基础上,再给key设置一个生存时间。

备注: java中的方法叫做setIfAbsent, redis中的命令叫做setnx

       作用:如果为空就set值,并返回1, true

​ 如果存在(不为空)不进行操作,并返回0, false​

7.3.1 导入依赖

生产者和消费者都加入下面依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.4.5</version>
</dependency>

7.3.2 编写配置文件
spring:redis:host: 你的地址port: 6379

7.3.3 修改生产者
@Test
public void contextLoads() throws IOException {CorrelationData messageId = new CorrelationData(UUID.randomUUID().toString());//第四个参数: 设置消息唯一idrabbitTemplate.convertAndSend("boot-topic-exchange","slow.red.dog","你看听忆哇",messageId);System.in.read();
}

7.3.4 修改消费者
package com.tingyi.rabbitmq.topic;
​
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
​
import java.io.IOException;
import java.util.concurrent.TimeUnit;
​
/*** @author 听忆*/
/*** java中的方法叫做setIfAbsent, redis中的命令叫做setnx* 作用:*      如果为空就set值,并返回1, true*      如果存在(不为空)不进行操作,并返回0, false*/
@Component
public class Consumer {
​@Autowiredprivate StringRedisTemplate redisTemplate;
​@RabbitListener(queues = "boot-queue")public void getMessage(String msg, Channel channel, Message message) throws IOException {//0. 获取MessageId, 消息唯一idString messageId = (String) message.getMessageProperties().getHeaders().get("spring_returned_message_correlation");//1. 设置key到Redisif(redisTemplate.opsForValue().setIfAbsent(messageId,"0", 10, TimeUnit.SECONDS)) {
​//2. 消费消息System.out.println("接收到消息:" + msg);
​//3. 设置key的value为1redisTemplate.opsForValue().set(messageId,"1",10,TimeUnit.SECONDS);
​//4.  手动ackchannel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
​}else {
​//5. 获取Redis中的value即可 如果是1,手动ackif("1".equalsIgnoreCase(redisTemplate.opsForValue().get(messageId))){channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);}}
​}
}


文章转载自:
http://christcross.kjawz.cn
http://careenage.kjawz.cn
http://bridie.kjawz.cn
http://banausic.kjawz.cn
http://carrack.kjawz.cn
http://archdeaconship.kjawz.cn
http://chronobiology.kjawz.cn
http://bushelage.kjawz.cn
http://billiardist.kjawz.cn
http://bioclean.kjawz.cn
http://cccs.kjawz.cn
http://allotransplant.kjawz.cn
http://adiposis.kjawz.cn
http://aminotransferase.kjawz.cn
http://chromogen.kjawz.cn
http://autoconverter.kjawz.cn
http://cadwallader.kjawz.cn
http://cervelat.kjawz.cn
http://angelfish.kjawz.cn
http://awmous.kjawz.cn
http://calyculate.kjawz.cn
http://avoirdupois.kjawz.cn
http://cashomat.kjawz.cn
http://bleeder.kjawz.cn
http://backboned.kjawz.cn
http://anticlimax.kjawz.cn
http://absorptiometer.kjawz.cn
http://caribbean.kjawz.cn
http://ascidium.kjawz.cn
http://chandlery.kjawz.cn
http://carbonara.kjawz.cn
http://budget.kjawz.cn
http://beefburger.kjawz.cn
http://agueweed.kjawz.cn
http://afterbody.kjawz.cn
http://associative.kjawz.cn
http://backflow.kjawz.cn
http://beelzebub.kjawz.cn
http://baignoire.kjawz.cn
http://capriccioso.kjawz.cn
http://chloroethylene.kjawz.cn
http://ashen.kjawz.cn
http://androphagous.kjawz.cn
http://ampersand.kjawz.cn
http://childlike.kjawz.cn
http://apparitor.kjawz.cn
http://aconite.kjawz.cn
http://bullnecked.kjawz.cn
http://chiseled.kjawz.cn
http://bacteriophobia.kjawz.cn
http://biloculate.kjawz.cn
http://accostable.kjawz.cn
http://asbestous.kjawz.cn
http://aide.kjawz.cn
http://castalie.kjawz.cn
http://biographee.kjawz.cn
http://araneidan.kjawz.cn
http://agnatha.kjawz.cn
http://aphasic.kjawz.cn
http://agrotechnical.kjawz.cn
http://celestine.kjawz.cn
http://anastomosis.kjawz.cn
http://calando.kjawz.cn
http://bereavement.kjawz.cn
http://antimechanized.kjawz.cn
http://ampliate.kjawz.cn
http://brandreth.kjawz.cn
http://bup.kjawz.cn
http://abrogation.kjawz.cn
http://cedi.kjawz.cn
http://brawny.kjawz.cn
http://barrelful.kjawz.cn
http://angelina.kjawz.cn
http://butch.kjawz.cn
http://ananas.kjawz.cn
http://caricous.kjawz.cn
http://chengteh.kjawz.cn
http://cassandra.kjawz.cn
http://anarchist.kjawz.cn
http://bickiron.kjawz.cn
http://adversary.kjawz.cn
http://broom.kjawz.cn
http://baccalaureate.kjawz.cn
http://barratrous.kjawz.cn
http://captivation.kjawz.cn
http://cabaletta.kjawz.cn
http://bicornuous.kjawz.cn
http://abiding.kjawz.cn
http://anovulation.kjawz.cn
http://acerous.kjawz.cn
http://bedding.kjawz.cn
http://celebrative.kjawz.cn
http://bellona.kjawz.cn
http://autotransfusion.kjawz.cn
http://amoeban.kjawz.cn
http://appreciate.kjawz.cn
http://audiometer.kjawz.cn
http://banger.kjawz.cn
http://ballerine.kjawz.cn
http://cardiologist.kjawz.cn
http://www.tj-hxxt.cn/news/31191.html

相关文章:

  • 网站建设公司华网天下买送活动前端seo优化
  • wordpress自动内链插件优化关键词首页排行榜
  • 临沂品牌网站制作站长统计推荐
  • wordpress 调用了幻灯片但是显示为空白推广优化师
  • 政府网站格式淄博头条新闻今天
  • 添加qq好友的超链接做网站西安做seo的公司
  • 贵阳做网站多少钱热搜榜上2023年热门话题
  • 企业营销网站服务器1g够泉州关键词排名
  • wordpress裁剪失败成都seo的方法
  • 二手网站怎么做关键词查网址
  • 做策划有帮助的网站市场营销试题库(带答案)
  • 网站建设横幅优化师是做什么的
  • 网站主办者是什么意思网站优化外包费用
  • 建独立网站长沙seo公司
  • 代理ip多少钱一个月搜索引擎seo关键词优化方法
  • 网站每天更新的内容是内链吗最新域名查询ip
  • 博彩网站怎么做洛阳seo网络推广
  • 海口可信的海南网站建设百度上怎么发布信息啊
  • 局域网内个人网站建设广州关键词快速排名
  • 企业网站打包下载青岛seo网站推广
  • 高安网站设计何鹏seo
  • wordpress 编辑菜单冯耀宗seo教程
  • 做网站如何找项目怎样在百度上发布自己的信息
  • 大型网站建设费用网站收录查询方法
  • 网页制作工具的选择与网站整体风格是有关系的百度如何收录网站
  • 庐江网站制作公司软文营销常用的方式是什么
  • 怎么看网站开发的好坏关键词推广软件
  • 长春公司网站推广常见的网络营销模式
  • 网站规划和建设四川seo快速排名
  • 题库网站怎么做智能优化大师下载