SpringBoot高级篇学习笔记(四、缓存与消息)
九、SpringBoot与缓存
1. JSR-107
用得少,主要用的是Spring缓存抽象和缓存中间件(如redis)。
2. Spring缓存抽象
搭建基本环境
- 新建项目
- 新建数据库
- 新建数据表
SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS `department`; CREATE TABLE `department` (`id` int(11) NOT NULL AUTO_INCREMENT,`departmentName` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` (`id` int(11) NOT NULL AUTO_INCREMENT,`lastName` varchar(255) DEFAULT NULL,`email` varchar(255) DEFAULT NULL,`gender` int(2) DEFAULT NULL,`d_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO employee(lastName,email,gender,d_id)VALUES('zhangsan','zhangsan@qq.com',1,1); INSERT INTO employee(lastName,email,gender,d_id)VALUES('lisi','lisi@qq.com',0,2);
- 创建JavaBean,在com/angenin/cache下新建一个bean包,然后新建和数据表对应的两个bean
Department
Employeepackage com.angenin.cache.bean;public class Department {private Integer id;private String departmentName;public Department() {super();// TODO Auto-generated constructor stub}public Department(Integer id, String departmentName) {super();this.id = id;this.departmentName = departmentName;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getDepartmentName() {return departmentName;}public void setDepartmentName(String departmentName) {this.departmentName = departmentName;}@Overridepublic String toString() {return "Department [id=" + id + ", departmentName=" + departmentName + "]";} }
package com.angenin.cache.bean;public class Employee {private Integer id;private String lastName;private String email;private Integer gender; //性别 1男 0女private Integer dId;public Employee() {super();}public Employee(Integer id, String lastName, String email, Integer gender, Integer dId) {super();this.id = id;this.lastName = lastName;this.email = email;this.gender = gender;this.dId = dId;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Integer getdId() {return dId;}public void setdId(Integer dId) {this.dId = dId;}@Overridepublic String toString() {return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + ", dId="+ dId + "]";} }
- 整合Mybatis操作数据库,配置数据源信息,在resources/application.properties中添加:
spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache?serverTimezone=GMT spring.datasource.username=root spring.datasource.password=123456 #Driver可不写,会根据连接自动添加 #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#开启驼峰命名规则 mybatis.configuration.map-underscore-to-camel-case=true
- 在cache包下新建一个mapper包,用于存放mapper接口,并写上对应mapper接口。
EmployeeMapperpublic interface EmployeeMapper {@Select("SELECT * FROM employee WHERE id=#{id}")Employee getEmpById(Integer id);@Insert("INSERT INTO employee(lastName,email,gender,d_id)VALUES(#{lastName},#{email},#{gender},#{dId})")void insertEmployee(Employee employee);@Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id=#{id}")void updateEmp(Employee employee);@Delete("DELETE FROM employee WHERE id=#{id}")void deleteEmpById(Integer id);}
- 在Springboot01CacheApplication主配置类上加上
@MapperScan("com.angenin.cache.mapper")
- 在test目录下的Springboot01CacheApplicationTests测试类中测试
@SpringBootTest class Springboot01CacheApplicationTests {@AutowiredEmployeeMapper employeeMapper;@Testvoid contextLoads() {Employee employee = employeeMapper.getEmpById(1);System.out.println(employee);}}
- 在cache包下新建service/EmployeeService
@Service public class EmployeeService {@AutowiredEmployeeMapper employeeMapper;public Employee getEmp(Integer id){System.out.println("查询" + id + "号员工");Employee emp = employeeMapper.getEmpById(id);return emp;}}
- 在cache包下新建controller/EmployeeController
@RestController public class EmployeeController {@AutowiredEmployeeService employeeService;@GetMapping("/emp/{id}")public Employee getEmployee(@PathVariable("id") Integer id){Employee emp = employeeService.getEmp(id);return emp;}}
- 启动项目,在浏览器输入
http://localhost:8080/emp/2
使用缓存
基本步骤:
- 开启基于注解的缓存(@EnableCaching)
- 标注缓存注解(@Cacheable、@CachePut、@CacheEvict)
@EnableCaching(开启基于注解的缓存)
在主配置类上加上@EnableCaching,开启基于注解的缓存。
缓存注解
CacheManager管理多个Cache组件,对缓存的真正CRUD操作在Cache组件中,每个缓存组件都有自己唯一的名字。
@Cacheable
属性
- cacheNames/value:指定缓存组件的名字,将方法的返回结果放到哪个缓存中是数组的方式,可以指定多个缓存。
- key:缓存数据使用的key,可以用它来指定key,默认使用方法参数的值(如传过来一个1,那么1为key,value为返回值),可以编写SpEL(如参数id的值可以用#id,#a0,#p0,#root.args[0]来取出)。
- keyGenerator:key的生成器,可以自己指定key的生成器的组件id(自己注册的返回KeyGenerator的组件)。(key和keyGenerator二选一)
import org.springframework.cache.interceptor.KeyGenerator;//自定义key的生成器 @Configuration public class MyCacheConfig {@Bean("myKeyGenerator")public KeyGenerator keyGenerator(){return new KeyGenerator() {@Overridepublic Object generate(Object o, Method method, Object... objects) {return method.getName() + "[" + Arrays.asList(objects).toString() + "]";}};} }
- cacheManager:指定缓存管理器
- cacheResolver:指定获取解析器(与cacheManager二选一,作用相同)
- condition:指定符合条件的情况下才缓存。(例:condition = “#a0>1”(当第一个参数大于1才进行缓存))
- unless:除非(否定缓存),当unless指定的条件为true,方法的返回值就不会被缓存,可以对获取到的结果进行判断(例1:#a0==2(当第一个参数为2时不缓存))(例2:unless = “#result == null”(#result为获取的结果,对获取的结果进行非空判断,如果为空,就不缓存))。(condition与unless相反,一个满足就缓存,一个满足不缓存)
- sync:是否使用异步模式,默认为false。(开启后(1)不支持unless了,(2)只能指定一个缓存,(3)不能合并其他与缓存相关的操作)
- 在application.properties中添加
logging.level.com.angenin.cache.mapper=debug
开启日志。 - 然后运行项目,多次在浏览器中输入
http://localhost:8080/emp/2
查询相同用户,从控制台输入的日志可以看出每次都对数据库进行查询。
- 在Springboot01CacheApplication主配置类上加上
@EnableCaching
开启基于注解的缓存。 - 在EmployeeService的getEmp方法上添加
@Cacheable(value = "emp")
,将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中获取,不用调用方法。 - 重新运行项目,多次在浏览器中输入
http://localhost:8080/emp/2
查询相同用户,控制台只在第一次查询时查询了数据库,并且之后的查询连EmployeeService的getEmp方法都没进入,数据直接从缓存中获取。
@CachePut(既调用方法,又更新缓存)
- @CachePut与@Cacheable的区别
@Cacheable
是先到缓存里查找有没有要查的数据,如果有就直接用缓存里的数据,不调用方法操作数据库,如果没有再调用方法操作数据库并把返回的数据保存到缓存里。(前置处理)(用于查询)
@CachePut
是每次都先调用方法进行数据库操作,并把返回的数据保存到缓存里,如果缓存里已经有了就覆盖原来的数据。(后置处理)(用于修改) - 运行时机:先调用目标方法,再将目标方法的返回结果保存到缓存中。(属性比@Cacheable少了一个sync,其他相同)
- 应用场景:修改了数据库的某个数据,同时更新缓存。
例:
在EmployeeMapper中添加
@CachePut(value = "emp")public Employee updateEmp(Employee employee){System.out.println("updateEmp:" + employee);employeeMapper.updateEmp(employee);return employee;}
在EmployeeController中添加
@GetMapping("/emp")public Employee update(Employee employee){Employee emp = employeeService.updateEmp(employee);return emp;}
- 启动项目,浏览器中输入
http://localhost:8080/emp/1
查询1号员工,让1号员工数据放到缓存中。(此时放入缓存的数据:key为1,value为1号员工数据)
- 在浏览器中输入
http://localhost:8080/emp?id=1&lastName=zhangsan&email=zhangsan@163.com
,修改1号员工信息。(此时放入缓存的数据:key为传入的employee对象,value为更新后1号员工数据)
- 输入
http://localhost:8080/emp/1
再次查询1号员工信息,结果是没更新的1号员工数据。
- 所以需要在@CachePut中添加
key = "#employee.id"
,指定更新后的保存到缓存的key与查询的相同。 - 先修改数据库中1号员工的数据。
- 重复刚刚的步骤,先查询、插入再查询,结果为更新后的员工信息。
@CacheEvict(缓存清除)
(用于删除)(后置处理,可用beforeInvocation属性改为前置)
属性比@Cacheable少了sync,多了allEntries和beforeInvocation。
-
allEntries:清空value指定缓存的数据,默认为false。
-
beforeInvocation:缓存清除是否在目标方法之前执行,默认为false。(如果改为之前执行,那么是先删除,然后再执行目标方法,就算目标方法出现异常,数据也删除了,而默认是后置,如果目标方法出现异常,则数据没删除)
例:
在EmployeeMapper中添加@CacheEvict(value = "emp", key = "#id") public void deleteEmp(Integer id){System.out.println("deleteEmp:" + id);//数据库只有两个数据,这里就不删除了,只清理缓存中的数据//employeeMapper.deleteEmpById(id); }
在EmployeeController中添加
@GetMapping("/delemp") public String deleteEmp(Integer id){employeeService.deleteEmp(id);return "success"; }
-
启动项目,在浏览器中输入
http://localhost:8080/emp/1
查询1号员工,把数据放到缓存中。
-
输入
http://localhost:8080/delemp?id=1
删除1号员工。(因为没真正调用删除,所以只是删除缓存)
-
再次输入
http://localhost:8080/emp/1
查询1号员工,重新进行数据库查询,删除缓存数据成功。
@Caching(三合一)
@Caching是@Cacheable、@CachePut和@CacheEvict的组合,用于多个复杂的规则。
例:
在EmployeeMapper中添加:
@Select("SELECT * FROM employee WHERE lastName=#{lastName}")Employee getEmpByLastName(String lastName);
在EmployeeService中添加:
@Caching(cacheable = { //cacheable为@Cacheable的数组@Cacheable(value = "emp", key = "#lastName") //把传入的lastName作为key,value为返回结果放入缓存中},put = { //是@CachePut的数组//加了@CachePut之后,每次都会执行目标方法@CachePut(value = "emp", key = "#result.id"), //把返回结果的id作为key,value为返回结果放入缓存中@CachePut(value = "emp", key = "#result.email") //以邮箱为key,放入缓存中}//evict为@CacheEvict的数组)public Employee getEmpByLastName(String lastName){Employee employee = employeeMapper.getEmpByLastName(lastName);return employee;}
在EmployeeController中添加:
@GetMapping("/emp/lastName/{lastName}")public Employee getEmpByLastName(@PathVariable("lastName") String lastName){return employeeService.getEmpByLastName(lastName);}
启动项目,在浏览器输入http://localhost:8080/emp/lastName/zhangsan
,按照用户名查询。
@CacheConfig(缓存配置注解)
可以在EmployeeService类上加上@CacheConfig注解,在@CacheConfig里写上cacheNames = "emp"
属性,那么这个缓存配置类里的缓存注解都可以不加value = "emp"
。
即:在@CacheConfig中添加的属性,在这个配置类的所有缓存注解都有@CacheConfig里的属性。
缓存的原理
缓存的自动配置类:CacheAutoConfiguration
缓存的配置类(优先级是按照从上到下顺序,上面的优先级高于下面的):
默认生效的缓存配置类
在application.properties加上
#开启自动配置报告(项目启动的时候就会打印配置报告)
debug=true
- Positive matches里只有SimpleCacheConfiguration,说明只有SimpleCacheConfiguration生效(默认生效的缓存配置类)。
- SimpleCacheConfiguration:给容器中注册了一个ConcurrentMapCacheManager(缓存管理器)组件。
- ConcurrentMapCacheManager:可以获取和创建ConcurrentMapCache类型的缓存组件。
- ConcurrentMapCache:将数据保存在ConcurrentMap中。
- ConcurrentMapCacheManager:可以获取和创建ConcurrentMapCache类型的缓存组件。
- SimpleCacheConfiguration:给容器中注册了一个ConcurrentMapCacheManager(缓存管理器)组件。
@Cacheable的运行流程
- 方法运行前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取(CacheManager先获取相应的缓存),第一个获取缓存如果没有Cache组件就会自动创建,然后把创建的Cache对象放到cacheMap保存。
- 获取到Cache后,去Cache中查找缓存的内容,使用一个key,默认是方法的参数值。key是按照某种策略生成的,默认使用keyGenerator(SimpleKeyGenerator)生成。
SimpleKeyGenerator生成key的默认策略- 如果没参数:key = new SimpleKey()
- 如果一个有参数:key = 参数的值
- 如果有多个参数:key = new SimpleKey(params)
- 如果没查到缓存,就调用目标方法。
- 将目标方法返回的结果放到缓存里。
总结:@Cacheable标注的方法执行之前先检查缓存中有没有这个数据,默认按照参数值作为key去查询缓存,如果没有就运行方法并将结果放入缓存,之后再调用就可以直接使用缓存中的数据。
核心:
- 使用CacheManager(ConcurrentMapCacheManager)按照名字得到Cache(ConcurrentMapCache)组件
- key使用keyGenerator(SimpleKeyGenerator)生成的
3. 整合Redis
springboot默认使用的是ConcurrentMapCacheManager==>ConcurrentMapCache,将数据保存到ConcurrentMap<String, Cache>中。
一般在开发中使用缓存中间件(redis、memcached、ehcache)比使用springboot原生缓存比较多。
redis的官网:https://redis.io/
redis的中文官网:http://redis.cn/
搭建环境
使用之前在linux上docker拉取的redis镜像docker pull redis
。(Docker基础入门学习笔记,NoSQL-Redis学习笔记)
需要在本地下载一个redis连接工具(例如:Redis Desktop Manager简称RDM(下载 密码:vpjv))。
- 登上linux,如果出现这个错误,用
systemctl start docker.service
启动docker。(可以用``命令设置docker开机启动)
docker run -d -p 6379:6379 --name myRedis redis:5.0.5
运行redis。
- 打开RDM测试redis连接。(我的是mac系统,windows版的界面可能不一样,刚开始打开是英文版的,可以在右上角设置里改成中文)
测试连接后点击确定
- 在RDM上测试redis命令(redis所有的命令可以在官方http://redis.cn/commands.html查看)
- 在项目的pom.xml中引入redis的starter。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
- 在项目application.properties中配置redis。
#配置redis(linux的ip) spring.redis.host=10.211.55.17
- 在Springboot01CacheApplicationTests测试类中测试
@Autowired StringRedisTemplate stringRedisTemplate; //操作k-v都是字符串的@Autowired RedisTemplate redisTemplate; //操作k-v都是对象的/*** Redis常见的五大数据类型* String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)* stringRedisTemplate.opsForValue() String(字符串)* stringRedisTemplate.opsForList() List(列表)* stringRedisTemplate.opsForSet() Set(集合)* stringRedisTemplate.opsForHash() Hash(散列)* stringRedisTemplate.opsForZSet() ZSet(有序集合)** redisTemplate的方法和stringRedisTemplate,不同的是redisTemplate操作k-v都是对象的,而操作k-v都是字符串的*/ //测试stringRedisTemplate @Test public void test01(){stringRedisTemplate.opsForValue().append("msg", "hello");String msg = stringRedisTemplate.opsForValue().get("msg");System.out.println(msg);stringRedisTemplate.opsForList().leftPush("mylist", "666");stringRedisTemplate.opsForList().leftPush("mylist", "777");String mylist = stringRedisTemplate.opsForList().leftPop("mylist");System.out.println(mylist); }
再添加一个方法来测试redisTemplate
运行后出现错误:@Test public void test02(){Employee employee = employeeMapper.getEmpById(1);//如果保存对象,默认使用jdk系列化机制,系列化后的数据保存到redis中redisTemplate.opsForValue().set("emp01", employee); //append是追加字符串的,set才是添加对象的,并且每次提交相同的key时,原来的value会被新的value覆盖 }
DefaultSerializer requires a Serializable payload but received an object of type
(需要系列化Employee)
让Employee类实现Serializable完成系列化后,再重新运行。
将数据以json的形式保存到redis:- 自己将对象转为json(如使用gson)
- 修改redisTemplate默认的系列化(默认使用的是jdk的系列化器)
新建一个MyRedisConfig配置类
如果在测试类中添加:@Configuration public class MyRedisConfig {@Beanpublic RedisTemplate<Object, Object> empRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);//设置默认的系列化器为Jackson2JsonRedisSerializertemplate.setDefaultSerializer(serializer);return template;} }
//自定义RedisTemplate @Autowired RedisTemplate<Object, Object> empRedisTemplate;@Test public void test03(){Employee employee = employeeMapper.getEmpById(1);empRedisTemplate.opsForValue().set("emp01", employee); }
使用redis缓存
启动项目,浏览器输入http://localhost:8080/emp/1
,redis多出了使用jdk系列化后的数据。
在MyRedisConfig中自定义一个cacheManager,让保存到redis的数据为json格式。(当容器中有多个RedisCacheManager时,需要用@Primary指定哪个是默认CacheManager,否则会报错)
//springboot参数需要传入一个RedisConnectionFactory//新建一个RedisCacheConfiguration对象可以来定制缓存的一些规则//如果注册了多个RedisCacheManager,如果不指定哪个是默认的RedisCacheManager就会报错,//@Primary //@Primary指定默认使用的RedisCacheManager@Beanpublic RedisCacheManager myCacheManager(RedisConnectionFactory connectionFactory) {//RedisCacheConfiguration.defaultCacheConfig()会返回一个RedisCacheConfiguration对象//serializeValuesWith为设置系列化RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer//(new Jackson2JsonRedisSerializer<Object>(Object.class)));//GenericJackson2JsonRedisSerializer为通用Json序列化器,不需要传参(new GenericJackson2JsonRedisSerializer()));//使用RedisCacheConfiguration创建RedisCacheManagerRedisCacheManager cm = RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).build();return cm;}
- 在mapper包里新建一个DepartmentMapper
public interface DepartmentMapper {@Select("SELECT * FROM department WHERE id=#{id}")Department getDeptById(Integer id); }
- 在service包里新建一个DepartmentService
@Service public class DepartmentService {@AutowiredDepartmentMapper departmentMapper;@Cacheable(cacheNames = "dept")public Department getDeptById(Integer id){System.out.println("查询部门" + id);Department department = departmentMapper.getDeptById(id);return department;} }
- 在controller包里新建一个DepartmentController
@RestController public class DepartmentController {@AutowiredDepartmentService departmentService;@GetMapping("/dept/{id}")public Department getDept(@PathVariable("id") Integer id){return departmentService.getDeptById(id);} }
- 在数据库中的department插入一条数据
- 启动项目,输入
http://localhost:8080/dept/1
查询1号部门
- 再次查询出现错误,LinkedHashMap无法转换为Department
原因是因为redis返回回来的是一个LinkedHashMap
解决办法:在MyRedisConfig的myCacheManager中new GenericJackson2JsonRedisSerializer时传入String.valueOf(JsonTypeInfo.As.PROPERTY)即可解决类型转换问题。
使用缓存管理器主动把数据添加到缓存里
修改DepartmentService中的getDeptById方法
@Qualifier("myCacheManager") //指定使用myCacheManager缓存管理器@AutowiredRedisCacheManager myCacheManager;@Cacheable(cacheNames = "dept")public Department getDeptById(Integer id){System.out.println("查询部门" + id);Department department = departmentMapper.getDeptById(id);//获取指定缓存Cache dept = myCacheManager.getCache("dept");dept.put(department.getId(), department);return department;}
原理
- CacheManager创建Cache组件,缓存组件来实际给缓存中存取数据。
- 引入redis的starter,默认的SimpleCacheConfiguration不生效了,换成RedisCacheConfiguration生效。
- 这是因为SimpleCacheConfiguration类上有
@ConditionalOnMissingBean(CacheManager.class)
,而RedisCacheConfiguration类给容器中注册了一个RedisCacheManager组件(RedisCacheConfiguration的优先级比SimpleCacheConfiguration高)。- RedisCacheManager帮我们创建RedisCache来作为缓存,RedisCache通过操作redis缓存数据。
- 默认保存数据k-v都是object,利用系列化保存。
- 引入了redis的starter,cacheManager变为RedisCacheManager。
- 默认创建的RedisCacheManager操作redis的时候使用的是RedisTemplate<Object, Object>。
- RedisTemplate<Object, Object>是默认使用jdk的系列化机制的。
- 转为json需要自定义cacheManager。
十、SpringBoot与消息
1. JMS与AMQP
2. RabbitMQ
3. 整合RabbitMQ
安装RabbitMQ
在linux的docker里拉取RabbitMQ镜像docker pull rabbitmq:3.8.3-management
(management是带web的管理界面)。
5672是客户端和RabbitMQ进行通信的端口。
15672是管理界面访问web页面的端口。
docker run -d -p 5672:5672 -p 15672:15672 --name myRabbitMQ 容器id
在浏览器输入http://10.211.55.17:15672/
(10.211.55.17是我linux的ip)
账号密码都为guest
使用RabbitMQ
- 新建三个交换器(exchange.direct(点对点)、exchange.fanout(广播)、exchange.topic(模糊匹配))
- 新建队列(atguigu、atguigu.news、atguigu.emps、gulixueyuan.news)
- 点回Exchanges,把4个队列和交换器绑定。
- 点击进入exchange.direct
- 点击进入exchange.direct
- 点击进入exchange.topic(与前两个不同的是绑定的路由键用了#和*(#代表0个或多个单词,*代表一个单词))
- 点击进入exchange.direct
- 给每个交换器发送消息,测试队列的接收情况
- 点进exchange.direct
点进atguigu队列,查看消息
- 点进exchange.fanout
因为exchange.fanout是广播型的交换器,所以只要绑定了的队列,都会发送消息。
- 点进exchange.topic
atguigu开头的都加了两次
atguigu.news符合atguigu.#和*.atguigu,所以队列都接收到消息。
- 点进exchange.direct
创建项目
在application.properties中配置RabbitMQ的基本信息
spring.rabbitmq.host=10.211.55.17
#不写,默认端口为5672
#spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#不写,默认为/
#spring.rabbitmq.virtual-host=/
自动配置
RabbitAutoConfiguration中
- RabbitProperties封装了RabbitMQ的配置
- 自动配置了连接工厂ConnectionFactory
- 自动配置了RabbitTemplate:给RabbitMQ发送和接收消息
- 自动配置了AmqpAdmin:RabbitMQ系统管理功能组件(创建和删除Queue、Exchange、Binding)
使用RabbitTemplate
在测试类中
-
测试单播
@AutowiredRabbitTemplate rabbitTemplate;//1. 单播(点对点)//发送数据@Testpublic void test01(){//使用send可以自定义信息体的内容和消息头(需要自定义消息头使用)//rabbitTemplate.send(exchang, roteKey, message);//convertAndSend只需要传入要发送的对象,自动系列化发送给RabbitMQ(object默认当成消息体)//rabbitTemplate.convertAndSend(exchang, roteKey, object);Map<String, Object> map = new HashMap<>();map.put("msg", "第一个消息");map.put("data", Arrays.asList("hello", 123, true));//对象被默认系列化(默认使用jdk的系列化)以后发送出去rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", map);}
在atguigu.news队列接收到的数据。
在测试类中接收队列里的消息@Testpublic void test02(){//receive返回的是message,包含消息头和消息体//rabbitTemplate.receiveAndConvert(queueName);//receiveAndConvert会先把消息体转为原来的数据类型再返回//rabbitTemplate.receiveAndConvert(queueName);Object o = rabbitTemplate.receiveAndConvert("atguigu.news");System.out.println(o.getClass());System.out.println(o);}
队列中被接收的数据就会被删除。RabbitTemplate在发送消息时,由messageConverter负责系列化,messageConverter默认使用的是SimpleMessageConverter,SimpleMessageConverter里面使用的就是jdk的系列化规则。
修改系列化规则:
在config包下新建MyAMQPConfig配置类import org.springframework.amqp.support.converter.MessageConverter;@Configuration public class MyAMQPConfig {//自定义MessageConverter,并添加到容器中@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}}
重新发送数据后在exchange.direct队列中接收到的消息。
在测试类中接收也能把json转为原来的类型。
-
测试广播
在bean包里新建一个Book类public class Book {private String bookName;private String author;//有参无参构造器,get/set方法,toString方法 }
在测试类中添加
//2. 广播 @Test public void test03(){//因为是广播,不需要roteKey,所以第二个参数roteKey留空rabbitTemplate.convertAndSend("exchange.fanout", new Book("西游记", "吴承恩")); }
每个队列都接收到消息,并且自定义的类也可以识别转为json形式(已经提前清空了所有队列的消息(点进队列,下面有个Delete按钮,有个Purge Messages按钮可以清空队列数据))
实际使用
在实际的开发中,需要监听指定的队列,一旦监听的队列更新,就需要执行相应的操作。
@EnableRabbit
在Springboot02AmqpApplication主配置类上添加@EnableRabbit
注解,开启基于注解的RabbitMQ。
@RabbitListener
在service包下新建BookService(@RabbitListener
注解监听指定队列)
@Service
public class BookService {//@RabbitListener监听队列//queues属性为数组,可以监听多个队列@RabbitListener(queues = {"atguigu.news"})public void receive(Book book){System.out.println("收到消息" + book);}}
接收到刚刚保存的book对象
如果需要接收消息头信息
//是org.springframework.amqp.core的Message包
//import org.springframework.amqp.core.Message;@RabbitListener(queues = "atuguigu.news")public void receive2(Message message){//消息头System.out.println(message.getMessageProperties());//消息体System.out.println(message.getBody());}
在测试类中往队列发送消息(此时监听器生效,会在队列写入数据后触发监听器执行BookService的receive方法)
获取到的消息体还没反系列化。
使用AmqpAdmin
@AutowiredAmqpAdmin amqpAdmin;@Testpublic void create(){//创建Exchange//declareExchange需要传入一个Exchange对象//new DirectExchange时可以传入规则name, durable, autoDelete, arguments(这里只传入一个name)amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange.direct"));System.out.println("创建完成");}
//第一个参数为队列名,第二个为是否持久化
amqpAdmin.declareQueue(new Queue("amqpadmin.queue", true));
//创建绑定规则//第一个参数为目的地,第二为目的地类型(Binding.DestinationType.QUEUE和Binding.DestinationType.EXCHANGE)// 第三个是交换器名,第四个是路由键,第五个是参数头信息amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange.direct", "amqp.haha", null));
点进amqpadmin.exchange.direct交换器,绑定了amqp.queue队列,并且路由键为amqp.haha。
//删除QueueamqpAdmin.deleteQueue("amqpadmin.queue");//删除ExchangeamqpAdmin.deleteExchange("amqpadmin.exchange.direct");
下一篇笔记:待更新
学习视频(p1-p19):https://www.bilibili.com/video/BV1KW411F7oX?p=1
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 医用呼吸机Everspin MRAM应用笔记
由于当前疫情的大流行,增加医用呼吸机的供应迫在眉睫。Everspin Technologies提供了一种独特的MRAM存储技术,它将为这类设备的电子系统设计带来好处。 呼吸机是一种通过将可呼吸的空气移入和移出肺部来提供机械通气的机器,用于向身体不能呼吸或呼吸不充分的患者输送呼吸。现…...
2024/5/8 16:07:47 - 小试 Xcode 逆向:App 内存监控原理初探(逆向技术必看)
前言 最近看到公司同事的《iOS内存那些事》系列文章,其中的一篇文章讲了他在研究WebKit中内存管理的时候,发现可以用phys_footprint来衡量内存,其结果和xcode debug显示的值基本一致。文章通读下来,收获颇丰~回味之余,突然脑洞了一下,为啥不直接逆向一下Xcode,学习一下x…...
2024/5/8 20:11:32 - 谁再问我如何写出没有Bug的代码,我上去就是一jio!
本文的一些观点可能会有少部分人不赞同,我也只是简单表达一下自己的想法。1947 年 9 月 9 日,美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 MarkII 和 MarkIII 计算机进行研究工作。她的团队跟踪到 MarkII 上的一个错误,操作人员发现是由于一只飞蛾钻到了 MarkI…...
2024/4/24 8:44:13 - SpringCloud注册中心的服务治理
源于蚂蚁课堂的学习,点击这里查看(老余很给力) 前言 所谓服务治理,就是管理服务之间相互依赖调用的混乱。没有注册中心前,服务之间调用其实是通过配置文件指定需要访问服务的ip、端口等访问信息的, 这样一旦被调用方地址信息发生变化,调用者需及时修改其配置,再重新发布…...
2024/4/24 8:44:11 - Linux下MySQL定时自动完整备份(mysqldump+crontab)
1、本文主要内容实现数据库全量备份实现定时执行备份实现定时清理7天之前的备份2、工具mysql,mysqldump,crontab1、备份目录准备#mysql专用目录mkdir /mysql#mysql备份目录mkdir /mysql/backup#mysql备份脚本mkdir /mysql/backup/scripts#mysql备份文件mkdir /mysql/backup/fil…...
2024/5/8 14:35:15 - Python导入包时,包名下有红线
选中当前文件夹,右键,选择 Mark Directory as,将当前文件夹选中为Sources Root与 Resource Root...
2024/4/26 8:26:56 - 【Linux】 文件的归档(打包)与压缩处理
一、文件的压缩与解压缩1、常见的压缩文件扩展名*.gzgzip程序压缩的文件*.bz2bzip2程序压缩的文件*.tartar程序打包的数据,并没有经过压缩*.tar.gztar程序打包的文件,其中经过gzip的压缩*.tar.bz2tar程序打包的文件,其中经过bzip2的压缩2、Linux上常见的压缩命令:gzip 与 b…...
2024/5/8 20:09:35 - CentOS 6/7系统更改Mysql 5.7的默认字符集编码为utf8
查看当前字符集编码 [root@localhost ~]# mysql -uroot -p123qqq...A ... mysql> show variables like %char%; +--------------------------------------+----------------------------+ | Variable_name | Value | +--------…...
2024/4/24 8:44:05 - 英文单词排序(PTA-武理-C实验)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。 输入格式: 输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。 输出格…...
2024/5/8 15:09:38 - 怎样在视频流媒体服务器里实现RTSP h265转RTMP?
RTSP H.265到RTMP,首先需要扩展RTMP协议。目前,我国已有相应的推广标准,国内开发商基本上都是按照该协议进行推广的。协议层面的问题已经得到解决。剩下的关键问题是实现RTMP H.265推送模块。rtmp h265 server 支持,目前常用的nginx-rtmp 和 srs还不支持rtmp h265,需要做些…...
2024/4/24 8:44:06 - redis5.0配置文件 超详细!!!
# redis版本 5.0# 如果想要使用到配置文件,Redis服务必须以配置文件的路径作为第一个参数启动。如: ./redis-server /path/to/redis.conf# 单位说明:当需要指定内存大小时,可能会用到不同的单位,如1k、5GB、4M等,这里给出其单位含义: # 指定单位是大小写不敏感。如1GB、1…...
2024/4/24 8:44:02 - 使用VisualStudio2017跑网传最多的张正友相机标定算法遇到的debug超级慢的问题
最近在做一个相机标定的作业 使用了网传最多的博客代码,如下链接: 1 2 使用Visual Studio2017,下载Opencv3.4.10(opencv3最新版本) 在环境变量中部署完毕之后,在VS工程当中开始配置活动解决方案以及活动解决方案平台,如下图:再对解决方案属性进行配置,如下图:这样下来是可…...
2024/4/24 8:44:02 - Hyperf 使用 Elasticsearch 增删改查基本方法
<?phpdeclare (strict_types = 1);namespace App\Elasticsearch;use Hyperf\Elasticsearch\ClientBuilderFactory;use Hyperf\Utils\ApplicationContext;class Elasticsearch{/*** @var ContainerInterface*/protected $container;protected $es_client;/*** 实例化客户端对…...
2024/4/24 8:44:01 - MySQL | MySQL 数据库系统(四)- 数据库的备份与恢复
前言 大家在日常的工作中,备份数据其实是信息安全管理重要的工作之一。那么,我们在这篇文章中将介绍一下数据库的备份与恢复。MySQL 数据库的备份同时有多种方式。第一:直接打包数据库文件夹/etc/local/mysql/data,或者我们使用工具来进行备份。 1、备份数据库 通过mysqldum…...
2024/4/24 8:43:59 - flutter自定义dialog 实现宽度自定义 界面自定义
效果大致思路 1、弹框整体实现 和写界面是一样的 毕竟flutter中 一切皆组件 界面 弹框 按钮。。。。都是组件 2、样式和跳转要进行处理 背景色透明效果有两种实现方式 a、界面跳转中opaque: false可以设置下个界面背景透明 b、使用showDialog进行新界面跳转 3、布局中使用Mater…...
2024/4/24 8:44:00 - 对象的创建过程
类的生命周期Java中对象的创建就是在堆上分配内存空间的过程,此处说的对象创建仅限于new关键字创建的普通Java对象,不包括数组对象的创建。对象创建过程1.检测类是否被加载当虚拟机执行到new时,会先去常量池中查找这个类的符号引用。如果能找到符号引用,说明此类已经被加载…...
2024/4/28 5:12:45 - 关于oracle 11g 循环多判断+continue 用法例子
CREATE OR REPLACE PROCEDURE PRC_PUB_COMPANY_UP is /****** VERSION : 1.0 AUTHOR : Rebirth_zhujl CREATE_TIME : 20200513 PURPOSE : 部门组归属重新分配 ***/ V_ERRCODE VARCHAR(200); V_ERRMSG VARCHAR(300); V_COUNT VARCHAR2(…...
2024/4/24 8:44:03 - java大数据学习路线
目录: 一.大数据方向工作介绍 二.大数据工程师的技能要求 三.大数据学习路径 四.学习资源推荐(书籍、博客、网站)一.大数据方向工作介绍大数据方向的工作目前分为三个主要方向: 01.大数据工程师 02.数据分析师 03.大数据科学家 04.其他(数据挖掘本质算是机器学习,不过和数据…...
2024/4/16 14:10:31 - 阅读笔记(2019)Deep Learning for Anomaly Detection: A Survey
原文:https://www.researchgate.net/publication/330357393_Deep_Learning_for_Anomaly_Detection_A_Survey 论文首先对基于深度学习的异常检测的研究方法进行了系统全面的概述。此外,还回顾了这些方法在不同应用领域中的应用,并评估了它们的有效性。 根据基本的假设和采用的…...
2024/4/16 14:10:21 - 五、树(下)9.Huffman Codes
目录问题描述代码解题思路出现的问题 问题描述 In 1953, David A. Huffman published his paper “A Method for the Construction of Minimum-Redundancy Codes”, and hence printed his name in the history of computer science. As a professor who gives the final exam …...
2024/4/16 14:10:21
最新文章
- 持续总结中!2024年面试必问 100 道 Java基础面试题(三十六)
上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(三十五)-CSDN博客 七十一、hashCode有什么用? 在Java中,hashCode() 方法是 java.lang.Object 类中的一个方法,所有Java对象都继…...
2024/5/9 0:43:34 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 【蓝桥杯】省模拟赛
题目 1.奇数次数2.最小步数3.最大极小值和最小极大值 1.奇数次数 问题描述 给定一个仅包含数字字符的字符串,统计一下这个字符串中出现了多少个值为奇数的数位。 输入格式 输入一行包含一个字符串,仅由数字字符组成。 输出格式 输出一行包含一个整数&am…...
2024/5/7 13:35:55 - PHP获取亚马逊商品详情api接口
亚马逊提供了一个名为Product Advertising API(PA API)的接口,可以用来获取亚马逊商品的详细信息。 要使用PA API,您需要进行以下几个步骤: 注册为亚马逊合作伙伴,并创建一个亚马逊开发人员账户。创建一个…...
2024/5/8 10:20:27 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/7 14:25:14 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/6 21:42:42 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) 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 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在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