一、先扔一张图

说明:本文涵盖了关于RabbitMQ很多方面的知识点, 如:

  1. 消息发送确认机制

  2. 消费确认机制

  3. 消息的重新投递

  4. 消费幂等性, 等等

这些都是围绕上面那张整体流程图展开的, 所以有必要先贴出来, 见图知意

二、实现思路

  1. 简略介绍163邮箱授权码的获取

  2. 编写发送邮件工具类

  3. 编写RabbitMQ配置文件

  4. 生产者发起调用

  5. 消费者发送邮件

  6. 定时任务定时拉取投递失败的消息, 重新投递

  7. 各种异常情况的测试验证

  8. 拓展: 使用动态代理实现消费端幂等性验证和消息确认(ack)

三、项目介绍

  1. springboot版本2.1.5.RELEASE, 旧版本可能有些配置属性不能使用, 需要以代码形式进行配置

  2. RabbitMQ版本3.7.15

  3. MailUtil: 发送邮件工具类

  4. RabbitConfig: rabbitmq相关配置

  5. TestServiceImpl: 生产者, 发送消息

  6. MailConsumer: 消费者, 消费消息, 发送邮件

  7. ResendMsg: 定时任务, 重新投递发送失败的消息

说明: 上面是核心代码, MsgLogService mapper xml等均未贴出, 完整代码可以参考我的GitHub, 欢迎fork, https://github.com/wangzaiplus/springboot/tree/wxw

四、代码实现

  1. 163邮箱授权码的获取, 如图:

该授权码就是配置文件spring.mail.password需要的密码

  1. pom

        <!--mq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!--mail--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>
  1. rabbitmq、邮箱配置

# rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# 开启confirms回调 P -> Exchange
spring.rabbitmq.publisher-confirms=true
# 开启returnedMessage回调 Exchange -> Queue
spring.rabbitmq.publisher-returns=true
# 设置手动确认(ack) Queue -> C
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.prefetch=100# mail
spring.mail.host=smtp.163.com
spring.mail.username=186****2249@163.com
spring.mail.password=***
spring.mail.from=186****2249@163.com
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

说明: password即授权码, usernamefrom要一致

  1. 表结构

CREATE TABLE `msg_log` (`msg_id` varchar(255) NOT NULL DEFAULT '' COMMENT '消息唯一标识',`msg` text COMMENT '消息体, json格式化',`exchange` varchar(255) NOT NULL DEFAULT '' COMMENT '交换机',`routing_key` varchar(255) NOT NULL DEFAULT '' COMMENT '路由键',`status` int(11) NOT NULL DEFAULT '0' COMMENT '状态: 0投递中 1投递成功 2投递失败 3已消费',`try_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数',`next_try_time` datetime DEFAULT NULL COMMENT '下一次重试时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`msg_id`),UNIQUE KEY `unq_msg_id` (`msg_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息投递日志';

说明: exchange routing_key字段是在定时任务重新投递消息时需要用到的

  1. MailUtil

@Component
@Slf4j
public class MailUtil {@Value("${spring.mail.from}")private String from;@Autowiredprivate JavaMailSender mailSender;/*** 发送简单邮件** @param mail*/public boolean send(Mail mail) {String to = mail.getTo();// 目标邮箱String title = mail.getTitle();// 邮件标题String content = mail.getContent();// 邮件正文SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from);message.setTo(to);message.setSubject(title);message.setText(content);try {mailSender.send(message);log.info("邮件发送成功");return true;} catch (MailException e) {log.error("邮件发送失败, to: {}, title: {}", to, title, e);return false;}}}
  1. RabbitConfig

@Configuration
@Slf4j
public class RabbitConfig {@Autowiredprivate CachingConnectionFactory connectionFactory;@Autowiredprivate MsgLogService msgLogService;@Beanpublic RabbitTemplate rabbitTemplate() {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(converter());// 消息是否成功发送到ExchangerabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (ack) {log.info("消息成功发送到Exchange");String msgId = correlationData.getId();msgLogService.updateStatus(msgId, Constant.MsgLogStatus.DELIVER_SUCCESS);} else {log.info("消息发送到Exchange失败, {}, cause: {}", correlationData, cause);}});// 触发setReturnCallback回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调rabbitTemplate.setMandatory(true);// 消息是否从Exchange路由到Queue, 注意: 这是一个失败回调, 只有消息从Exchange路由到Queue失败才会回调这个方法rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {log.info("消息从Exchange路由到Queue失败: exchange: {}, route: {}, replyCode: {}, replyText: {}, message: {}", exchange, routingKey, replyCode, replyText, message);});return rabbitTemplate;}@Beanpublic Jackson2JsonMessageConverter converter() {return new Jackson2JsonMessageConverter();}// 发送邮件public static final String MAIL_QUEUE_NAME = "mail.queue";public static final String MAIL_EXCHANGE_NAME = "mail.exchange";public static final String MAIL_ROUTING_KEY_NAME = "mail.routing.key";@Beanpublic Queue mailQueue() {return new Queue(MAIL_QUEUE_NAME, true);}@Beanpublic DirectExchange mailExchange() {return new DirectExchange(MAIL_EXCHANGE_NAME, true, false);}@Beanpublic Binding mailBinding() {return BindingBuilder.bind(mailQueue()).to(mailExchange()).with(MAIL_ROUTING_KEY_NAME);}}
  1. TestServiceImpl生产消息

@Service
public class TestServiceImpl implements TestService {@Autowiredprivate MsgLogMapper msgLogMapper;@Autowiredprivate RabbitTemplate rabbitTemplate;@Overridepublic ServerResponse send(Mail mail) {String msgId = RandomUtil.UUID32();mail.setMsgId(msgId);MsgLog msgLog = new MsgLog(msgId, mail, RabbitConfig.MAIL_EXCHANGE_NAME, RabbitConfig.MAIL_ROUTING_KEY_NAME);msgLogMapper.insert(msgLog);// 消息入库CorrelationData correlationData = new CorrelationData(msgId);rabbitTemplate.convertAndSend(RabbitConfig.MAIL_EXCHANGE_NAME, RabbitConfig.MAIL_ROUTING_KEY_NAME, MessageHelper.objToMsg(mail), correlationData);// 发送消息return ServerResponse.success(ResponseCode.MAIL_SEND_SUCCESS.getMsg());}}
  1. MailConsumer消费消息, 发送邮件

@Component
@Slf4j
public class MailConsumer {@Autowiredprivate MsgLogService msgLogService;@Autowiredprivate MailUtil mailUtil;@RabbitListener(queues = RabbitConfig.MAIL_QUEUE_NAME)public void consume(Message message, Channel channel) throws IOException {Mail mail = MessageHelper.msgToObj(message, Mail.class);log.info("收到消息: {}", mail.toString());String msgId = mail.getMsgId();MsgLog msgLog = msgLogService.selectByMsgId(msgId);if (null == msgLog || msgLog.getStatus().equals(Constant.MsgLogStatus.CONSUMED_SUCCESS)) {// 消费幂等性log.info("重复消费, msgId: {}", msgId);return;}MessageProperties properties = message.getMessageProperties();long tag = properties.getDeliveryTag();boolean success = mailUtil.send(mail);if (success) {msgLogService.updateStatus(msgId, Constant.MsgLogStatus.CONSUMED_SUCCESS);channel.basicAck(tag, false);// 消费确认} else {channel.basicNack(tag, false, true);}}}

说明: 其实就完成了3件事: 1.保证消费幂等性, 2.发送邮件, 3.更新消息状态, 手动ack

  1. ResendMsg定时任务重新投递发送失败的消息

@Component
@Slf4j
public class ResendMsg {@Autowiredprivate MsgLogService msgLogService;@Autowiredprivate RabbitTemplate rabbitTemplate;// 最大投递次数private static final int MAX_TRY_COUNT = 3;/*** 每30s拉取投递失败的消息, 重新投递*/@Scheduled(cron = "0/30 * * * * ?")public void resend() {log.info("开始执行定时任务(重新投递消息)");List<MsgLog> msgLogs = msgLogService.selectTimeoutMsg();msgLogs.forEach(msgLog -> {String msgId = msgLog.getMsgId();if (msgLog.getTryCount() >= MAX_TRY_COUNT) {msgLogService.updateStatus(msgId, Constant.MsgLogStatus.DELIVER_FAIL);log.info("超过最大重试次数, 消息投递失败, msgId: {}", msgId);} else {msgLogService.updateTryCount(msgId, msgLog.getNextTryTime());// 投递次数+1CorrelationData correlationData = new CorrelationData(msgId);rabbitTemplate.convertAndSend(msgLog.getExchange(), msgLog.getRoutingKey(), MessageHelper.objToMsg(msgLog.getMsg()), correlationData);// 重新投递log.info("第 " + (msgLog.getTryCount() + 1) + " 次重新投递消息");}});log.info("定时任务执行结束(重新投递消息)");}}

说明: 每一条消息都和exchange routingKey绑定, 所有消息重投共用这一个定时任务即可

五、基本测试

OK, 目前为止, 代码准备就绪, 现在进行正常流程的测试

  1. 发送请求:

  1. 后台日志:

  2. 数据库消息记录:

状态为3, 表明已消费, 消息重试次数为0, 表明一次投递就成功了

  1. 查看邮箱

发送成功

六、各种异常情况测试

步骤一罗列了很多关于RabbitMQ的知识点, 很重要, 很核心, 而本文也涉及到了这些知识点的实现, 接下来就通过异常测试进行验证(这些验证都是围绕本文开头扔的那张流程图展开的, 很重要, 所以, 再贴一遍)

  1. 验证消息发送到Exchange失败情况下的回调, 对应上图P -> X

如何验证? 可以随便指定一个不存在的交换机名称, 请求接口, 看是否会触发回调

发送失败, 原因: reply-code=404, reply-text=NOT_FOUND - no exchange 'mail.exchangeabcd' in vhost '/', 该回调能够保证消息正确发送到Exchange, 测试完成

  1. 验证消息从Exchange路由到Queue失败情况下的回调, 对应上图X -> Q

同理, 修改一下路由键为不存在的即可, 路由失败, 触发回调

发送失败, 原因: route: mail.routing.keyabcd, replyCode: 312, replyText: NO_ROUTE

  1. 验证在手动ack模式下, 消费端必须进行手动确认(ack), 否则消息会一直保存在队列中, 直到被消费, 对应上图Q -> C

将消费端代码channel.basicAck(tag, false);// 消费确认注释掉, 查看控制台和rabbitmq管控台

可以看到, 虽然消息确实被消费了, 但是由于是手动确认模式, 而最后又没手动确认, 所以, 消息仍被rabbitmq保存, 所以, 手动ack能够保证消息一定被消费, 但一定要记得basicAck

  1. 验证消费端幂等性

接着上一步, 去掉注释, 重启服务器, 由于有一条未被ack的消息, 所以重启后监听到消息, 进行消费, 但是由于消费前会判断该消息的状态是否未被消费, 发现status=3, 即已消费, 所以, 直接return, 这样就保证了消费端的幂等性, 即使由于网络等原因投递成功而未触发回调, 从而多次投递, 也不会重复消费进而发生业务异常

  1. 验证消费端发生异常消息也不会丢失

很显然, 消费端代码可能发生异常, 如果不做处理, 业务没正确执行, 消息却不见了, 给我们感觉就是消息丢失了, 由于我们消费端代码做了异常捕获, 业务异常时, 会触发: channel.basicNack(tag, false, true);, 这样会告诉rabbitmq该消息消费失败, 需要重新入队, 可以重新投递到其他正常的消费端进行消费, 从而保证消息不被丢失

测试: send方法直接返回false即可(这里跟抛出异常一个意思)

可以看到, 由于channel.basicNack(tag, false, true), 未被ack的消息(unacked)会重新入队并被消费, 这样就保证了消息不会走丢

  1. 验证定时任务的消息重投

实际应用场景中, 可能由于网络原因, 或者消息未被持久化MQ就宕机了, 使得投递确认的回调方法ConfirmCallback没有被执行, 从而导致数据库该消息状态一直是投递中的状态, 此时就需要进行消息重投, 即使也许消息已经被消费了

定时任务只是保证消息100%投递成功, 而多次投递的消费幂等性需要消费端自己保证

我们可以将回调和消费成功后更新消息状态的代码注释掉, 开启定时任务, 查看是否重投

可以看到, 消息会重投3次, 超过3次放弃, 将消息状态置为投递失败状态, 出现这种非正常情况, 就需要人工介入排查原因

七、拓展: 使用动态代理实现消费端幂等性验证和消费确认(ack)

不知道大家发现没有, 在MailConsumer中, 真正的业务逻辑其实只是发送邮件mailUtil.send(mail)而已, 但我们又不得不在调用send方法之前校验消费幂等性, 发送后, 还要更新消息状态为"已消费"状态, 并手动ack, 实际项目中, 可能还有很多生产者-消费者的应用场景, 如记录日志, 发送短信等等, 都需要rabbitmq, 如果每次都写这些重复的公用代码, 没必要, 也难以维护, 所以, 我们可以将公共代码抽离出来, 让核心业务逻辑只关心自己的实现, 而不用做其他操作, 其实就是AOP

为达到这个目的, 有很多方法, 可以用spring aop, 可以用拦截器, 可以用静态代理, 也可以用动态代理, 在这里, 我用的是动态代理

目录结构如下:

核心代码就是代理的实现, 这里就不把所有代码贴出来了, 只是提供一个思路, 我们要尽可能地把代码写的更简洁更优雅

八、总结

发送邮件其实很简单, 但深究起来其实有很多需要注意和完善的点, 一个看似很小的知识点, 也可以引申出很多问题, 甚至涉及到方方面面, 这些都需要自己踩坑, 当然我这代码肯定还有很多不完善和需要优化的点, 希望小伙伴多多提意见和建议

我的代码都是经过自测验证过的, 图也都是一点一点自己画的或认真截的, 希望小伙伴能学到一点东西, 路过的点个赞或点个关注呗, 谢谢

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. CentOS hping3安装

    安装libpcap-devel和tcl-develyum -y install libpcap-devel tcl-devel从github上clone源代码git clone https://github.com/antirez/hping.git运行配置脚本cd hping ./configure编译make安装make installhping3 SYN洪流攻击hping3 --rand-source [dst_ip] -p [dst_port] -S --…...

    2024/4/24 10:53:49
  2. 国际数棋单机版

    import pygame, sys,win32api,win32con import re import sys import os from tkinter import * from pygame.locals import * """|-------------start宏定义模块start-----------------|""" WINDOWWIDTH=1000 #窗体大小 WINDOWHEIGHT=700 CH…...

    2024/5/9 13:49:16
  3. Java笔记(方法)

    方法(函数):实现特定功能的代码块。格式:修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...){方法体;return 返回值;}修饰符:现在先使用public static返回值类型:用来限定返回值的类型的有明确返回值类型无明确返回值类型方法名:驼峰命名法参数…...

    2024/4/24 10:53:47
  4. 新媒体代运营的前景怎么样?

    选择新媒体代运营为什么要会那么多?伴随着移动互联网的迅速发展,新媒体渐渐成为如今企业开展营销推广的关键方式,因为新媒体更能满足群众的要求,这样企业开展品牌营销的面也就变得更为宽广。如今,无论互联网企业还是传统企业,越来越高度重视新媒体代运营这件事情。也是有…...

    2024/4/24 10:53:46
  5. Markdown的学习

    Markdown 的学习 标题 使用#号来添加 引用使用 > 来表示引用字体 加粗 **RCT ** 使用两个 * 号 斜体 RCT 使用 一个 * 号 斜体加粗 ,RCT 三个* 号 分割线直接 三个 * 就是分割线图片使用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEvJ…...

    2024/4/24 10:53:45
  6. Spartan-6 -XC6SLX9/Verilog 数字钟

    module digitalclk(input clk,//时钟input reset,//复位input set_m,//分钟调时input set_h,//时钟较时output reg [3:0]hour_g=0,//时钟数的个位output reg [3:0]hour_s=0,//时钟数的十位output reg[3:0]minute_g,//分数的个位output reg[3:0]minute_s,//分数的十位output reg…...

    2024/4/24 10:53:48
  7. 还在犹豫写不写博客吗?

    扬帆起航吧少年为什么我要开始写博客你为什么还在犹豫最后坚持,坚持,坚持!!! 为什么我要开始写博客 The most important reason,我想记录生活 ,记录自己的成长(想一想再过个10年,回看时肯定感慨万千吧) 。 Secondly,有一种学习方式-----你能教懂别人,证明你真正学会…...

    2024/4/24 10:53:43
  8. 机器学习理论——支持向量机SVM之非线性模型(原问题和对偶问题)

    目录一、原问题(prime problem)二、原问题的对偶问题(dual problem)1、定义一个辅助函数2、定义对偶问题>>>问题1:上面说到遍历w,那w的取值范围和取值步长是怎样的?即遍历的w从何处求得?3、原问题与对偶问题解的关系(一个定理)4、原问题与对偶问题的间距G—…...

    2024/4/26 9:41:01
  9. 全文搜索引擎 Elasticsearch + kibana 实战部署记录

    全文搜索引擎 Elasticsearch + kibana实战(7.0.0) 全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。 docker环境准备(已经有docker环境的跳过这里) 请移步Ce…...

    2024/4/24 10:53:44
  10. python项目之单人壁球

    单人壁球 程序说明 本项目我们尝试用Python语言设计一个计算机程序来模拟“单人壁球练习”游戏。程序的文件名称为Squash.py,程序将使用到import、def、if/elif/else、return等Python保留词,也会用到random.random( )等Python函数,还会使用到List、变量、数学运算表达式、逻…...

    2024/4/27 7:13:02
  11. 图解码、候选码、主码

    码 就拿这个图片来说,无论是通过<宿舍,床位>,还是通过<江湖称号>,都能确定这个人。 所以: <宿舍,床位> <江湖称号> <系,专业,班级,学号> <社团,职位> 这几个都能称为确认一个人的码 候选码 举个例子 只有通过 <宿舍,床位>…...

    2024/4/24 10:53:44
  12. 关于链表类指针及指针内存管理的小结

    题目:1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数:1) 默认构造函数List(),将该链表初始化为一个空链表(10分)2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分)3) 析构函数~List(),释放链表中的所有节点(10分…...

    2024/4/24 10:53:39
  13. 懒加载 && 预加载 in angular

    目录懒加载和预加载使用场景路由懒加载究竟是如何实现的canActivate和canLoad的区别懒加载和预加载使用场景路由懒加载究竟是如何实现的步骤:1. {path: "administration",// component: AdministrationComponent,// canActivate: [AdminGuard]loadChildren: () =>…...

    2024/4/19 9:31:02
  14. 10个JavaScript代码片段,使你更加容易前端开发。

    文章目录1、反转字符串2、计算数字的阶乘3、将数字转换为数字数组4、检查数字是否为2的幂5、从对象创建键-值对数组6、从数组中返回[Number]个最大元素7、检查数组中的所有元素是否相等8、返回两个数的平均值9、返回两个或多个数字的和10、返回数字数组的幂集 1、反转字符串 在…...

    2024/4/17 21:21:40
  15. 基于CentOS7的Nginx的下载安装

    一般情况下服务器都是远程登录的,所以我们也采用远程登录的方式登录我们本机虚拟机安装的linux系统(Xshell) 查询虚拟机的IP地址ifconfig进行远程登录准备好nginx安装需要的环境gcc安装 nginx是c语言编写的,所以需要安装gcc来编译nginxpcre安装 一个perl库。nginx的http模板…...

    2024/4/21 1:35:33
  16. 千亿数仓项目(数仓理论_商品维度数据装载(拉链表))

    商品维度数据装载(拉链表)拉链表设计:1.采集当日全量数据存储到 ND(当日) 表中。 2.可从历史表中取出昨日全量数据存储到 OD(上日数据)表中。 3.用ND-OD为当日新增和变化的数据(即日增量数据)。 两个表进行全字段比较,将结果记录到tabel_I表中。 4.用OD-ND为状态到此…...

    2024/4/15 5:26:34
  17. 用户输入数字,系统用随机数来随机

    用户输入数字,系统用随机数来随机的,加了个最大数和最小数限制。 本人初学java,有次搜了这个东西,但是要钱,我就自己想了两天,写了出来,写的不怎么样,但是是自己写的。看看得了。//int ran = new Random().nextInt(100-50+1)+50int ran;System.out.println("请输入…...

    2024/4/21 12:03:33
  18. Excel序号删除某行之后不连贯?这样做可以智能更新表格序号!

    苹果公司的iPad是一款寿命较长的设备,但在慢速运行和存储空间已满的警报提示下挣扎是很常见的。我有一台2014年10月发布的iPad Air 2,它仍然运行最新和最强大的iPadOS版本,大多数时候它运行得很好,但是有时我必须花几分钟来调整它。这样做可以延长它的使用寿命,还可以帮我…...

    2024/4/15 5:26:34
  19. 102.继承

    继承——mypro07.py#测试继承语法结构class Person:def __init__(self,name,age):self.name = nameself.__age = age #私有属性def say_age(self):pass#print(年龄是{0}.format(self.age))class Student(Person):def __init__(self,name,age,score):Person.__init__(self,name…...

    2024/4/15 5:26:31
  20. 屡获大奖,众多500强企业的培训法宝,你竟然还不知道?

    好奇心强盲目自信叛逆不按规则出牌……这些都是大众为90后乃至85后贴上的标签在人们的普遍印象里,这些新生代员工还略显稚嫩,在职场中还需要经过不断的磨炼。但你知道吗,事实却是这群新新人类已经正式跻身企业管理层,组建自己的团队,尝试着协调对上对下的关系,成为企业的…...

    2024/4/15 5:26:30

最新文章

  1. 1-3ARM_GD32点亮LED灯

    简介&#xff1a; 最多可支持 112 个通用 I/O 引脚(GPIO)&#xff0c;分别为 PA0 ~ PA15&#xff0c;PB0 ~ PB15&#xff0c;PC0 ~ PC15&#xff0c;PD0 ~ PD15&#xff0c;PE0 ~ PE15&#xff0c;PF0 ~ PF15 和 PG0 ~ PG15&#xff0c;各片上设备用其来实现逻辑输入/输出功能。…...

    2024/5/9 17:12:09
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. Linux学习 - 文件内容操作

    Linux学习 - 文件内容操作 常用的文件内容操作有文件压缩解压缩、文件大小行数统计、文件内容查询等。 gzip: 压缩文件; gunzip: 解压缩文件 # gzip -c 把压缩的文件输出到标准输出 (一般是屏幕) # > 输出重定向&#xff0c;输出写入文件ctehbio:~/ehbio_project$ gzip -…...

    2024/5/3 15:42:21
  4. Unity核心学习

    目录 认识模型的制作流程模型的制作过程 2D相关图片导入设置图片导入概述纹理类型设置纹理形状设置纹理高级设置纹理平铺拉伸设置纹理平台打包相关设置 SpriteSprite Editor——Single图片编辑Sprite Editor——Multiple图片编辑Sprite Editor——Polygon图片编辑SpriteRendere…...

    2024/5/8 20:10:06
  5. 【干货】零售商的商品规划策略

    商品规划&#xff0c;无疑是零售业的生命之源&#xff0c;是推动业务腾飞的强大引擎。一个精心策划的商品规划策略&#xff0c;不仅能帮助零售商在激烈的市场竞争中稳固立足&#xff0c;更能精准捕捉客户需求&#xff0c;实现利润最大化。以下&#xff0c;我们将深入探讨零售商…...

    2024/5/5 12:33:12
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/9 15:10:32
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/9 4:20:59
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/9 7:32:17
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/9 17:11:10
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57