- 博客(36)
- 收藏
- 关注
原创 如何在 WebSocketHandler 中控制连接的断开
返回的Mono<Void>和返回的Mono<Void>是同一个概念,它们表示 WebSocket 连接的生命周期。只有在连接关闭时,这些Mono才会完成。通过Mono<Void>和,你可以灵活地控制 WebSocket 连接的打开、消息的发送与接收,以及连接的关闭。
2025-03-05 14:48:40
1028
原创 Spring Boot WebFlux 中 WebSocket 生命周期解析
阶段说明连接建立客户端发起 WebSocket 连接请求,服务器接受并返回 101 Switching Protocols 响应,连接建立。消息传输服务器和客户端可以双向传输文本或二进制消息。连接关闭连接可由客户端、服务器、网络异常等原因关闭。资源清理连接关闭后需要进行资源清理操作,如取消订阅、清理状态等。我们还可以通过")));
2025-03-05 14:36:58
1014
原创 Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项
在 Spring WebFlux 中使用和DataBuffer避免重复读取DataBuffer,建议在读取后缓存数据。避免阻塞操作,尽量使用FluxMono进行异步处理。防止内存泄漏,在手动管理DataBuffer生命周期时使用释放资源。确保DataBuffer只在最终消费时释放,避免Flux流程中数据丢失。
2025-03-04 16:05:34
482
原创 doOnNext() vs flatMap():区别与适用场景
都可以用来处理流中的元素,但它们有不同的作用和适用场景。,确保它的逻辑执行完成后才继续。在 Reactor(
2025-03-03 19:49:07
919
原创 Spring WebFlux WebSocket 连接保持策略
在 Spring WebFlux 的 WebSocket 处理器 (`WebSocketHandler`) 中,`handle(WebSocketSession session)` 方法用于管理 WebSocket 连接。其返回的 `Mono<Void>` 表示 WebSocket 处理的生命周期,`Mono` 终止时,WebSocket 连接将被关闭,`WebSocketSession` 也会释放资源。 由于 `session.receive()` 是 `Flux`,它本身不会结束,但 `sessio
2025-03-03 19:37:49
918
原创 线程池中的四种队列类型及其对线程池配置的影响
队列类型队列容量核心线程数的变化最大线程数的变化无界队列(无限制核心线程数会保持在,只有在负载过高时会创建新线程。线程池可以创建新线程,直到达到。如果达到最大线程数,任务会根据拒绝策略处理。有界队列(有限容量如果核心线程空闲,任务将由核心线程处理。队列已满时不会创建新线程,任务会阻塞。线程池会创建新线程直到达到,如果达到最大线程数,新的任务会根据拒绝策略处理。优先级队列(无限制与其他队列相同,核心线程数会在负载过高时创建。线程池会创建新线程直到达到,并且新任务的优先级会影响处理顺序。
2025-02-26 20:17:54
668
原创 深入理解 `Sinks.Empty<Void>` 和 `Mono<Void>`:如何触发完成信号并结合 WebSocket 示例
是一个手动控制的信号源,它不会自动发出完成信号,必须通过显式调用来触发。Mono<Void>表示一个不发射数据的异步序列,它只会发出完成或错误信号。WebSocket 连接示例通过和Mono<Void>,可以灵活地表示 WebSocket 连接的完成状态。在连接关闭或发生错误时,手动触发完成或错误信号。通过和Mono<Void>,我们可以灵活地控制异步操作的完成信号。结合 WebSocket 示例,展示了如何在实际场景中使用这些工具。关键在于理解的初始状态是未完成的,必须通过显式调用或。
2025-02-25 20:02:50
1059
原创 Project Reactor中 map、flatMap、concatMap 和 flatMapSequential 的区别
(Reactive Streams 的实现库,常用于 Spring WebFlux)中,是常用的操作符,但它们的功能和行为有显著区别。根据你的需求选择合适的操作符。如果有更多问题,欢迎继续提问!
2025-02-25 17:31:39
1047
原创 Stream 的使用和基本原理
Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。接下来正式进入主题,首先介绍一些重要接口参考:浅谈 jdk 中的 Stream 流使用及原理]列举了相关的接口以及有流程图Java 8 Stream流底层原理]列举了常用操作的sink代码,还有总的执行流程图,深得我心。
2024-10-30 16:03:39
906
原创 ForkJoinPool简介
(2023年3月公司内部分享)本文是主要基于以下三篇文章摘录和整理,屏蔽了一些细节,主要讲基本原理和任务处理流程,具体细节可以先看原文:ForkJoinPool大型图文现场(一阅到底 vs 直接收藏)(上)ForkJoinPool大型图文现场(一阅到底 vs 直接收藏)(中)ForkJoinPool大型图文现场(一阅到底 vs 直接收藏)(下)在计算机科学中,分治法是一种很重要的算法。字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子
2024-10-30 15:19:31
984
原创 从内部类到Lambda表达式
内部类->匿名内部类->Lambda表达式-> 方法引用,代码越来越简洁,同时也越来越抽象,越抽象越变化多端。但是万变不离其宗,在编译时或者运行时还是会生成对应的类。掌握其原理并且灵活使用,可以让我们的代码更加优雅,在看源码的时候也更加从容。以上内容只是介绍了一些基本原理,在实际应用过程中,Lambda表达式结合接口和泛型的使用,可以使得简单的代码就可以面对变化多端的需求,这个可以在Stream源码中体会。
2024-10-29 18:19:09
1061
原创 Java常用任务调度
在日常开发过程中,我们经常会遇到周期性执行某段代码的场景。比如定期同步订单,定期更新商品信息,定期发送消息等。这些重复执行的代码可以抽象为一个任务(Task)。 一个Task的特点如下:围绕Task的特点,开发者们开发了不同的调度框架或者中间件,满足日常开发中的使用。以下表格列出了部分实现。本文对部分技术的实现进行了介绍,从简单到复杂,从具体到抽象,希望可以让大家在面对一个任务调度框架时可以快速抓住要点,不再陌生。java.util.Timer位于JDK的rt.jar包下,始于jdk1.3,是JDK自带的任
2024-10-29 17:23:58
1236
原创 使用 EasyOCR 识别 PDF 中的文字
在读取PDF上文字的时候,发现有些pdf是图片格式的,常规的pdf库是提取不到的。因此考虑使用OCR进行提取。
2024-08-16 10:26:14
700
原创 macOS上运行 Ollama & AnythingLLM,打造自己的桌面智能体/知识库。
如果你不想通过命令行来使用Ollama,可以搭配一些界面来用。比如AnythingLLM。但是我发现,如果只是体验一下,没有必要使用doker这么麻烦的方式使用。比如我是macOs系统,apple芯片,就选了第一个安装。已经开发了多种系统的桌面端,直接下载使用即可。其他使用步骤与docker没区别,直接参考。下载安装Ollama可以参考前序文章。
2024-05-09 16:56:53
1871
原创 ubuntu 本地部署体验Llama3的中文微调模型Llama3-Chinese-8B-Instruct
ubuntu 本地部署体验Llama3的中文微调模型Llama3-Chinese-8B-Instruct
2024-05-09 10:02:47
3169
2
原创 macOS 本地部署体验Llama3
打开终端,输入命令 :ollama run llama3。即可启动llama3。如果第一次启动,会先下载模型。ollama run llama3下载的是8b模型。很明显,现在官方的llama3对中文的支持不是很好,所以现在也已经有人针对中文进行了训练,可以更好支持中文。点击模型名称后,可以看到模型的具体信息。选择不同的模型,右边会给出相对应的命令。使用Ollama本地部署非常容易,首先下载Ollama。ollama list: 查看已经下载的模型。查看Ollama 已经支持的模型。下载完成后正常安装。
2024-05-07 10:50:18
836
原创 Mac 使用Aspose的时候,提示字体不存在的问题
提示异常 Warning: the font "Times" is not available, so "Lucida Bright" has been substituted, but may have unexpected appearance or behavor. Re-enable the "Times" font to remove this warning.下载后点击安装,解决。
2024-04-11 22:59:29
548
原创 Java ProjectReactor 响应式编程 Mono 简单工作流程解析
本文通过自己实现接口的方式,揭示了响应式编程核心类 Mono 的基本原理。其核心接口为三个 Publisher,Subscriber,Subsription。核心方法为 Publisher#onSubscribe(Subscription),Subscriber#onSubscribe(Subscription),Subsription#request(long), Subscriber#onNext(T)
2023-02-02 09:34:41
14096
2
原创 EasyExcel 如何在很低的内存下导出百万条数据的 excel
SXSSFWorkbook 本身是支持导出海量数据而不至于内存溢出的, 而使用 EasyExcel 来导出xlsx文件的时候,他的底层实际使用了SXSSFWorkbook,只是做了进一步的封装,因此自然支持海量数据导出。
2023-01-10 22:00:00
1119
原创 Spring Cloud Loadbalancer (三) 如何实现 ReactorLoadBalancer
RestTemplate 负载均衡最终是委托给了 LoadBalancerClient 去执行的,而 LoadBalancerClient 的负载均衡策略,则是交给了 ReactorLoadBalancer,是由 LoadBalancerClientConfiguration 进行配置的。本文只展示了 ServiceInstanceListSupplier 的基本逻辑,实际上 ServiceInstanceListSupplier 提供了多种场景的使用方法,可以参考。
2023-01-02 20:06:31
1482
原创 Spring Cloud Loadbalancer (二) 如何实现LoadBalancerClient
RestTemplate 负载均衡最终是委托给了 LoadBalancerClient 去实现,核心逻辑是依靠 serviceId 去获取 ServiceInstance。为了达到灵活配置的作用,引入了 NamedContextFactory,为每个 serviceId 分配了一个子容器,每个子容器都拥有 ReactorLoadBalancer 的实现。ReactorLoadBalancer 才是真正实现负载均衡策略的地方。
2023-01-02 20:05:10
3967
3
原创 Spring Cloud Loadbalancer (一) 如何对 RestTemplate 进行客户端负载均衡
RestTemplate 的负载均衡是通过 ClientHttpRequestInterceptor 去实现的,本质上委托给了 LoadBalancerClient 去重写了 HttpRequest 的 getURI 方法,从而达到将 serviceId 替换成实际 host 的目的。至于 LoadBalancerClient 的具体实现, spring-cloud-commons 模块没有提供,而是由另一个模块 spring-cloud-loadbalancer 来实现
2022-12-29 22:00:00
1007
原创 Spring Cloud NamedContextFactory 用于创建子容器
NamedContextFactory 并不复杂,通过创建 Spring 子容器,可以获取独立的上下文,每个上下文的类是隔离的。应用场景比如open-feign中,每一个接口都对应一个子容器,可以拥有不同的配置。这篇文章同样是 Spring Cloud Loadbalancer 模块学习的前置文章,对学习 Spring Cloud Loadbalancer 有帮助。
2022-12-29 21:00:00
339
原创 Spring Cloud 的服务发现和注册的接口
Spring Cloud 将服务注册和发现高度抽象为了3个接口:DiscoveryClient,ServiceRegistry 和 ServiceInstance,其中 ServiceInstance 代表提供服务的实例的信息,而 DiscoveryClient,ServiceRegistry 代表服务发现行为和服务注册行为。其中 DiscoveryClient 和 ServiceInstance 的使用范围更加广泛。
2022-12-08 21:45:00
741
原创 RestTemplate 的拦截器 ClientHttpRequestInterceptor
这篇文章是 Spring Cloud Loadbalancer 模块学习的前置文章。因为 Spring Cloud loadbalancer 是通过 ClientHttpRequestInterceptor 对 RestTemplate 进行负载均衡的。因此需要对 ClientHttpRequestInterceptor 有所了解。
2022-12-08 21:40:21
6253
原创 云原生(Cloud Native) 与Spring Cloud
云原生(Cloud Native) 是一种编程风格,符合云原生的应用,可以充分利用、发挥云平台的弹性与分布式优势。其特征跟随着技术的不断发展有所变化,目前认为,其特征包括:DevOps+持续交付+微服务+容器。为了能够让JAVA应用云原生化,Pivotal 在2015年开源了 Spring Cloud 。这不是一个新的框架,而是一些依赖或者服务。比如注册中心,配置中心,API网关等,可以认为是一些基础设施,通过这些服务,可以让JAVA适应现代的编程方式,并能利用云平台达到分布式部署,快速扩容或者缩容的目的,
2022-12-02 19:49:10
998
原创 xxl-job源码学习-客户端代码
xxl-job是一个优秀的分布式任务调度平台,国内很多公司在用,部署简单,使用方便。最近想看看是怎么实现的,于是就研究下他的源码。项目结构
2021-06-11 10:22:26
1536
1
原创 redis混合持久化的配置
redis4.0之后,持久化方式多了一种,叫混合持久化,我在安装配置过程中费了一些周折,以为没有配置成功,后来看了一些持久化的原理才弄明白,记录如下:一、参考1、redis源码分析(6)——aof rewrite https://blog.youkuaiyun.com/chosen0ne/article/details/444614972、REDIS AOF的实现https://blog.csdn...
2019-07-13 13:00:07
4324
原创 RestTemplate的配置和使用
配置/** * resttemplate 配置 */@Configurationpublic class RestTemplateConfig { @Bean public SimpleClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory fac...
2019-05-17 08:05:02
1846
原创 @ControllerAdvice注解和@ExceptionHandle注解的使用
@ControllerAdvice注解查看源码,可以看到@ControllerAdvice注解有以下几个方法,可以用来指定作用范围。@AliasFor("basePackages")String[] value() default {};@AliasFor("value")String[] basePackages() default {};Class<?>[]...
2019-05-14 23:50:22
1809
原创 jdbcTemplate 使用总结
String sql = "select distinct space_id FROM mzj_ad.ad_baidu "; List<String> spaceIds = jdbcTemplate.query(sql, new SingleColumnRowMapper<String>());
2018-06-04 19:30:03
798
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人