消息队列(Message Queue MQ)概述:是分布式应用程序之间的通讯方法,使用消息队列可以实现异步处理、程序解耦、流量销峰等目的,目前市面上成熟主流的MQ有Kafka(人民币玩家) 、RocketMQ(高端玩家)、RabbitMQ(普通玩家)、Apache Qpid。AcitveMQ(老古董)

AMQP 和 JMS【面试】
2种消息模式:
JMS(Java Message Service)Java消息服务,是一个Java平台中关于面向消息中间件(MOM)的API,用于在应用程序之间或分布式系统中发送消息,进行异步通信。
AMQP(Advanced Message Queuing Protocol)高级消息队列协议,是一个用于统一面向消息中间件实现的一套标准协议,AMQP不从API层进行限定,而是直接定义网络交换的数据格式,支持跨语言进行异步通讯

JMS AMQP
定义 Java API 消息队列协议
跨语言 否java
跨平台 否java
支持的消息模式 发布订阅模式
点对点模式
点对点模式
发布订阅
广播
支持的消息类型 TextMessage
MapMessage
BytesMessage
StreamMessage
ObjectMessage Message
byte[]

小结

  • 消息队列是分布式应用之间的通讯方法,可实现异步处理、程序解耦、流量销峰等。
  • JMS、AMQP
    • JMS Java API 不支持夸语言、不支持跨平台,支持的数据类型会更加丰富
    • AMQP 消息队列协议,支持夸语言、跨平台,支持的数据类型只有byte[]
      什么是RabbitMQ
      RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
      RabbitMQ提供了6种模式:简单模式,work模式,Publish/Subscribe发布与订阅模式,Routing路由模式,Topics主题模式,RPC远程调用模式(远程调用,不太算MQ;不作介绍);
      端口
  • 15672 管理端口
  • 5672 服务端口
    RabbitMQ在安装好后,可以访问http://localhost:15672 ;其自带了guest/guest的用户名和密码;
    创建自定义用户
    在这里插入图片描述
    角色说明:
    1、 超级管理员(administrator)
    可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
    2、 监控者(monitoring)
    可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
    3、 策略制定者(policymaker)
    可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
    4、 普通管理者(management)
    仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
    5、 其他
    无法登陆管理控制台,通常就是普通的生产者和消费者。

创建Virtual Hosts
像mysql拥有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理;在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。 相当于mysql的db。Virtual Name一般以/开头。

在这里插入图片描述
设置Virtual Hosts权限
在这里插入图片描述
在这里插入图片描述
user:用户名
configure :一个正则表达式,用户对符合该正则表达式的所有资源拥有 configure 操作的权限
write:一个正则表达式,用户对符合该正则表达式的所有资源拥有 write 操作的权限
read:一个正则表达式,用户对符合该正则表达式的所有资源拥有 read 操作的权限
小结

  • RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,广泛应用于分布式系统开发中
  • 可以像mysql一样,精确管理每一个虚拟消息服务器,各个虚拟消息服务器之间相互隔
  • rabbitMQ中或者其他的消息队列中,所有的消息都是存储在队列里面(queue)
    - RabbitMQ入门
    - 创建maven工程,导入坐标依赖
    在这里插入图片描述
<dependencies><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.6.0</version></dependency>
</dependencies>

- 创建生产者
//创建连接工厂对象
//设置RabbitMQ服务主机地址,默认localhost
//设置RabbitMQ服务端口,默认5672
//设置虚拟主机名字,默认/
//设置用户连接名,默认guest
//设置连接密码,默认guest
//创建连接
//创建频道
//声明队列
//创建消息
//消息发送
//关闭资源
Producer.java

public class Producer {/**** 消息生产者* @param args* @throws IOException* @throws TimeoutException*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接工厂对象ConnectionFactory connectionFactory = new ConnectionFactory();//设置RabbitMQ服务主机地址,默认localhostconnectionFactory.setHost("localhost");//设置RabbitMQ服务端口,默认5672connectionFactory.setPort(5672);//设置虚拟主机名字,默认/connectionFactory.setVirtualHost("/szitheima");//设置用户连接名,默认guestconnectionFactory.setUsername("admin");//设置连接密码,默认guestconnectionFactory.setPassword("admin");//创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数* **/channel.queueDeclare("simple_queue",true,false,false,null);//创建消息String message = "hello!welcome to itheima!";/*** 消息发送* 参数1:交换机名称,如果没有指定则使用默认Default Exchage* 参数2:路由key,简单模式可以传递队列名称* 参数3:消息其它属性* 参数4:消息内容*/channel.basicPublish("","simple_queue",null,message.getBytes());//关闭资源channel.close();connection.close();}
}

在执行上述的消息发送之后;可以登录rabbitMQ的管理控制台,可以发现队列和其消息:
在这里插入图片描述
如果想查看消息,可以点击队列名称->Get Messages,如下图:
在这里插入图片描述
- 创建消费者
//创建连接工厂对象
//设置RabbitMQ服务主机地址,默认localhost
//设置RabbitMQ服务端口,默认5672
//设置虚拟主机名字,默认/
//设置用户连接名,默认guest
//设置连接密码,默认guest
//创建连接
//创建频道
//创建队列
//创建消费者,并设置消息处理
//消息监听
//关闭资源(不建议关闭,建议一直监听消息)
Consumer.java

public class Consumer {/**** 消息消费者* @param args* @throws IOException* @throws TimeoutException*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接工厂对象ConnectionFactory connectionFactory = new ConnectionFactory();//设置RabbitMQ服务主机地址,默认localhostconnectionFactory.setHost("localhost");//设置RabbitMQ服务端口,默认5672connectionFactory.setPort(5672);//设置虚拟主机名字,默认/connectionFactory.setVirtualHost("/szitheima");//设置用户连接名,默认guestconnectionFactory.setUsername("admin");//设置连接密码,默认guestconnectionFactory.setPassword("admin");//创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel = connection.createChannel();//创建队列channel.queueDeclare("simple_queue",true,false,false,null);//创建消费者,并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){/**** @param consumerTag   消息者标签,在channel.basicConsume时候可以指定* @param envelope      消息包的内容,可从中获取消息id,消息routingkey,交换机,消息和重传标志(收到消息失败后是否需要重新发送)* @param properties    属性信息* @param body           消息* @throws IOException*/@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由的keyString routingKey = envelope.getRoutingKey();//获取交换机信息String exchange = envelope.getExchange();//获取消息IDlong deliveryTag = envelope.getDeliveryTag();//获取消息信息String message = new String(body,"UTF-8");System.out.println("routingKey:"+routingKey+",exchange:"+exchange+",deliveryTag:"+deliveryTag+",message:"+message);}};/*** 消息监听* 参数1:队列名称* 参数2:是否自动确认,设置为true为表示消息接收到自动向mq回复接收到了,mq接收到回复会删除消息,设置为false则需要手动确认* 参数3:消息接收到后回调*/channel.basicConsume("simple_queue",true,defaultConsumer);//关闭资源(不建议关闭,建议一直监听消息)//channel.close();//connection.close();}
}

在这里插入图片描述

Work queues工作队列模式
Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。
就是在上面的代码下再增加相同的消费者
测试
在这里插入图片描述
小结

在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的关系。

订阅模式类型

P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
C:消费者,消息的接受者,会一直等待消息到来。
Queue:消息队列,接收消息、缓存消息。
Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:
Fanout:广播,将消息交给所有绑定到交换机的队列
Direct:定向,把消息交给符合指定routing key 的队列
Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

多了一个exchange角色
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!

1.每个消费者监听自己的队列。
2.生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

生产者
PublishSubscribeProducer.java

//1.声明交换机
//2.声明队列
//3.队列需要绑定指定的交换机
public class PublishSubscribeProducer {/**** 订阅模式* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明交换机* 参数1:交换机名称* 参数2:交换机类型,fanout、topic、direct、headers*/channel.exchangeDeclare("fanout_exchange", BuiltinExchangeType.FANOUT);/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("fanout_queue_1",true,false,false,null);channel.queueDeclare("fanout_queue_2",true,false,false,null);//队列绑定交换机channel.queueBind("fanout_queue_1","fanout_exchange","");channel.queueBind("fanout_queue_2","fanout_exchange","");//消息String message = "发布订阅模式:欢迎来到传深圳黑马训练营程序员中心!";/*** 参数1:交换机名称,如果没有指定则使用默认Default Exchage* 参数2:路由key,简单模式可以传递队列名称* 参数3:消息其它属性* 参数4:消息内容*/channel.basicPublish("fanout_exchange","",null,message.getBytes());//关闭资源channel.close();connection.close();}
}
  • 消费者一
    PublishSubscribeConsumerOne .java
public class PublishSubscribeConsumerOne {/**** 订阅模式消息消费者* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("fanout_queue_1",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者One-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("fanout_queue_1",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

消费者二
PublishSubscribeConsumerTwo.java

public class PublishSubscribeConsumerTwo {/**** 订阅模式消息消费者* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("fanout_queue_2",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者Two-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("fanout_queue_2",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

启动所有消费者,然后使用生产者发送消息;在每个消费者对应的控制台可以查看到生产者发送的所有消息;到达广播的效果。
在这里插入图片描述
在执行完测试代码后,其实到RabbitMQ的管理后台找到Exchanges选项卡,点击 fanout_exchange 的交换机,可以查看到如下的绑定:
在这里插入图片描述
小结
交换机需要与队列进行绑定,绑定之后;一个消息可以被多个消费者都收到。

发布订阅模式与work队列模式的区别
1、work队列模式不用定义交换机,而发布/订阅模式需要定义交换机。
2、发布/订阅模式的生产方是面向交换机发送消息,work队列模式的生产方是面向队列发送消息(底层使用默认交换机)。
3、发布/订阅模式需要设置队列和交换机的绑定,work队列模式不需要设置,实际上work队列模式会将队列绑 定到默认的交换机 。

Routing路由模式
路由模式特点:

1.队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
2.消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey。
3.Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息

在这里插入图片描述
P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列
C1:消费者,其所在队列指定了需要routing key 为 error 的消息
C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息

在编码上与 Publish/Subscribe发布与订阅模式 的区别是交换机的类型为:Direct,还有队列绑定交换机的时候需要指定routing key。
生产者
RouteKeyProducer.java

public class RouteKeyProducer {/**** 订阅模式-RouteKey* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明交换机* 参数1:交换机名称* 参数2:交换机类型,fanout、topic、direct、headers*/channel.exchangeDeclare("direct_exchange", BuiltinExchangeType.DIRECT);/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("direct_queue_insert",true,false,false,null);channel.queueDeclare("direct_queue_update",true,false,false,null);//队列绑定交换机channel.queueBind("direct_queue_insert","direct_exchange","insert");channel.queueBind("direct_queue_update","direct_exchange","update");//消息-direct_queue_insertString message_insert = "发布订阅模式-RouteKey-Insert:欢迎来到传深圳黑马训练营程序员中心!";/*** 消息发送* 参数1:交换机名称,如果没有指定则使用默认Default Exchage* 参数2:路由key,简单模式可以传递队列名称* 参数3:消息其它属性* 参数4:消息内容*/channel.basicPublish("direct_exchange","insert",null,message_insert.getBytes());//消息-direct_queue_updateString message_update = "发布订阅模式-RouteKey-Update:欢迎来到传深圳黑马训练营程序员中心!";channel.basicPublish("direct_exchange","update",null,message_update.getBytes());//关闭资源channel.close();connection.close();}
}

消费者RouteKey-Insert
ConsumerInsert.java

public class ConsumerInsert {/**** 订阅模式消息消费者-RouteKey-insert* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("direct_queue_insert",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者Insert-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("direct_queue_insert",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

消费者-RouteKey-Update
ConsumerUpdate.java

public class ConsumerUpdate {/**** 订阅模式消息消费者-RouteKey-update* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("direct_queue_update",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者Two-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("direct_queue_update",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

在这里插入图片描述
在执行完测试代码后,其实到RabbitMQ的管理后台找到Exchanges选项卡,点击 direct_exchange 的交换机,可以查看到如下的绑定:
在这里插入图片描述
小结
Routing模式要求队列在绑定交换机时要指定routing key,消息会转发到符合routing key的队列。

Topics通配符模式
在这里插入图片描述
Topic类型与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!
Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert
通配符规则:
#:匹配一个或多个词
:匹配不多不少恰好1个词
举例:
item.#:能够匹配item.insert.abc 或者 item.insert
item.
:只能匹配item.insert

生产者
使用topic类型的Exchange,发送消息的routing key有3种: item.insert、item.update、item.delete:

TopicProducer.java

public class TopicProducer {/**** 订阅模式-Topic* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明交换机* 参数1:交换机名称* 参数2:交换机类型,fanout、topic、direct、headers*/channel.exchangeDeclare("topic_exchange", BuiltinExchangeType.TOPIC);/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("topic_queue_1",true,false,false,null);channel.queueDeclare("topic_queue_2",true,false,false,null);//队列绑定交换机,同时添加routekey过滤channel.queueBind("topic_queue_1","topic_exchange","item.update");channel.queueBind("topic_queue_1","topic_exchange","item.delete");channel.queueBind("topic_queue_2","topic_exchange","item.*");//消息-item.insertString message_insert = "发布订阅模式-Topic-item.insert:欢迎来到传深圳黑马训练营程序员中心!";/*** 消息发送* 参数1:交换机名称,如果没有指定则使用默认Default Exchage* 参数2:路由key,简单模式可以传递队列名称* 参数3:消息其它属性* 参数4:消息内容*/channel.basicPublish("topic_exchange","item.insert",null,message_insert.getBytes());//消息-item.updateString message_update = "发布订阅模式-Topic-item.update:欢迎来到传深圳黑马训练营程序员中心!";channel.basicPublish("topic_exchange","item.update",null,message_update.getBytes());//消息-item.deleteString message_delete = "发布订阅模式-Topic-item.delete:欢迎来到传深圳黑马训练营程序员中心!";channel.basicPublish("topic_exchange","item.delete",null,message_delete.getBytes());//关闭资源channel.close();connection.close();}
}

消费者一
ConsumerOne.java

public class ConsumerOne {/**** 订阅模式消息消费者-Topic* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("topic_queue_1",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者Topic-Queue-1-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("topic_queue_1",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

消费者二

public class ConsumerTwo {/**** 订阅模式消息消费者-Topic* @param args*/public static void main(String[] args) throws IOException, TimeoutException {//创建连接对象Connection connection = ConnectionUtil.getConnection();//创建频道Channel channel = connection.createChannel();/*** 声明队列* 参数1:队列名称* 参数2:是否定义持久化队列* 参数3:是否独占本次连接* 参数4:是否在不使用的时候自动删除队列* 参数5:队列其它参数*/channel.queueDeclare("topic_queue_2",true,false,false,null);//创建消费者;并设置消息处理DefaultConsumer defaultConsumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//路由keySystem.out.println("路由key为:" + envelope.getRoutingKey());//交换机System.out.println("交换机为:" + envelope.getExchange());//消息idSystem.out.println("消息id为:" + envelope.getDeliveryTag());//收到的消息System.out.println("消费者Topic-Queue-2-接收到的消息为:" + new String(body, "utf-8"));}};//消息监听channel.basicConsume("topic_queue_2",true,defaultConsumer);//关闭资源//channel.close();//connection.close();}
}

在这里插入图片描述在执行完测试代码后,其实到RabbitMQ的管理后台找到Exchanges选项卡,点击 topic_exchange 的交换机,可以查看到如下的绑定:
在这里插入图片描述
小结
Topic主题模式可以实现 Publish/Subscribe发布与订阅模式 和 Routing路由模式 的功能;只是Topic在配置routing key 的时候可以使用通配符,显得更加灵活。

小结
RabbitMQ工作模式:
1、简单模式 HelloWorld
一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)
2、工作队列模式 Work Queue
一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)
3、发布订阅模式 Publish/subscribe
需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列 需要交换机不需要转发规则
4、路由模式 Routing
需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列 需要交换机,需要转发规则 转发规则写死了
5、通配符模式 Topic
需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列 需要交换机 需要转发规则 转发规则用通配符代替

Spring Boot整合RabbitMQ

生产者工程:

  1. application.yml文件配置RabbitMQ相关信息;
  2. 在生产者工程中编写配置类,用于创建交换机和队列,并进行绑定
  3. 注入RabbitTemplate对象,通过RabbitTemplate对象发送消息到交换机
    消费者工程:
  4. application.yml文件配置RabbitMQ相关信息
  5. 创建消息处理类,用于接收队列中的消息并进行处理

搭建生产者工程
创建生产者工程springboot-rabbitmq-producer
添加依赖:

 <!--依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

创建启动类com.itheima.ProducerApplication,代码如下:

@SpringBootApplication
public class ProducerApplication {public static void main(String[] args) {SpringApplication.run(ProducerApplication.class,args);}
}

application.yml

spring:rabbitmq:host: localhostport: 5672virtual-host: /szitheimausername: adminpassword: admin

绑定交换机和队列

@Configuration
public class RabbitMQConfig {/**** 声明交换机*/@Bean(name = "itemTopicExchange")public Exchange topicExchange(){return ExchangeBuilder.topicExchange("item_topic_exchange").durable(true).build();}/**** 声明队列*/@Bean(name = "itemQueue")public Queue itemQueue(){return QueueBuilder.durable("item_queue").build();}/**** 队列绑定到交换机上*/@Beanpublic Binding itemQueueExchange(@Qualifier("itemQueue")Queue queue,@Qualifier("itemTopicExchange")Exchange exchange){return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();}
}

搭建消费者工程

创建消费者工程springboot-rabbitmq-consumer
添加依赖:

<!--依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies>

创建启动类com.itheima.ConsumerApplication

@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class);}
}

application.yml

spring:rabbitmq:host: localhostport: 5672virtual-host: /szitheimausername: adminpassword: admin

消息监听处理类

@Component
public class MessageListener {/*** 监听某个队列的消息* @param message 接收到的消息*/@RabbitListener(queues = "item_queue")public void myListener1(String message){System.out.println("消费者接收到的消息为:" + message);}
}

测试
在生产者工程springboot-rabbitmq-producer中创建测试类com.itheima.test.RabbitMQTest,发送消息:

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMQTest {//用于发送MQ消息@Autowiredprivate RabbitTemplate rabbitTemplate;/**** 消息生产测试*/@Testpublic void testCreateMessage(){rabbitTemplate.convertAndSend("item_topic_exchange", "item.insert", "商品新增,routing key 为item.insert");rabbitTemplate.convertAndSend("item_topic_exchange", "item.update", "商品修改,routing key 为item.update");rabbitTemplate.convertAndSend("item_topic_exchange", "item.delete", "商品删除,routing key 为item.delete");}
}

在这里插入图片描述
在这里插入图片描述
小结

  • 继承父工程,引入依赖坐标
  • 创建启动类
  • 配置rabbitMQ服务器信息
  • 发送和接收
    • RabbitTemplate
    • RabbitListener
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 月均收入15k的数据产品经理=数据+产品经理?

    (选填) 图片描述现在,越来越多的招聘岗位要求产品经理会数据分析。甚至有公司更加过分,直接发出招聘岗位:诚招“数据策略经理”。 数据策略经理到底是怎样的存在? 带着好奇,找到了对数据策略经理的岗位职责要求:数据策略岗位职责业务分析:为业务线建立数据支持体系,输出日…...

    2024/4/28 7:59:47
  2. 维语维文理论驾考宝典科目一四驾驶证学车驾照考试题库软件APP

    维语学车证 是一款主要为维吾尔语驾驶理论考试的学员而准备的软件在这款应用中,可以在维语和汉语之间自如切换 使用起来很方便切换成维语的时候,就全是维吾尔语的驾照考试题, 并且同步2020驾照考试科目一、科目四新规题库。维语学车证的主要亮点有: 1、语音极速版:技巧讲解…...

    2024/4/27 21:58:46
  3. 智能车竞赛创意组别对应的FQA

    ■ 前言在2020年7月2日进行第十五届全国大学 智能汽车竞赛 的 创意组竞赛直播 。 在这次活动中主要进行以下方面的活动:公布复选赛最终名单 复选赛赛程详细解读 常见问题说明(FQA) 赛事相关第十五届智能车竞赛问题在线答疑本文档是总结了一下FQA内容进行现场解答,这些问题来…...

    2024/4/28 0:28:16
  4. 全民5G年战火升级 荣耀两款5G力作齐发领跑“下半场”

    7月2日,荣耀夏季5G新品发布会大幕拉开,荣耀30青春版和大屏手机荣耀X10 Max正式发布。作为荣耀X10系列的最新产品,荣耀X10 Max越级进化,搭载7.09英寸RGBW护眼阳光屏、对称双扬声器、5G双模全网通、5000mAh大电池、多功能NFC等。而作为荣耀30系列的最新产品,荣耀30青春版全面…...

    2024/4/28 11:51:38
  5. 如果你是,年薪80万和阿里P7月薪36K,会怎么选?

    跟大家表达了一下最近纠结苦闷的心情,不知道该如何选择offer,拿了两个offer,一个现金每年80万,大集团下区块链技术研发带团队10人+高级技术经理,另一个阿里巴巴新兴事业部P7,带团队3、4人,月薪36K,五万期权,你们会怎么选?楼主有BAT三家互联网大厂中的某一个背景,并且…...

    2024/4/27 13:28:07
  6. css+js+jq实训笔记

    css+js+jq实训笔记css第一天css第二天css第三天css第四天css第五天css第六天js第一天js第二天js第三天js第四天js第五天js第六天jq第一天jq第二天jq第三天 css第一天 1、平时有空多记单词(很多新单词) 2、用谷歌浏览器调试代码 3、多看看公众号和网站(对面试有很大的帮助,也…...

    2024/4/28 16:09:55
  7. 企业数字化转型--银行数字化转型的战略设计与技术管理

    数字化转型总体路径当前各类银行都在信息化上投入不菲,但总体而言,尚未达到信息化的高级阶段,那么,进入数字化阶段之前应当是先完成信息化的高级阶段。但是,如果将两者截然分开去谈,则忽视了业务、技术演化的连续性,也会让读者在思考上产生不必要的“断层”,因此,本书…...

    2024/4/27 23:31:41
  8. 如何在GitHub上传大文件(≥100M)

    学习工作中,有时会遇到需要将一些资源上传到GitHub的仓库(repository)上去,比如一些训练完的模型。但GitHub对于直接上传的文件有大小限制,超过100M的文件需要使用Git LFS才能上传。以下是我根据各位大神和自己的实操经历,总结的上传流程。 如何在GitHub上传大文件(≥10…...

    2024/4/28 17:22:03
  9. Android NDK - C语言 控制流程

    for while switch break continue...

    2024/4/28 9:18:47
  10. KMP算法--字符串匹配

    字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就…...

    2024/4/27 16:13:03
  11. 除了teamviewer,还有什么远程控制服务器的工具?

    TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制的应用程序,桌面共享和文件传输的简单且快速的解决方案。为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamViewer 即可,而不需要进行安装(也可以选择安装,安装后可以设置开机运行)。该软件第一次启动…...

    2024/4/28 23:58:27
  12. 【Android开发--新手必看篇】Drawable类的使用

    Android笔记 ​ ——自定义缩放控件 【若对该知识点有更多想了解的,欢迎私信博主~~】 Drawable类的介绍:https://blog.csdn.net/feather_wch/article/details/79124608 Math类的介绍:https://blog.csdn.net/a22422931/article/details/52129417 制作: package com.exampl…...

    2024/4/28 17:26:43
  13. 心电信号的预处理入门(matlab实现)

    心电信号属于随机信号,且幅值较低,采集之后需要经过放大器放大才能进行波形观测。采集过程中的主要噪声源有工频干扰、基线漂移、肌电干扰和随机噪声 。对这些干扰进行分析后,选择合适的方法去除这些噪声,才能得到相对真实的心电信号,为下一步的诊断做准备。1)工频干扰我…...

    2024/4/16 15:10:40
  14. 【erlang】数组内是否存在某元素、不用api实现

    数组内是否存在某元素api方法:lists:memberL = [1,2,3,4,5].%% lists:member 返回 true 或者 false lists:member(2,L).%%结果是true列表推导[H || H <- L, H == 2 ].其他方法方法一 case ofexist([H|T],Ch)->case H == Ch oftrue -> true;false -> exist(T,Ch)e…...

    2024/4/22 5:35:30
  15. 移动web 15-2 Flex布局 携程移动端项目总结

    三.局部导航栏 用属性选择器得时候 li 后面一定要用空格隔开,不然不生效 .local-nav li [class^="local-nav-icon"] {width: 32px;height: 32px;background: url(../images/localnav_bg.png) no-repeat 0 0;background-size: 32px auto;margin-top: 8px; } .local-na…...

    2024/4/16 15:11:51
  16. 泛微oa 单点登录

    https://www.jianshu.com/p/db2ac4870c8a...

    2024/4/16 15:11:00
  17. ActiveMQ学习之路 二(spring实现)

    ActiveMQ Topic的实现 maven配置xml <dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>5.8.0</version></dependency><dependency><groupId>org.springframewo…...

    2024/4/16 15:11:31
  18. 学习笔记(1):玩转Linux:常用命令实例指南-让你的虚拟机用起来更顺手:VMware(二)...

    立即学习:https://edu.csdn.net/course/play/26264/331646?utm_source=blogtoedu安装vmware tool,使用复制命令:cp解压命令:tar使用命令sudo,赋予脚本权限,进行安装安装完,使用删除命令 rm 删除安装包...

    2024/4/19 20:19:58
  19. 剑指offer刷题:滑动窗口的最大值

    题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3…...

    2024/4/16 15:10:30
  20. 【Android开发--新手必看篇】DrawerLayout 抽屉布局(以及与SlidingPaneLayout的不同)

    Android笔记 ​ ——各类控件的使用(控件)-抽屉布局 【若对该知识点有更多想了解的,欢迎私信博主~~】 抽屉布局:android.support.v4.widget.DrawerLayout 说明:抽屉布局可以实现侧滑菜单效果 属性:XML属性 说明layout_width 布局宽度layout_height 布局高度用法: <…...

    2024/4/16 15:10:55

最新文章

  1. 漏洞扫扫工具合集

    综合类扫描工具 AWVS Acunetix一款商业的Web漏洞扫描程序&#xff0c;它可以检查Web应用程序中的漏洞&#xff0c;如SQL注入、跨站脚本攻击、身份验证页上的弱口令长度等。它拥有一个操作方便的图形用户界面&#xff0c;并且能够创建专业级的Web站点安全审核报告。新版本集成了…...

    2024/4/29 2:22:17
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. WP Rocket v3.15.10最新版强大的WordPress缓存插件

    WP Rocket v3.15.10是一款强大的WordPress缓存插件&#xff0c;它通过一系列优化措施来提高网站的速度和性能。 WP Rocket与免费缓存插件相比&#xff0c;提供了更丰富和高级的自定义设置功能。这些包括媒体优化、预加载、延迟加载和数据库优化等。特别是对于没有任何缓存技术…...

    2024/4/21 23:17:25
  4. Redis命令-List命令

    4.6 Redis命令-List命令 Redis中的List类型与Java中的LinkedList类似&#xff0c;可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似&#xff1a; 有序元素可以重复插入和删除快查询速度一般 常用来存储一个有序数据&#xff…...

    2024/4/24 13:42:42
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

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

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

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

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

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

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

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

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

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

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

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

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

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

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/4/27 8:32:30
  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