Springboot整合WebFlux

一、使用WebFlux入门

  • WebFlux整合Mysql
  • WebFlux整合ES
  • WebFlus整合Mongdb
  • WebFlus整合Redis
1、添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.2.1.RELEASE</version>
</dependency>
<!-- 自动化配置响应式的 ES -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- 自动化配置响应式的 Mongodb -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<!-- 自动化配置响应式的 Spring Data Jedis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- 自动化配置响应式的 Spring Data R2DBC -->
<dependency><groupId>org.springframework.boot.experimental</groupId><artifactId>spring-boot-starter-data-r2dbc</artifactId><version>0.1.0.M2</version>
</dependency>
<!-- jasync 的 r2dbc-mysql 驱动 -->
<dependency><groupId>com.github.jasync-sql</groupId><artifactId>jasync-r2dbc-mysql</artifactId><version>1.0.11</version>
</dependency>
2、添加配置类
spring:data:elasticsearch: # Elasticsearch 配置项client:# 对应 ReactiveRestClientProperties 配置类reactive:endpoints: 127.0.0.1:9200 # ES Restful API 地址mongodb:authentication-database: admindatabase: testhost: 127.0.0.1password: m123port: 27017username: madmin
配置类
  • @EnableReactiveElasticsearchRepositories
  • @EnableMongoRepositories
  • @EnableTransactionManagement
@Configuration
@EnableReactiveElasticsearchRepositories 
@EnableMongoRepositories
@EnableTransactionManagement 
public class WebFluxConfiguration {//Redis的传输对象@Beanpublic ReactiveRedisTemplate<String, Object> commonRedisTemplate(ReactiveRedisConnectionFactory factory) {RedisSerializationContext<String, Object> serializationContext =RedisSerializationContext.<String, Object>newSerializationContext(RedisSerializer.string()).value(RedisSerializer.json()) // 创建通用的 GenericJackson2JsonRedisSerializer 作为序列化.build();return new ReactiveRedisTemplate<>(factory, serializationContext);}@Beanpublic ReactiveRedisTemplate<String, UserCacheObject> userRedisTemplate(ReactiveRedisConnectionFactory factory) {RedisSerializationContext<String, UserCacheObject> serializationContext =RedisSerializationContext.<String, UserCacheObject>newSerializationContext(RedisSerializer.string()).value(new Jackson2JsonRedisSerializer<>(UserCacheObject.class)) // 创建专属 UserCacheObject 的 Jackson2JsonRedisSerializer 作为序列化.build();return new ReactiveRedisTemplate<>(factory, serializationContext);}//数据库操作mysql数据库@Beanpublic ConnectionFactory connectionFactory(R2dbcProperties properties) throws URISyntaxException {// 从 R2dbcProperties 中,解析出 host、port、databaseURI uri = new URI(properties.getUrl());String host = uri.getHost();int port = uri.getPort();String database = uri.getPath().substring(1); // 去掉首位的 / 斜杠// 创建 jasync Configuration 配置配置对象com.github.jasync.sql.db.Configuration configuration = new com.github.jasync.sql.db.Configuration(properties.getUsername(), host, port, properties.getPassword(), database);// 创建 JasyncConnectionFactory 对象return  new JasyncConnectionFactory(new MySQLConnectionFactory(configuration));}//实物管理器@Beanpublic ReactiveTransactionManager transactionManager(R2dbcProperties properties) throws URISyntaxException {return new R2dbcTransactionManager(this.connectionFactory(properties));}}
4、Controller示例
@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;@GetMapping("/list")public Flux<UserVO> list() {// 返回列表return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@PostMapping("add")public Mono<Integer> add(UserAddDTO addDTO) {// 查询用户Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());// 执行插入return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setId((int) (System.currentTimeMillis() / 1000)) // 使用当前时间戳的描述,作为 ID 。.setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.insert(userDO).map(UserDO::getId);}});}}
4、Controller
@RestController
@RequestMapping("/users")
public class UserController {// ========== 使用通用的 ReactiveRedisTemplate 的方式 ==========@Autowiredprivate ReactiveRedisTemplate<String, Object> commonRedisTemplate;@Autowiredprivate ReactiveRedisTemplate<String, UserCacheObject> userRedisTemplate;@GetMapping("/get")public Mono<UserCacheObject> get(@RequestParam("id") Integer id) {String key = genKey(id);return commonRedisTemplate.opsForValue().get(key).map(o -> (UserCacheObject) o);}@PostMapping("/set")public Mono<Boolean> set(UserCacheObject user) {String key = genKey(user.getId());return commonRedisTemplate.opsForValue().set(key, user);}private static String genKey(Integer id) {return "user::" + id;}@GetMapping("/v2/get")public Mono<UserCacheObject> getV2(@RequestParam("id") Integer id) {String key = genKeyV2(id);return userRedisTemplate.opsForValue().get(key);}@PostMapping("/v2/set")public Mono<Boolean> setV2(UserCacheObject user) {String key = genKeyV2(user.getId());return userRedisTemplate.opsForValue().set(key, user);}//获取keyprivate static String genKeyV2(Integer id) {return "user::v2::" + id;}
}

6、Controller

@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;/*** 查询用户列表*/@GetMapping("/list")public Flux<UserVO> list() {// 返回列表return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}/*** 获得指定用户编号的用户*/@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}/*** 添加用户*/@PostMapping("add")@Transactionalpublic Mono<Integer> add(UserAddDTO addDTO) {// 查询用户Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());// 执行插入return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.save(userDO).flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {// 如果编号为偶数,抛出异常。if (userDO.getId() % 2 == 0) {throw new RuntimeException("我就是故意抛出一个异常,测试下事务回滚");}// 返回编号return Mono.just(userDO.getId());}});}});}/*** 更新指定用户编号的用户*/@PostMapping("/update")public Mono<Boolean> update(UserUpdateDTO updateDTO) {// 查询用户Mono<UserDO> user = userRepository.findById(updateDTO.getId());// 执行更新return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 查询用户是否存在return userRepository.findByUsername(updateDTO.getUsername()).defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<? extends Boolean>>() {@Overridepublic Mono<? extends Boolean> apply(UserDO usernameUserDO) {// 如果用户名已经使用(该用户名对应的 id 不是自己,说明就已经被使用了)if (usernameUserDO != USER_NULL && !Objects.equals(updateDTO.getId(), usernameUserDO.getId())) {return Mono.just(false);}// 执行更新userDO.setUsername(updateDTO.getUsername());userDO.setPassword(updateDTO.getPassword());return userRepository.save(userDO).map(userDO -> true); // 返回 true 成功}});}});}/*** 删除指定用户编号的用户*/@PostMapping("/delete") // URL 修改成 /delete ,RequestMethod 改成 DELETEpublic Mono<Boolean> delete(@RequestParam("id") Integer id) {// 查询用户Mono<UserDO> user = userRepository.findById(id);// 执行删除。这里仅仅是示例,项目中不要物理删除,而是标记删除return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 执行删除return userRepository.deleteById(id).map(aVoid -> true); // 返回 true 成功}});}}
3、配置类
@Configuration
public class UserRouter {@Beanpublic RouterFunction<ServerResponse> userListRouterFunction() {return RouterFunctions.route(RequestPredicates.GET("/users2/list"),new HandlerFunction<ServerResponse>() {@Overridepublic Mono<ServerResponse> handle(ServerRequest request) {// 查询列表List<UserVO> result = new ArrayList<>();result.add(new UserVO().setId(1).setUsername("yudaoyuanma"));// 返回列表return ServerResponse.ok().bodyValue(result);}});}@Beanpublic RouterFunction<ServerResponse> userGetRouterFunction() {return RouterFunctions.route(RequestPredicates.GET("/users2/get"),new HandlerFunction<ServerResponse>() {@Overridepublic Mono<ServerResponse> handle(ServerRequest request) {// 获得编号Integer id = request.queryParam("id").map(s -> StringUtils.isEmpty(s) ? null : Integer.valueOf(s)).get();// 查询用户UserVO user = new UserVO().setId(id).setUsername(UUID.randomUUID().toString());// 返回列表return ServerResponse.ok().bodyValue(user);}});}@Beanpublic RouterFunction<ServerResponse> demoRouterFunction() {return route(GET("/users2/demo"), request -> ok().bodyValue("demo"));}}
2、编写控制类
  1. 增删改查使用不同的请求方法Get,Post,Put,Delete实现,减少了Mapping寻址配置
  2. 返回单条数据使用Mono封装
  3. 返回集合数据使用Flux封装
@RestController
@RequestMapping(value = "/city")
public class CityWebFluxController {@Autowiredprivate CityHandler cityHandler;//查询单个数据@GetMapping(value = "/{id}")public Mono<City> findCityById(@PathVariable("id") Long id) {return cityHandler.findCityById(id);}//查询批量数据@GetMappingpublic Flux<City> findAllCity() {return cityHandler.findAllCity();}//保存@PostMappingpublic Mono<Long> saveCity(@RequestBody City city) {return cityHandler.save(city);}//更新@PutMappingpublic Mono<Long> modifyCity(@RequestBody City city) {return cityHandler.modifyCity(city);}//删除@DeleteMapping(value = "/{id}")public Mono<Long> deleteCity(@PathVariable("id") Long id) {return cityHandler.deleteCity(id);}
}
3、编写Handler类(类似于Serivce类)
  1. 这是一个业务类
  2. 使用JDK8的lambda表达式实现
@Component
public class CityHandler {private final CityRepository cityRepository;@Autowiredpublic CityHandler(CityRepository cityRepository) {this.cityRepository = cityRepository;}//新增public Mono<Long> save(City city) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.save(city)));}//修改public Mono<Long> modifyCity(City city) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.updateCity(city)));}//删除public Mono<Long> deleteCity(Long id) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.deleteCity(id)));}//查找public Mono<City> findCityById(Long id) {return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.findCityById(id)));}//查找public Flux<City> findAllCity() {return Flux.create(cityFluxSink -> {cityRepository.findAll().forEach(city -> cityFluxSink.next(city));cityFluxSink.complete();});}}

二、延伸使用

2、请求头解析
  • headers = “myheader=myvalue”
  • @RequestHeader(“myheader”)
  • @CookieValue(“tid”)
@GetMapping(path = "/filter/{name}", headers = "myheader=myvalue")
public Mono<String> headerFilter(@PathVariable(name = "name") String name) {return Mono.just("request filter: " + name);
}@GetMapping(path = "get")
public Mono<String> getHeader(@RequestHeader("myheader") String header,@RequestHeader("user-agent") String userAgent) {return Mono.just("request headers: myheader=" + header + " userAgent=" + userAgent);
}@GetMapping(path = "cookie")
public Mono<String> getCookie(@CookieValue("tid") String tid) {return Mono.just("request cookies tid=" + tid);
}
3、请求参数

https://spring.hhui.top/spring-blog/2020/08/27/200827-SpringBoot%E7%B3%BB%E5%88%97WebFlux%E4%B9%8BPath%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90%E4%B8%8Eurl%E6%98%A0%E5%B0%84/

  • @PathVariable(name = “index”)
@GetMapping(path = "/basic/{index}")
public Mono<String> basic(@PathVariable(name = "index") int index) {return Mono.just("path index: " + index);
}
4、访问静态资源

(1)配置静态资源未知

//1、通过注册方式
@SpringBootApplication
public class Application implements WebFluxConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/o2/");}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
//2通过路由设置方式
@Bean
public RouterFunction<ServerResponse> indexRouter(@Value("classpath:/index.html") final Resource indexHtml,@Value("classpath:/self/s.html") final Resource sHtml) {return RouterFunctions.route(RequestPredicates.GET("/index"),request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).bodyValue(indexHtml)).andRoute(RequestPredicates.GET("/s"),request -> ServerResponse.ok().contentType(MediaType.TEXT_HTML).bodyValue(sHtml));
}
6、ES响应控制类
@RestController
@RequestMapping("/users")
public class UserController {private static final UserDO USER_NULL = new UserDO();@Autowiredprivate UserRepository userRepository;@GetMapping("/list")public Flux<UserVO> list() {return userRepository.findAll().map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@GetMapping("/get")public Mono<UserVO> get(@RequestParam("id") Integer id) {// 返回return userRepository.findById(id).map(userDO -> new UserVO().setId(userDO.getId()).setUsername(userDO.getUsername()));}@PostMapping("add")public Mono<Integer> add(UserAddDTO addDTO) {Mono<UserDO> user = userRepository.findByUsername(addDTO.getUsername());return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Integer>>() {@Overridepublic Mono<Integer> apply(UserDO userDO) {if (userDO != USER_NULL) {// 返回 -1 表示插入失败。// 实际上,一般是抛出 ServiceException 异常。因为这个示例项目里暂时没做全局异常的定义,所以暂时返回 -1 啦return Mono.just(-1);}// 将 addDTO 转成 UserDOuserDO = new UserDO().setId((int) (System.currentTimeMillis() / 1000)) // 使用当前时间戳的描述,作为 ID 。.setUsername(addDTO.getUsername()).setPassword(addDTO.getPassword()).setCreateTime(new Date());// 插入数据库return userRepository.save(userDO).map(UserDO::getId);}});}@PostMapping("/update")public Mono<Boolean> update(UserUpdateDTO updateDTO) {// 查询用户Mono<UserDO> user = userRepository.findById(updateDTO.getId());// 执行更新return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 查询用户是否存在return userRepository.findByUsername(updateDTO.getUsername()).defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<? extends Boolean>>() {@Overridepublic Mono<? extends Boolean> apply(UserDO usernameUserDO) {// 如果用户名已经使用(该用户名对应的 id 不是自己,说明就已经被使用了)if (usernameUserDO != USER_NULL && !Objects.equals(updateDTO.getId(), usernameUserDO.getId())) {return Mono.just(false);}// 执行更新userDO.setUsername(updateDTO.getUsername());userDO.setPassword(updateDTO.getPassword());return userRepository.save(userDO).map(userDO -> true); // 返回 true 成功}});}});}@PostMapping("/delete") // URL 修改成 /delete ,RequestMethod 改成 DELETEpublic Mono<Boolean> delete(@RequestParam("id") Integer id) {// 查询用户Mono<UserDO> user = userRepository.findById(id);// 执行删除。这里仅仅是示例,项目中不要物理删除,而是标记删除return user.defaultIfEmpty(USER_NULL) // 设置 USER_NULL 作为 null 的情况,否则 flatMap 不会往下走.flatMap(new Function<UserDO, Mono<Boolean>>() {@Overridepublic Mono<Boolean> apply(UserDO userDO) {// 如果不存在该用户,则直接返回 false 失败if (userDO == USER_NULL) {return Mono.just(false);}// 执行删除return userRepository.deleteById(id).map(aVoid -> true); // 返回 true 成功}});}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52566.shtml

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

相关文章

MySQL下载安装配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Java百度提前批面试题

今天分享百度提前批的 Java 后端开发面经&#xff0c;整体上考察的点挺多的&#xff0c;主要重点考察了网络i/o、网络协议、linux系统、mysql&#xff0c;Java 问的不多&#xff0c;可能是百度的后端开发的语言不是主要以 Java 为主&#xff0c;所以重点看面试者的计算机基础是…

8个月打磨,打造出的全能工具箱,让你事半功倍!

这款工具叫即时工具&#xff0c;目前有网页端和客户端可以下载至本地离线使用&#xff0c;区别在于客户端采用原生适配性能更好&#xff0c;网页端需要上传至服务器或浏览器内部处理。 体验地址&#xff1a;点击直达 一、为什么会开发这个工具 综合性和多功能性&#xff1a;…

深入理解线性回归模型的评估与优化方法

文章目录 &#x1f340;引言&#x1f340;模型评估方法&#x1f340;均方误差&#xff08;MSE&#xff09;&#x1f340;均方根误差&#xff08;RMSE&#xff09;&#x1f340;绝对平均误差&#xff08;MAE&#xff09;&#x1f340;模型优化策略&#x1f340;特征工程&#x1…

电商数据采集和数据分析

不管是做渠道价格的治理&#xff0c;还是做窜货、假货的打击&#xff0c;都需要品牌对线上数据尽数掌握&#xff0c;准确的数据是驱动服务的关键&#xff0c;所以做好电商数据的采集和分析非常重要。 当线上链接较多&#xff0c;品牌又需要监测线上数据时&#xff0c;单靠人工肯…

P14-CVPR2022-1.0-RepLKNet31

论文地址:https://arxiv.org/abs/2203.06717 代码地址:GitHub - MegEngine/RepLKNet: Official MegEngine implementation of RepLKNet ‘ 目录 Abstract 一.Introduction 二.Related Work 2.1Model with Large Kernels 2.2Model Scaling Techniques 2.3Structural Re-…

基于数据湖的多流拼接方案-HUDI概念篇

目录 一、为什么需要HUDI&#xff1f; 1. 传统技术选型存在哪些问题&#xff1f; 2. Hudi有什么优点&#xff1f; 基于 Hudi Payload 机制的多流拼接方案&#xff1a; 二、HUDI的应用场景 1. 什么场景适合使用hudi&#xff1f; 2. 什么场景不适合使用hudi&#xff1f; …

数据分析案例-汽车客户信息数据可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

SElinux avc 打印及关闭

Android SELinux的avc&#xff1a;denied log 是哪里打印的及关闭? 某些场景下并不需要打开SELinux,也就是SELinux设为Permissive&#xff0c;但如果程序设计不符合SELinux sepolicy&#xff0c;日志会频繁打印如下类似avc&#xff1a;denied 的 log。 如下&#xff1a; [ …

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL&#xff0c;而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善&#xff0c; Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…

Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

Android 12 源码分析 —— 应用层 二&#xff08;SystemUI大体组织和启动过程&#xff09; 在前一篇文章中&#xff0c;我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础&#xff0c;希望读者能尽量掌握。 本篇文章&#xff0c;将会介绍SystemUI的大概…

libevent源码学习6---链接监听器evconnlistener

libevent源码学习6—链接监听器evconnlistener evconnlistener 机制提供了监听和接受 TCP 连接的方法。 struct evconnlistener {const struct evconnlistener_ops *ops;void *lock;evconnlistener_cb cb;evconnlistener_errorcb errorcb;void *user_data;unsigned flags;sho…

职业技术培训内容介绍

泰迪职业技术培训包括&#xff1a;Python技术应用、大数据技术应用、机器学习、大数据分析 、人工智能技术应用。 职业技术培训-Python技术应用 “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&…

行业追踪,2023-08-24

自动复盘 2023-08-24 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Hadoop分布式计算与资源调度:打开专业江湖的魔幻之门

文章目录 版权声明一 分布式计算概述1.1 分布式计算1.2 分布式&#xff08;数据&#xff09;计算模式1.3 小结 二 MapReduce概述2.1 分布式计算框架 - MapReduce2.2 MapReduce执行原理2.3 小结 三 YARN概述3.1 YARN & MapReduce3.2 资源调度3.3 程序的资源调度3.4 YARN的资…

进程同步

目录 临界区&#xff08;Critical Section&#xff09;: 互斥量&#xff08;Mutex&#xff09;: 信号量&#xff08;Semaphore&#xff09;: 事件&#xff08;Event&#xff09;: 进程同步的四种方法 临界区&#xff08;Critical Section&#xff09;: 通过对多线程的串行…

Apache Hudi初探(二)(与flink的结合)--flink写hudi的操作(JobManager端的提交操作)

背景 在Apache Hudi初探(一)(与flink的结合)中&#xff0c;我们提到了Pipelines.hoodieStreamWrite 写hudi文件,这个操作真正写hudi是在Pipelines.hoodieStreamWrite方法下的transform(opName("stream_write", conf), TypeInformation.of(Object.class), operatorFa…

AI加持,创意设计效率百倍提升,探秘背后的数字化魔法

在当今创新潮流不断涌现的时代&#xff0c;人工智能正以惊人的速度和深度赋能各行各业&#xff0c;食品包装设计界也已来到了一个“拼创意、拼二创和拼审美”的时代。有了AI的加入&#xff0c;设计界正迎来一股AI创意风暴&#xff0c;不仅颠覆了设计流程&#xff0c;更为食品包…

go MongoDB

安装 go get go.mongodb.org/mongo-driver/mongo package mongodbexampleimport ("context""fmt""ginapi/structs""time""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""…

全流程R语言Meta分析核心技术高阶应用

查看原文>>>全流程R语言Meta分析核心技术高阶应用 目录 专题一、Meta分析的选题与检索 专题二、Meta分析与R语言数据清洗及统计方法 专题三、R语言Meta分析与作图 专题四、R语言Meta回归分析 专题五、R语言Meta诊断分析 专题六、R语言Meta分析的不确定性 专题…