消息中间件的引用场景

异步处理、应用解耦、流量削峰

 

JMS消息模型:

点对点模型(point to point):即生产者和消费者之间的消息来往;

发布/订阅模型(Pub/Sub):包含三个角色:主题(Topic),发布者(publisher),订阅者(subscriber),多个发布者将消息发送到topic,系统将这些消息投递到订阅此Topic的订阅者;

 

点对点模型的特点:

a).每个消息只有一个消费者(即一旦被消费,消息就不再消息队列中);

b).发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送消息之后,不管接收者有没有在运行,它不会影响消息被发送到队列;

c).接收者在成功接收消息之后需向队列应带成功;

 

发布/订阅模型的特点:

a).每个消息可以有多个消费者;

b).发布者和订阅者之间有时间上的依赖(消费者先订阅主题,发布者再来发送消息);

c).订阅者必修保持运行的状态,才能接收发布者发布的消息;

 

核心API:

       a).Destination:表示消息所走通道的名称;

       b).ConnectionFactory:用于创建连接对象;

      c).Connection:连接接口,用来创建session;

       d).Session:会话接口,这是一个重要的接口,消息发送者、消息接收者以及消息对象本身,都是通过这个会话创建,创建destination;

       e).MessageConsumer:消息的消费者;

       f).MessageProducer:消息的生产者;

 

使用API创建生产者

创建连接工厂

创建连接

打开链接

创建session会话(两个参数:第一个是是否开启事务,第二个消息的确认机制)

创建destination目的地

创建消息生产者

创建消息

发送消息

释放资源

 

使用API创建消费者

创建连接工厂

创建连接

打开链接

创建session会话(两个参数:第一个是是否开启事务,第二个消息的确认机制)

创建distination目的地

创建消息消费者

获取消息(使用receive方法)/设置消息监听器来接收消息(不要释放资源)

 

JMS消息组成格式

结构:

JMS Provider(消息中间件/消息服务器/消息提供者);

JMS Producer(消息生产者);

JMS Consumer(消息消费者);

JMS Message(消息----重要部分)

JMS Message组成

JMS Message消息由三部分组成:

消息头

名称

概述

JMSDestination

消息发送的目的地,在发送过程中由提供者设置;

JMSMessageID

唯一识别每个消息的标识,由提供者产生,客户机只能在消息发送后才能确定消息的JMSMessageID;

JMSDeliveryMode

消息持久化。有两种 :持久模式(DeliveryMode.PERSISTENT)和非持久模式(DeliveryMode.NON_PERSISTENT);

JMSTimestamp

提供者发送消息的时间,由提供者在发送过程中设置;

JMSExpiration

消息过期时间,毫秒单位,值0表明消息不会过期,默认值为0;

JMSPriority

消息优先级,从 0-9 十个级别,0最低,9最高,0-4 是普通消息,5-9 是加急消息。ActiveMQ不要求提供者严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息发送,默认是4级;

JMSCorrelationID

用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。在大多数情况下,JMSCorrelationID用于将一条消息标记为对JMSMessageID标示的上一条消息的应答,不过,JMSCorrelationID可以是任何值,不仅仅是JMSMessageID,由开发者设置

JMSReplyTo

提供本消息回复消息的目的地址,由开发者设置

JMSType

消息类型的识别符,由开发者设置

JMSRedelivered

如果一个客户端收到一个设置了JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。消息的重发标识,false,代表第一次发送,true,代表消息为重发消息

只有JMSCorrelationIDJMSReplyTo、JMSType可以由开发者设置的

消息体

消息体,JMS API定义了5种消息体格式,也叫消息类型,可以使用不同形式发送接收数据,并可以兼容现有的消息格式。包括:

TextMessage(字符串)

MapMessage(键值对)

BytesMessage(字节的数据流)

ObjectMessage(序列化的对象)

StreamMessage(java原始值的数据流,可以传递字符串,整型等不同类型的数据,数据生产与消费顺序要一致)

注意:ActiveMQ5.12后,为了安全考虑,ActiveMQ默认不接受自定义的序列化对象,需要将自定义的对象加入到受信任的列表

 

消息属性

消息属性,包含以下三种类型的属性:

1应用程序自定义设置和添加的属性,比如:Message.setStringProperty("hello", "my name is wangsaichao!");

2:JMS定义的属性:使用“JMSX”作为属性名的前缀,connection.getMetaData().getJMSXPropertyNames(), 方法返回所有连接支持的JMSX 属性的名字。

3:JMS供应商特定的属性:JMS定义的属性如下:

1:JMSXUserID:发送消息的用户标识,发送时提供商设置

2:JMSXAppID:发送消息的应用标识,发送时提供商设置

3:JMSXDeliveryCount:转发消息重试次数,第一次是1,第二次是2,… ,发送时提供商设置

4:JMSXGroupID:消息所在消息组的标识,由客户端设置

5:JMSXGroupSeq:组内消息的序号第一个消息是1,第二个是2,…,由客户端设置

6:JMSXProducerTXID :产生消息的事务的事务标识,发送时提供商设置

7:JMSXConsumerTXID :消费消息的事务的事务标识,接收时提供商设置

8:JMSXRcvTimestamp :JMS 转发消息到消费者的时间,接收时提供商设置

9:JMSXState:假定存在一个消息仓库,它存储了每个消息的单独拷贝,且这些消息从原始消息被发送时开始。每个拷贝的状态有:1(等待),2(准备),3(到期)或4(保留)。由于状态与生产者和消费者无关,所以它不是由它们来提供。它只和在仓库中查找消息相关,因此JMS没有提供这种API。由提供商设置

 

ActiveMQ的高级特性

ActiveMQ消息持久化

消息持久化是保证消息不丢失的重要方式。

 

ActiveMQ提供了一下三种的消息存储方式

  1. Memory消息存储-基于内存的消息存储;
  2. 基于日志消息存储方式,KahaDB是ActiveMQ的默认日志存储方式,它提供了容量和恢复能力;
  3. 基于JDBC的消息存储方式-数据存储于数据库中(例如:Mysql);

 

ActiveMQ持久化机制流程:默认是基于日志消息存储方式

 

ActiveMQ基于JDBC消息存储(springBoot)

a).修改application.yml文件:

spring:
activemq:
broker-url: tcp://192.168.1.129:61616
user: admin
password: admin
  jms:
    template:
delivery-mode:

 

b).修改ActiveMQ/conf下的activemq.xml文件:

<bean name="mysql-ds" class="com.alibaba.druid.pool.DruidDataSource" destory-method="close">
<property name="driverClassName" valuue="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.49:3306/test" />
<property name="username" value="root"/>
<property name="password" value="root"/>

</bean>

<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>

</persistenceAdapter>

 

c).拷贝mysql及druid数据源的jar包到activemq/lib目录下

d).重启activemq

 

消息事务

消息事务,是保证消息传递原子性的一个重要特征,和JDBC的事务特征类似;

一个事务性发送,其中一组(比如:5条消息为一组)消息要么能够全部保证到达服务器,要么都不到达服务器;

生产者、消费者与消息服务器直接都支持事务性;

ActiveMQ的事务主要偏向在生产者的应用;

ActiveMQ消息事务流程图:

实现方式(使用SpringBoot):使用原生JMS,使用spring的JmsTransactionManager

方式一:使用原生JMS

生产者:

       @Test

public void ptpProducerWithTx() {Session session = null;try {//获取连接工厂
ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();//创建连接
Connection connection = connectionFactory.createConnection();//打开连接
connection.start();/*** 参数一: 是否开启消息事务
* 参数二:消息的确认机制
* Session.AUTO_ACKNOWLEDGE 自动确认
* Session.CLIENT_ACKNOWLEDGE* Session.DUPS_OK_ACKNOWLEDGE* Session.SESSION_TRANSACTED*/session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建目的地
Destination destination = session.createQueue(name);//创建生产者
MessageProducer producer = session.createProducer(destination);for (int i = 1; i <= 10; i++) {//异常模拟
//if (i == 4) {//    int a = 10 / 0;//}//创建消息
TextMessage textMessage = session.createTextMessage("springboot-activemq-with-tx-message" + i);//发送消息
producer.send(destination, textMessage);}//注意:一旦开启事务发送,那么就必修使用commint方法进行事务的提交,否则消息无法到达MQ服务器
session.commit();System.out.println("消息送成功");} catch (Exception e) {e.printStackTrace();//事务的回滚
try {session.rollback();} catch (JMSException ex) {ex.printStackTrace();}}}

 

消费者:

@JmsListener(destination = "${activemq.name}")
public void receiveMessage(Message message, Session session) {if (message instanceof TextMessage) {TextMessage objectMessage = (TextMessage) message;try {String object = objectMessage.getText();System.out.println(name + " 接收消息:" + object);//模拟异常
// int a = 10/0;//提交事务
session.commit();} catch (JMSException e) {e.printStackTrace();//消息回滚
try {session.rollback();} catch (JMSException ex) {ex.printStackTrace();}}}}

 

方式二:使用spring的JmsTransactionManager

生产者:

配置ActiveMQ的事务管理器

@Configurationpublic class ActiveMQConfig {/*** 添加ActiveMQ事务管理器配置
*/@Beanpublic PlatformTransactionManager createPlatformTransactionManager(ConnectionFactory connectionFactory) {return new JmsTransactionManager(connectionFactory);}}

 

模拟消息发送业务

@Servicepublic class MessageService {@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Value("${activemq.name}")private String name;@Transactional //对消息发送加入事务管理(同事也对JDBC数据库的事务生效)
public void sendMessage() {for (int i = 1; i <= 10; i++) {//异常模拟
//if (i == 4) {//    int a = 10 / 0;//}jmsMessagingTemplate.convertAndSend(name, "springboot-activemq-no-tx-message" + i);}}}

发送消息:

@Autowiredprivate MessageService messageService;/*** 加入事务的消息发送--方案二:springJmsTransactionManager功能(JMS事务管理器)
*/@Testpublic void ptpProducerWithTx2() {messageService.sendMessage();}

 

消费者:同方案一的消费者

 

消息确认机制

JMS消息只有在被确认之后,才认为已经被成功地消费了。消息的成功消费通常包含三个阶段:客户接受消息、客户处理消息和消息被确认。在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参数有以下三个可选值(只在非事务下生效,事务下只有自动确认 ):

描述

Session.AUTO_ACKNOWLEDGE = 1

自动确认

当客户成功的从receive方法返回的时候,或者从MessageListener.onMessage方法成功返回的时候,会话自动确认客户收到的消息。

Session.CLIENT_ACKNOWLEDGE = 2

客户端手动确认

客户通过消息的Message.acknowledge方法确认消息。需要注意的是,在这种模式中,确认实在会话层上进行:确认一个被消费的消息将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了10个消息,然后确认第5个消息,那么所有10个消息都被确认。

Session.DUPS_OK_ACKNOWLEDGE = 3

自动批量确认/延迟确认

该选择只是会话迟钝确认消息的提交。如果JMS provider失败,那么可能会导致一些重复的消息。如果是重复的消息,那么JMS provider必修把消息头的JMSRedelivered字段设置为true。

Session.SESSION_TRANSACTED=0

(事务提交并确认)

 

INDIVIDUAL_ACKNOWLEDGE = 4

(单条消息确认)

AcitveMQ补充了一个自定义的ACK_MODE,只有ActiveMQ支持,当然开发者也可以使用它

注意:消息确认机制与事务机制是冲突的,只能选其中一种,所以演示消息确认前,先关闭事务

Client端指定了ACK_MODE,但是在Clientbroker在交换ACK指令的时候,还需要告知ACK_TYPE,ACK_TYPE表示此确认指令的类型,不同的ACK_TYPE将传递着消息的状态,broker可以根据不同的ACK_TYPE对消息进行不同的操作。

ActiveMQ中定义了如下几种ACK_TYPE(参看MessageAck类):

DELIVERED_ACK_TYPE = 0    消息"已接收",但尚未处理结束;

STANDARD_ACK_TYPE = 2    "标准"类型,通常表示为消息"处理成功",broker端可以删除消息了;

POSION_ACK_TYPE = 1    消息"错误",通常表示"抛弃"此消息,比如消息重发多次后,都无法正确处理时,消息将会被删除或者DLQ(死信队列);

REDELIVERED_ACK_TYPE = 3    消息需"重发",比如consumer处理消息时抛出了异常,broker稍后会重新发送此消息;

INDIVIDUAL_ACK_TYPE = 4    表示只确认"单条消息",无论在任何ACK_MODE下;

UNMATCHED_ACK_TYPE = 5    BROKER间转发消息时,接收端"拒绝"消息;

 

 

 

 

 

消息投递方式

消息投递方式包含三种方式:异步投递、延迟投递、定时投递

1、异步投递 VS 同步投递

同步发送:消息生产者使用持久(Persistent)传递模式发送消息的时候,Producer.send()方法会被阻塞,直到broker发送一个确认消息给生产者(ProducerAck),这个确认消息按时broker已经成功接收到消息并把消息保存到二级存储中。

 

异步发送:如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在收到broker的确认之前一直阻塞Producer.send()方法。

 

想要使用异步,在brokerUrl中增加jms.alwaysSyncSend=false&jms.userAsyncSend=true属性

a).如果设置了alwaysSyncSend=true(同步)系统会忽略userAsyncSend设置的值都采用同步;

b).当alwaysSyncSend=false(异步)时,“NON_PERSISTENT”(非持久化)、事务中的消息将使用“异步发送”;

c).当alwaysSyncSend=false(异步)时,如果指定userAsyncSend=true(异步),“PERSISTENT”(持久化)类型的消息使用异步发送。如果userAsyncSend=false(同步),“PERSISTENT”(持久化)类型的消息使用同步发送;

总结:默认情况(alwaysSyncSend=falseuserAsyncSend=false),非持久化消息、事务内的消息均采用异步发送;对于持久化消息采用同步发送!

没有使用事务并且正在发送持久性消息,则每个发送都是同步并阻塞

配置异步投递方式

方式一(原生JMS):

a).在连接上配置

new ActiveMQConnectionFactory("tcp://192.168.1.128:61616?jms.userAsyncSend=true");

b).通过ConnectionFactory

((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);

c).通过connection

((ActiveMQConnection) connection).setUseAsyncSend(true);

注意:如果是Spring或者SpringBoot项目,通过修改JmsTemplate的默认参数实现异步或同步投递

 

方式二:SpringBoot的配置

/*** 配置用于异步发送的非持久化JmsTemplate*/@Autowired@Beanpublic JmsTemplate asyncJmsTemplate(ConnectionFactory connectionFactory){JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);jmsTemplate.setExplicitQosEnabled(true);//deliveryMode, priority, timeToLive 的开关
jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//非持久化
return jmsTemplate;}/*** 配置用于同步发送的非持久化JmsTemplate* 默认为同步
*/@Autowired@Beanpublic JmsTemplate syncJmsTemplate(ConnectionFactory connectionFactory){JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);return jmsTemplate;}

 

 

 

异步投递如何确认发送成功?

异步发送丢失场景:生产者设置了useAsyncSend=true(异步),使用producer.send(message)持续发送消息。由于消息不阻塞,生产者会认为所有send的消息都被成功发送到MQ了。如果此时MQ突然宕机,生产者端内存中尚未发送至MQ的消息就会丢失。

这时,可以给异步投递方法接收回调函数,已确认消息是否发送成功。

@Value("${activemq.name}")private String name;@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;/*** 测试异步/同步投递
*/@Testpublic void asyncAndSyncSend() {Session session = null;try {//获取连接工厂
ActiveMQConnectionFactory connectionFactory = (ActiveMQConnectionFactory) jmsMessagingTemplate.getConnectionFactory();
// 设置消息发送模式是AsyncSend模式,异步模式
connectionFactory.setUseAsyncSend(true);//创建连接
Connection connection = connectionFactory.createConnection();//打开连接
connection.start();/*** 参数一: 是否开启消息事务
* 参数二:消息的确认机制
* Session.AUTO_ACKNOWLEDGE 自动确认
* Session.CLIENT_ACKNOWLEDGE* Session.DUPS_OK_ACKNOWLEDGE* Session.SESSION_TRANSACTED*/session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建目的地
Destination destination = session.createQueue(name);//创建生产者
ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination);        //非持久化

        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);


for (int i = 1; i <= 10; i++) {
//创建消息
            TextMessage textMessage = session.createTextMessage("springboot-activemq-with-async-message" + i);
//设置消息唯一的ID
String msgId = UUID.randomUUID().toString().replaceAll("-", "");
//这一步没有效果,因为即使开发者设置值,但是消息提供者会自己生成一个id,该id使用来记录本地发送失败的数据的
            textMessage.setJMSMessageID(msgId);
//发送消息
            producer.send(textMessage, new AsyncCallback() {
@Override
public void onSuccess() {
//使用msgId标识来进行消息发送成功的处理
                    System.out.println("msgId:" + msgId);
}
@Override
public void onException(JMSException exception) {
//使用msgId标识来进行消息发送失败的处理
                    System.out.println("msgId:" + msgId + "发送失败");
exception.printStackTrace();
}
});
}
//注意:一旦开启事务发送,那么就必修使用commint方法进行事务的提交,否则消息无法到达MQ服务器
        session.commit();
System.
out.println("消息发送成功");
}
catch (Exception e) {
e.printStackTrace();
//事务的回滚
        try {
session.rollback();
}
catch (JMSException ex) {
ex.printStackTrace();
}
}
}

2、延迟投递

生产者提供两个发送消息的方法,一个是即使发送消息,一个是延时发送消息。

步骤如下:

1、修改activemq.xml

注意:修改activemq/conf目录下的activemq.xml文件中的broker标签,添加schedulerSupport=”true”配置 开启延时投递,重启activemq;

<broker xmlns="http://activemq.apache.org/schema/core" 
brokerName="localhost" dataDirectory="${activemq.data}"
schedulerSupport="true" />

 

2、在代码中设置延时时长

@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;

/**
*
延时投递
 */
@Test
public void lazySendMessage() {
Session session =
null;
try {
//获取连接工厂
        ConnectionFactory connectionFactory = jmsMessagingTemplate.getConnectionFactory();
//创建连接
        Connection connection = connectionFactory.createConnection();
//打开连接
        connection.start();
/**
*
参数一: 是否开启消息事务
         * 参数二:消息的确认机制
         * Session.AUTO_ACKNOWLEDGE 自动确认
         * Session.CLIENT_ACKNOWLEDGE
* Session.DUPS_OK_ACKNOWLEDGE
* Session.SESSION_TRANSACTED
*/
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//创建目的地
        Destination destination = session.createQueue(name);
//创建生产者
        ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.
NON_PERSISTENT);//非持久化
        //创建消息
        TextMessage textMessage = session.createTextMessage("springboot-activemq-with-tx-message");
//设置延时时长(延时10s
        textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
//发送消息
        producer.send(destination, textMessage);
//注意:一旦开启事务发送,那么就必修使用commint方法进行事务的提交,否则消息无法到达MQ服务器
        session.commit();
System.
out.println("消息发送成功");
}
catch (Exception e) {
e.printStackTrace();
//事务的回滚
        try {
session.rollback();
}
catch (JMSException ex) {
ex.printStackTrace();
}
}
}

 

ScheduledMessage投递的四个属性

属性

描述

ScheduledMessage.AMQ_SCHEDULED_DELAY

延迟投递的时间

ScheduledMessage.AMQ_SCHEDULED_PERIOD

重复投递的时间间隔

ScheduledMessage.AMQ_SCHEDULED_REPEAT

重复投递次数

ScheduledMessage.AMQ_SCHEDULED_CRON

Cron表达式

 

 

 

定时投递

步骤如下:

1、启动类添加定时注解

@SpringBootApplication
@EnableScheduling
//开启定时任务
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.
class, args);
}
}

 

2、在生产者添加@Scheduled设置定时

/**
*
定时任务消息发送
 */
@Component
public class Producer {

@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;

@Value("${activemq.name}")
private String name;

/**
*
定时发送消息
     */
@Scheduled(fixedDelay = 3000)
public void sendMessage() {
jmsMessagingTemplate.convertAndSend(name, "springboot-activemq-scheduled");
}

}

 

 

 

死信队列

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。

出现以下情况时,消息会被redelivered(重新交付):

A transacted session is used and rollback() is called.

A transacted session is closed before commit() is called.

A session is using CLIENT_ACKNOWLEDGE and Session.recover() is called.

A client connection times out (perhaps the code being executed takes longer than the configured time-out period).

1.事务会话中,当还未进行session.commit()时,进行session.rollback(),那么所有还没commit的消息都会进行重发。

2.所有未ack的消息,在没有commint()之前进行session.closed()关闭事务,那么所有还没ack的消息broker端都会进行重发,而且是马上重发。

3.使用客户端手动确认的方式时(非事务会话),还未进行确认并且执行Session.recover(),那么所有还没acknowledge的消息都会进行重发。

4.消息被消费者拉取之后,超时没有响应ack,消息会被broker重发。

当一个消息被redelivered超过maximumRedeliveries(缺省为6次)次数时,会给broker发送一个" poison_ack",这个消息被认为是a poison pill,这时broker会将这个消息发送到DLQ,以便后续处理。

注意两点:

1、缺省持久消息过期,会被送到DLQ,非持久消息不会送到DLQ

2、缺省的死信队列是ActiveMQ.DLQ,如果没有特别指定,死信都会被发送到这个队列。

 

可以通过配置文件(activemq.xml)来调整死信发送策略,方案如下:

官网链接:http://activemq.apache.org/message-redelivery-and-dlq-handling

  1. 方案一)为每个队列创建死信队列
修改activemq/conf目录下的activemq.xml文件:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">

<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" ><!--为每个队列建立死信队列 --><deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true"/>
</deadLetterStrategy>
</policyEntry>
<policyEntry topic=">" ><!--死信队列的默认配置 --><pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>

</destinationPolicy>

 

2、(方案二)RedeliveryPolicy重发策略设置

在消费者方配置如下:

@Configurationpublic class ActiveMQConfig {/*** RedeliveryPolicy*/@Beanpublic RedeliveryPolicy redeliveryPolicy() {RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();//是否在每次尝试重新发送失败后,增长这个等待时间
redeliveryPolicy.setUseExponentialBackOff(true);//重发次数,默认为6次,这里设置为10
redeliveryPolicy.setMaximumRedeliveries(10);//重发时间间隔,默认为1sredeliveryPolicy.setInitialRedeliveryDelay(2000);//第一次失败后重新发送之前等待500毫秒,第二次失败再等待500*2毫秒,第三次500*2*2,这里的2就是valueredeliveryPolicy.setBackOffMultiplier(2);//是否避免消息碰撞
redeliveryPolicy.setUseCollisionAvoidance(false);//设置重发最大拖延时间,-1表示没有拖延只有UseExponentialBackOff(true)true时生效
//当重连时间间隔大的最大重连时间间隔时,以后每次重连时间间隔都为最大重连时间间隔。
redeliveryPolicy.setMaximumRedeliveryDelay(-1);return redeliveryPolicy;}@Beanpublic ActiveMQConnectionFactory activeMQConnectionFactory(@Value("${spring.activemq.broker-url}") String url, RedeliveryPolicy redeliveryPolicy) {ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("admin", "admin", url);activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);return activeMQConnectionFactory;}/*** 添加ActiveMQ事务管理器配置
*/@Beanpublic PlatformTransactionManager createPlatformTransactionManager(ConnectionFactory connectionFactory) {return new JmsTransactionManager(connectionFactory);}/*** 消费者 消息确认机制配置
** @param connectionFactory* @return*/@Bean("jmsListenerContainerFactory")public DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory(ConnectionFactory connectionFactory, PlatformTransactionManager platformTransactionManager) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//连接工厂
factory.setTransactionManager(platformTransactionManager);//事务管理器
//是否关闭事务,开启事务
factory.setSessionTransacted(true);//修改消息确认机制
//自动确认
factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);return factory;}}

 

@Componentpublic class MyListener {@Value("${activemq.name}")private String name;private int count = 0;/*** 消费方事务的配置,使用session形参控制
** @param message* @param session*/@JmsListener(destination = "${activemq.name}",containerFactory = "jmsListenerContainerFactory")public void receiveMessage(Message message, Session session) {if (message instanceof TextMessage) {TextMessage objectMessage = (TextMessage) message;try {String object = objectMessage.getText();System.out.println("重复提交次数count:" + (++count));System.out.println(name + " 接收消息:" + object);//模拟异常
int a = 10 / 0;//提交事务
session.commit();} catch (JMSException e) {e.printStackTrace();//消息回滚
try {session.rollback();} catch (JMSException ex) {ex.printStackTrace();}}}}}

 

其他方案:https://www.cnblogs.com/rainwang/p/5146223.html

包括:

非持久消息保存到死信队列

<deadLetterStrategy>
<sharedDeadLetterStrategy  processNonPersistent="true"/>
</deadLetterStrategy>

 

过期消息不保存到死信队列

<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>

 

持久消息不保存到死信队列

ActiveMQ企业经典面试问题

ActiveMQ宕机了怎么办?

  1. ActiveMQ主从集群方案:Zookeeper集群+Replicate LevelDB(kahadb)+ActiveMQ集群

官网链接:http://activemq.apache.org/replicated-leveldb-store

LevelDB存储已被弃用,不再受支持或建议使用。推荐的storeKahaDB

 

 

 

如何防止消费者消费重复消息?

如果因为网络延迟等原因,MQ无法及时接收到消息方的应答,导致MQ重试。在重试过程中造成重复消费的问题。

解决思路:

  1. 如果消费方是做数据库操作,那么可以报消息的ID作为表的唯一主键或者唯一约束,这样在重试的情况下,会触发冲突,从而避免数据出现脏数据。
  2. 如果消费方不是数据库操作,那么可以借助第三方的应用,例如redis,来记录消费记录。每次消费被消费完成的时候,把当前消息的ID作为key存入redis,每次存入redis,每次消费前,先到redis查询有没有该消息的消费者记录。

如何防止消息丢失?

以下手段可以防止消息丢失:

  1. 在消息生产者和消费者使用事务;
  2. 在消费者采用手动消息确认(ACK)
  3. 消息持久化,例如JDBC或kahadb

 

什么是死信队列?

DLQ-死信队列(Dead Letter Queue)用来保存处理失败或者过期的消息。

 

 

 

 

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

相关文章

  1. 吐血总结!40道RPA工程师面试题集锦(附答案)持续更新中

    2020年年初全国爆发新冠肺炎,很企业都遭受了很大损失。在疫情期间,机器人代替人类工作无疑是最佳选择,不管是物理机器人,还是安装部署在电脑上软件机器人RPA,都是不错的选择。加上这几年全球经济比较环境不太好,RPA机器人也是企业提效能的一大利器。无论是新冠肺炎对RPA行…...

    2024/4/23 15:52:29
  2. Service和Activity通信

    在上面我们高高兴兴的启动了Service了,但是细心的你可能发现了,貌似我们仅仅只是启动了而已,Activity跟Service并没有多少"交流",下面我们就让Activity跟Service交流一下。 public class MyService extends Service { ​public static final String TAG = "MySe…...

    2024/4/23 15:52:27
  3. 【YOLOv2原文+翻译】YOLO9000: Better, Faster, Stronger

    最近新出了YOLOV4,我系统的从V1开始整理出稿,传送门: 【YOLOv1原文+翻译】You Only Look Once Unified, Real-Time Object Detection 【YOLOv2原文+翻译】YOLO9000: Better, Faster, Stronger V3V4正在出稿ing 首先上传原文:百度云盘 提取码: i9b2 因为大多数博主所给的都…...

    2024/4/23 15:52:26
  4. JavaScript|3步骤搞定轮播图(含测试源码)

    本博文源于js基础,轮播图是测试js基础的内容,一个小轮播图要用到h5+c3+js的知识,如果对这些没有一个清晰的把握就会陷入苦恼。大家在看下面代码时要注意到图片位置。 问题再现 轮播图是常见的页面特效之一,用来循环展示图片。轮播图有左、右两个按钮,单击按钮会让图片进行…...

    2024/4/23 15:52:25
  5. Python Django快速开发音乐高潮提取网(1)

    还记得我们上次做的一个高潮提取器吗:Python制作音乐高潮提取器。今天我们来把这个高潮提取器做成一个网站,让许多不懂技术的人也可以很方便地提取歌曲里的高潮/副歌部分。 其实这是一个非常简单的单页面网站,不需要数据库、不需要celery、不需要各种高深的后端技术。不过,…...

    2024/4/23 15:52:31
  6. 26、Android创建项目

    利用 Android Studio,您可以轻松地为各种类型的设备(例如手机、平板电脑、电视和可穿戴设备)创建 Android 应用。本页介绍了如何启动新的 Android 应用项目或导入现有项目。如果您未打开项目,Android Studio 会显示欢迎屏幕,您可在其中点击 Start a new Android Studio pr…...

    2024/5/5 16:44:06
  7. 二分查找(附例题)

    二分查找: 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。值得注意的是折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。让我们回忆一下平时我们如何在一本词典里查找一个单词呢? 查找单词过程的原理与二分查找的思路几乎是相…...

    2024/4/17 0:43:01
  8. 数据挖掘工具pandas(二)DataFrame的索引

    一,设置DataFrame索引值 以及 时间索引如何构造 1,设置DataFrame索引值 import numpy as np import pandas as pdday_data = np.random.normal(0,1,(500,507))# 将数据变成dataframe格式 day_data1 = pd.DataFrame(day_data)# 构造行索引列表 stock_list = ["股票"…...

    2024/4/17 0:51:22
  9. HTML5的语法结构1——简介

    HTML5不是一种编程语句,而是一种描述性的标记语言,用于描述超文本中的内容和结构。HTML5最基本的语法是<标记符></标记符>。标记符通常是成对使用,有一个开头标记和一个结束标记。结束标记只是在开头标记的前面加一个斜杠"/"。当浏览器收到HTML5文件后…...

    2024/4/17 0:50:58
  10. 《Oracle Java EE编程自学与面试指南》20-09:PPT

    深入了解IT/互联网行业及岗位,请参阅通用IT/互联网岗位招聘计划(最新全岗版)。 深入了解职业晋升及学习路线,请参阅最优职业晋升路线和课程学习指南(最新全栈版)。内容导航: 20:Web项目实战 20-01:项目规划 20-02:需求分析 20-03:原型设计 20-04:前端设计 20-05:数…...

    2024/4/17 0:51:04
  11. SQL SERVER 常用函数

    1、SubString():用于截取指定字符串的方法。该方法有三个参数:参数1:用于指定要操作的字符串。参数2:用于指定要截取的字符串的起始位置,起始值为 1 。参数3:用于指定要截取的长度。2、Left()/Right():用于返回指定字符串中指定长度的左或右侧部分。该方法有两个参数:参…...

    2024/4/17 0:51:16
  12. Python数据分析练习01-—二手车折旧/价格分析

    搜索一些能用来进行数据分析探索的数据 利用Python对数据进行处理、制图、分析等来练习 1. 背景 通过二手车交易数据了解二手车行情,从中分析影响二手车价格的因素。 2. 说明 本文数据来源:https://www.kesci.com/home/project/5d2d821a688d36002c5f2d3b/dataset python版本:…...

    2024/4/17 0:51:04
  13. vue实现post请求,下载后端返回文件流

    get请求,浏览器可以直接下载后台返回的文件流,但是post请求,浏览器不会直接下载。直接贴代码:myPlanEdit(type) {this.$http.defaults.headers.common[token] = this.token;this.save_type = typelet datas = {id:this.planId,name:this.dataObj.name,introduce:this.dataO…...

    2024/4/23 12:35:20
  14. JMeter学习之路[5.如何进行并发测试]

    JMeter学习之路[5.如何进行并发测试]1.如何使用Jmeter进行并发测试2.如何设置并发量为10003.正式测试 1.如何使用Jmeter进行并发测试 整理的几个我觉得解释的很好的教程,仅供参考。 如何使用jmeter实现相对并发和绝对并发 如何使用jmeter进行并发登录测试 并发测试实例 2.如何…...

    2024/4/17 0:51:52
  15. T和Class以及?的理解

    最近很多同事问Class<T>、Class<T extends Serializable>和Class<? extends Serializable>的区别是什么,写在这里。Class<T> 这其实就是一个很普通的泛型类,定义如下: public final class Class<T> implements java.io.Serializable,Generic…...

    2024/4/23 15:52:22
  16. 获取数组对象中某一属性值的集合

    之前在工作中遇到了将数组对象中的某一个属性值提取出来的需求,当时是利用foreach循环然后放入数组中的,后来发现一些简单的方法如下。 一、from方法 var user = [{id: 1,name: "李四"},{id: 2,name: "张三"},{id: 3,name: "李五"}] var userN…...

    2024/4/22 17:18:10
  17. 修改element ui组件默认样式的两种方式

    vue项目中经常会用到element ui,有时候需要修改默认的样式,比如表格,导航栏等,输入框等等。 可以用以下两种方式修改: 1.给组件加上id或者class,然后添加一个style,不要加scoped(vue可以有多个style),在组件里直接修改 2.外部引入css文件,默认样式会被覆盖 3.利用深…...

    2024/4/23 15:52:20
  18. Visual Question Answering: A Survey of Methods and Datasets

    Abstract视觉问答(VQA)是一项具有挑战性的任务,已受到计算机视觉和自然语言处理社区的越来越多的关注。给定图像和自然语言的问题,就需要对图像的视觉元素和常识进行推理,以推断出正确的答案。在本调查的第一部分中,我们通过比较解决问题的现代方法来检查最新技术。我们通…...

    2024/4/23 15:52:27
  19. Shell脚本基础学习笔记

    前记 最近狗仔儿我换工作了,别问为什么会在这个疫情期间换工作?要是能在上一家公司待得下去我也不会这时候找了,一言难尽呀!新公司还不错,上市公司,进来发现这边都主要跟底层打交道比较多,所以又要开始学习新东东了~话不多说,上菜!本文主要是介绍Shell脚本的基础语法…...

    2024/4/23 15:52:18
  20. uniapp默认样式实际笔记

    uni-app修改组件默认样式实践问题解决方案 uniapp作为一个使用 Vue.js 开发跨平台应用的前端框架,他的强大毋庸置疑,但是其中的坑就多不盛数了,最近在写app的时候发现真的是有很多让人很难受的地方 实践问题 在做到地图的地方发现高德地图的图标z-index太大,搜索框的蒙层遮…...

    2024/4/24 19:43:51

最新文章

  1. 美团面试(一面)

    前言 给位小伙伴好&#xff0c;这里呢&#xff0c;分享一下最近一次美团的面试的面经&#xff0c;自己把面试的大多数内容通过博客的形式记录了下来&#xff0c;希望对各位有所帮助哦~ 一、项目篇 1、**对于自己的点餐小程序数据库表是怎么设计的 2、对于多个人下订单的问题…...

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

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

    2024/3/20 10:50:27
  3. Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件

    Topaz Video AI for Mac是一款功能强大的视频处理软件&#xff0c;专为Mac用户设计&#xff0c;旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术&#xff0c;能够自动识别和分析视频中的各个元素&#xff0c;并进行智能修复和增强&…...

    2024/5/5 8:52:36
  4. OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理&#xff0c;该处理过程会对图像做高斯模糊化以保证图像在进行放大&#xff08;/缩小&#xff09;后尽可能保留源图像所展现的具体内容&#xff08;消除固定频率插值/采样带来的香农采样信息损失&#xff09;&#x…...

    2024/5/5 8:49:58
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

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

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

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

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

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

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

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

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

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

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

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

    2024/5/4 18:20:48
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

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

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

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

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

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

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

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

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

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

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

    2022/11/19 21:17:18
  26. 错误使用 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,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
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  44. 如何在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