- 博客(72)
- 收藏
- 关注
原创 java编写 agent 入门案例
这篇文章介绍了如何使用LangChain4j框架构建一个基于Java 17和Spring Boot的AI Agent系统,主要功能包括: 项目采用Spring Boot 2.6.13 + LangChain4j 0.36.2架构,集成DeepSeek API实现流式对话和工具调用功能 核心功能实现: 通过WeatherAgentDemo类展示天气查询Agent 支持三种工具方法:查询天气、空气质量及未来三天预报 使用流式响应处理用户查询 关键技术点: 使用OpenAiStreamingChatModel对接
2026-05-15 10:49:47
412
原创 云效-流水线-简单部署
本文介绍了将本地Java项目部署流程迁移到云效流水线的实践。原部署方式包含三个步骤:本地打包、上传服务器和启动jar包。现在通过云效流水线实现自动化:1)从Git拉取代码;2)使用Maven构建项目;3)自动部署到主机。文中通过截图展示了流水线配置界面,包括代码拉取、Maven构建参数设置和主机部署环节,最终实现了从手动部署到持续集成的转变。
2026-04-02 18:04:52
97
原创 @Value赋值踩的坑
Spring Boot配置文件中YAML类型推断可能导致字符串被误解析为科学计数法数值(如"90856e742"被识别为9.0856×10^742)。解决方案是使用引号强制声明为字符串类型(推荐双引号)。最佳实践是对API密钥、混合字符等配置值始终加引号,避免自动类型转换问题。调试时可查看启动日志或使用IDE插件验证YAML解析结果。核心原则:不确定的配置值加引号最安全。
2025-09-09 15:30:29
189
原创 nacos 2.5.1 心跳源码解析
可以把 gRPC 长连接想象成一条电话线正常挂断(情况一):对方说“再见”然后挂机。你立刻知道通话结束了。线路被剪断(情况二):你听到忙音或噪音,需要一点时间确认对方不在。对方突然昏迷(情况三):电话通着,但对方一直不说话。你怎么知道他还在不在?你的做法就是:每隔几秒问一句“喂,你还在吗?”(这就是如果连续问了几次都没回应,你就断定他出事了,然后挂断电话(将实例标记为不健康)。所以,结论是:通道状态检测:用于快速处理正常关闭(情况一)。应用层心跳:用于检测网络中断。
2025-08-30 11:13:45
1105
原创 如何理解 nacos 1.x 版本的长轮询机制
摘要: 本文深入解析长轮询机制及其在Nacos 1.x中的应用,对比普通轮询的差异,揭示长轮询通过"请求挂起+按需响应"实现准实时推送的原理。针对Nacos 2.x弃用长轮询转向gRPC的原因,指出HTTP长轮询在连接复用、实时性和协议开销上的局限性,而gRPC凭借HTTP/2多路复用、Protobuf高效序列化和双向流通信等优势实现更高性能。同时阐明gRPC通过proto文件定义的服务名与方法名定位接口,区别于HTTP的URL路径机制。这一演进体现了从HTTP协议妥协方案到现代RPC框
2025-08-30 09:31:30
888
原创 垃圾回收器简述
java8是如何管理这 1G 的内存的?可以看到, 绿色 和 蓝色 泾渭分明 左边的就是 新生代 右边的蓝色就是 老年代 ,井水不犯河水在细致一些的话,新生代里面还是有更小的划分的:但是!即便划分的在小,java8的默认垃圾回收器,是对 整个 新生代 做操作,不会说只对 伊甸园 做操作,也不会出现只对 s0/s1 进行操作。就像一个很持家的人,手上有 绿豆和 蓝豆,必须划分好放在规定的区域才可以。
2025-08-18 14:48:29
452
原创 windows版本:Prometheus+Grafana(普罗米修斯+格拉法纳)监控 JVM
然后就可以启动项目,访问 xxxxxxxxxxx/actuator/prometheus 这个地址了。下载 windows amd64 的zip 包 下载之后修改一下 目录里面自带的 yml 文件。如果看到下面这样的文字, 这一步就完成了。官网很慢,这里我推荐使用国内的镜像。所以就有了下面的 内容。看到下面的展示就算成功。
2025-08-12 17:34:46
1137
原创 写一个自己的spring-boot-starter快速启动依赖
在日常的开发中,常常回去使用别人提供的 xxx-spring-boot-starter 是否想过自己去写一个首先确认,使用的springboot的版本是多少?我这里使用的是 2.6.13的版本,所以我使用来完成自动装配如果使用2.7版本以上的springboot,那么推荐使用。
2025-08-01 09:38:20
486
原创 rabbitmq的安装和使用-windows版本
RabbitMQ 需要 Erlang 运行时环境,因此需要先安装 Erlang,再安装 RabbitMQ。现在你的 Spring Boot 应用已经可以生产和消费 RabbitMQ 消息了!来简化 RabbitMQ 集成。确定好版本之后,下面开始正式安装。Spring Boot 提供了。如果显示版本号,说明安装成功。
2025-07-31 14:49:00
775
原创 面试遇到的问题3
10>=0<010分钟未支付订单✅:Redis 单机 QPS 可达 10W+,INCR是原子操作,避免超卖。✅:直接利用 Redis 的原子性,无需额外分布式锁。INCRINCRINCRINCRREDLOCKINCRhash tagINCRstock:skuA剩余>0INCRINCR。
2025-07-29 15:33:17
1044
原创 redis集群的配置和使用
这边有两台windows电脑windows电脑A-192.168.3.35windows电脑B-192.168.3.5ubuntu电脑C(在电脑B上面使用vmware模拟出来的环境)-192.168.3.151。
2025-07-24 11:12:00
528
原创 面试遇到的问题
大 Key是指存储在 Redis 中单个 Key 对应的 Value 过大(通常以 KB 或 MB 为单位),导致 Redis 性能下降或稳定性问题的现象。内存占用高:单个 Key 占用大量内存操作阻塞:对大 Key 的操作耗时过长,阻塞 Redis 单线程网络负载大:传输大 Key 消耗过多带宽持久化问题:AOF 重写或 RDB 保存时处理大 Key 效率低@Override@Override@Override@Override。
2025-07-15 23:36:43
772
原创 H2在springboot的单元测试中的应用
这正是它成为 Java 单元测试首选数据库的原因。H2 通过极简的设计实现了单元测试的核心需求——以上代码经过实地的验证,可以运行。
2025-07-12 14:19:36
1108
原创 Security+JWT的方式做权限校验
本文摘要: 实现基于JWT的安全认证系统,主要功能包括: 使用JWT令牌包含用户名、ID和权限信息,2小时有效期并支持续期 提供/login/login登录接口,接收MD5加密密码(盐值jiubodou) 权限分配方案:hyl用户拥有user/employee/root权限,mang有user,jiubodou有user/employee 通过注解方式实现权限校验(只需匹配任一权限即可) 全局可访问用户上下文信息 技术实现:Spring Security + JJWT,配置无状态会话和CSRF防护 关键组件
2025-07-03 15:29:49
691
原创 springboot 中使用 websocket
文章摘要:本文介绍了Spring Boot中WebSocket的实现方式,只需两步配置即可使用:1)通过@EnableWebSocket注解和ServerEndpointExporter开启WebSocket支持;2)使用@ServerEndpoint注解编写处理类,定义连接建立(@OnOpen)、关闭(@OnClose)、消息接收(@OnMessage)和异常(@OnError)的回调逻辑。WebSocket协议基于HTTP握手升级,支持全双工通信(如电话),不同于半双工(如对讲机)和单工(如广播)。路径
2025-07-03 15:10:06
1474
原创 springboot中的事件发布和监听
Spring Boot的事件发布与监听机制是一种松耦合的组件通信方式,通过继承ApplicationEvent定义事件类,使用ApplicationEventPublisher发布事件,@EventListener注解监听事件。该机制支持同步/异步处理,可实现业务解耦,适用于用户行为跟踪、系统通知等场景。实际应用中需注意事件数据封装、异常处理和命名规范,以提高代码可维护性。这种观察者模式的实现方式能有效提升系统的灵活性和扩展性。
2025-07-03 14:57:47
319
原创 回调函数的简单入门
Java回调函数入门指南摘要 回调函数是将方法作为参数传递,在特定时机被调用的编程技术。本文通过生活化的"数星星"例子(前置搬椅子、数星星、后置收椅子)形象解释回调概念。代码示例展示了三种实现方式:1) Lambda表达式(推荐,简洁高效);2) 匿名内部类;3) 方法引用。核心类CountStart通过回调接口(QianZhi/HouZhi)实现业务逻辑与具体操作的解耦,体现了控制反转思想。运行结果展示了"准备-执行-收尾"的标准流程。回调函数适用于事件处理、异步编
2025-07-03 14:32:05
175
原创 @RequiredArgsConstructor
在Spring框架中,@AllArgsConstructor和@RequiredArgsConstructor是Lombok提供的两个常用注解,用于自动生成构造方法。两者的主要区别在于生成的构造方法的参数范围不同。@AllArgsConstructor会为类中所有非静态成员变量(包括final和非final)生成全参数构造方法,适用于需要注入所有字段的场景。而@RequiredArgsConstructor仅为类中所有final字段或标有@NonNull的字段生成构造方法,适用于仅需注入必需依赖的情况。在S
2025-05-20 09:03:53
955
原创 AQS和ReentrantLock
AQS通过一个FIFO(先进先出)的等待队列来管理多线程对资源的访问。它允许开发者通过继承AQS来创建具体的同步器,并利用AQS提供的模板方法来实现同步逻辑。功能:AQS主要提供了两部分功能,一是操作state变量(表示资源是否被占用),二是实现排队和阻塞机制。AQS并没有实现任何同步接口,它只是提供方法,调用这些方法可以实现锁和同步器。
2024-10-18 14:47:50
502
原创 死锁和活锁和线程饥饿
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,它们都将无法推进下去。原因:两个或两个以上的线程共同访问两个或多个相同的资源(如对象锁),并且每个线程都持有部分资源同时等待其他线程释放它所需要的资源,从而导致所有线程都无法继续执行。
2024-10-16 18:14:17
344
原创 CAS相关知识
了分层级的策略来优化性能,锁的状态由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁。以下是关于这些锁状态的详细解释:==无锁状态:==这是对象的初始状态,表示没有任何线程持有该对象的锁。==偏向锁:==偏向锁是为了优化只有一个线程访问同步块的场景。当一个线程首次获取锁时,锁会进入偏向锁状态,并在对象头中记录持有锁的线程ID。此后,该线程再次获取锁时,只需比较对象头中的线程ID,无需进行额外的CAS操作,从而降低了获取锁的开销。
2024-10-16 17:02:19
786
原创 threadlocal的相关知识
开放寻址法(线性探测法)是一种解决哈希冲突的方法,属于开放寻址法的一种具体实现方式哈希函数计算:首先,使用哈希函数计算键的哈希值,以确定其在哈希表中的初始位置。冲突检测:如果初始位置已被占用(即发生冲突),则使用线性探测法查找下一个空闲位置。线性探测:从发生冲突的位置开始,依次检查下一个位置是否为空。线性探测的增量序列通常为di=1, 2, 3, …, m-1(其中m为哈希表长度)。即,如果初始位置为x,则探测过程为x+1, x+2, x+3, …, 直到找到空位置。
2024-10-16 16:06:02
741
原创 Spring的启动,以及对于一些问题的思考
因为我在学习的时候,老师教的是,最好是按照标准去使用注解,为其分类,但是在大多数情况下,没什么区别,是这样吗?所以说,可以在这个类中使用 @Bean 这类注解来向容器注入一个 bean(我们常在@Configuration中也是这是这么做的),但是的确,很少有人会这么做,为什么?如果一个本应该被标记成 @Repository 的类被 标记成了@Component 那么程序在没有出现异常的情况下可以正常运行嘛?这就是一个最简单的,也是最常见的启动springboot项目的一个方式,首先是。
2024-10-14 15:07:27
378
原创 一些关于线程之间协作的心得
首先看代码当我看完这个答复之后,我觉得 join 其实和 线程之间的执行顺序,或者说调度息息相关,它在多线程并发执行以用来提高效率方面,好像没那么明显。
2024-09-23 17:47:24
374
原创 异常处理相关心得
没有人会点击一个接口之后,立马去看日志,当我们发现线程池中的任务执行失败的时候,很可能是1个小时以后的事情了,那个时候再去翻找日志太麻烦,所以说及时通知到群里才是最可靠的。
2024-09-03 18:32:00
592
1
原创 ThreadLocal的使用
这里为了更加还原真实的线上环境,直接就用了 拦截器+统一返回+全局异常捕获+ThreadLocal,项目还是比较完整的。
2024-06-21 11:50:19
656
原创 java11运行rocketmq
java11作为一个长期支持的版本,相信有很多人是在使用的,但是 rocketMQ 是java8开发的,所以 mq的相关的 sh脚本也是在 java8的环境下编写的,所以想要 在 11的环境下运行 rocketMQ,是需要做一些改变的。我的设备是 2核 2G 的centos7设备,一般情况下还会开启 redis 和 mysql 和 运行rocketmq的可视化界面的jar包, 所以 rocketmq 的 参数我调的很小 只有128m。一、runserver.sh。
2024-05-22 11:26:32
484
原创 validation的简单使用
那么问题就是怎么写,我们找一个现成的 @NotNull复制一下,改改代码validatedBy = {MobileValidator.class}//注意,这里是需要我们自己写的String message() default "手机号码有误";Class<?Class<?/*这两个泛型,前者是注解类型 ,后者是 要检验的值是什么类型*/@Override/*s就是前端传过来的值*/@Data@ToString@NotBlank(message = "名字不能为空")
2024-05-06 15:40:09
695
原创 mybatis使用xml中的if-else/choose
最近需要使用 xml 文件来实现一些增删改查,此文对 其中的 if-else 加以说明。然后在 xml 文件中写这个方法的具体实现。首先肯定是在 mapper 里面有一个方法。那么使用 xml 怎么来使用和接收呢?有一个引用类,假设叫 Student。
2024-04-19 17:13:20
3488
原创 定时任务--静态 和 动态
动态任务就是说,从数据库中读取循环时间,数据库中只要改动,那么项目中的循环时间就会随之改变,所以说项目中引用了 mybatisplus ,而库中存的内容很简单。随着项目的启动而启动,如果需要更改循环时间,需要重启应用。
2024-02-05 11:02:23
530
原创 mybatisplus-多数据源的处理
本文介绍了如何使用dynamic-datasource-spring-boot-starter实现Spring Boot多数据源配置。主要内容包括:1)添加核心依赖,如MyBatis-Plus和MySQL驱动;2)详解配置文件结构,设置主从数据源(master/slave)并配置连接参数;3)通过MyBatisX插件快速生成实体类、Mapper和Service;4)使用@DS注解在Service层实现动态数据源切换,如@DS("master")和@DS("slave"
2024-02-02 15:00:40
481
原创 用Integer当作锁的时候的注意事项
这里记录了对象的地址在值变化的时候就会使用到这里的原对象的地址,所以说地址最终是不会变的。使用 AtomicInteger 就可以了。前几天看到一个经典的面试题。下面使用另外一种方式。
2023-07-28 15:16:06
301
原创 Spring源码的一些理解---事务中的动态代理
spring 的事务和动态代理是息息相关的,也常常一不注意就事务失效,那么想弄明白失效的原因要从 spring 的动态代理说起。
2023-06-20 10:16:16
726
原创 reentrantLock的使用
那么有没有其他方法来解决这个并发问题呢,其实是有的,我们使用redis,其中有一个操作就是 原子性的增加/减。8个现成循环5次,也就是说,最终redis里面值应该是 100+40=140,但是结果是130。很简单,就是将redis里面的值拿出来以后,加一再放回去,但是如果是并发场景下呢?执行结果也肯定不会是 130-40=90。同样的,如果不加锁的情况下去执行 minusNum,往redis里面放一个值,num,值设置成100。我们这里使用 ApiFox来测试一下。这样也可以保证并发情况下的数据一致性。
2023-05-23 16:30:20
289
Maven项目间依赖构建
2025-04-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅