- 博客(705)
- 问答 (7)
- 收藏
- 关注
原创 使用自定义线程池启动器进行异步开发
1、创建一个Springboot项目 ,项目名称以spring-boot-starter结尾,表示这是一个启动器,如threadpool-spring-boot-starter。,用于让 Spring Boot 发现自动配置类,其中ThreadPoolAutoConfiguration为第4步创建的自动配置类,需将包名替换为自己项目中的包名。IO 密集线程池(ioPool):适合远程调用、文件操作、数据库长耗时任务;线程池参数(core、max)不好动态调整。11.使用自定义线程池启动器创建的Bean。
2025-11-22 17:14:51
334
原创 支付宝授权登录和提现功能的实现(二)
支付宝私钥和证书文件配置在nacos,由于我采用的是证书生成的加签,所以使用的是证书crt文件,而证书较多,里边的信息较为敏感又长,这里我将证书文件放在指定路径,代码中读取证书文件的内容,app-private-key最初也是采取读取文件的方式,在项目运行时读取app-private-key老是出错,才把私钥放在nacos里。本文基于上一篇文章:支付宝授权登录和提现功能的实现(一),主要介绍编码实现。读取nacos上的支付宝配置信息,生成AlipayClient的Bean。1、配置支付宝开发信息。
2025-11-21 20:24:57
219
原创 支付宝授权登录和提现功能的实现(一)
创建应用时须选择应用平台,填写安卓和苹果应用相关信息,如果创建时未填写应用平台信息,应用创建好后,支付宝不允许追加应用平台信息,此时只能重新创建一个移动应用,支付宝允许有多个相同名称的应用。接口加签方式,要想调用支付宝api,必须进行设置接口加签方式,接口加签方式目前有2种,密钥和证书,通过下载支付宝开放平台密钥工具来生成,如果要实现红包,提现功能,接口加签方式必须选择证书。APP获取支付宝授权,完成APP端用户账号体系和支付宝账号绑定,最终在APP端发起支付宝提现,从而实现商家端转账给支付宝用户。
2025-11-21 19:29:46
241
原创 MyBatis updateById和LambdaUpdateWrapper区别
而使用updateById前,先根据id查询出对象,虽然后台代码未手动指定updatTime的值,在查询出的对象中updatTime有值,它会被包含在 UPDATE 语句中,从而触发 MySQL 的。可能更新不必要的字段(如果对象中某些字段为null,则会被更新为null)updatTime更新为当前执行的时间。希望优化性能,避免不必要的字段更新。:用于构建复杂的更新条件,可以。:根据主键 ID 更新一个。,并支持丰富的条件设置。从表单提交了完整数据时。
2025-11-11 15:50:22
404
原创 scrcpy的安装和使用
的对话框,勾选“一律允许使用这台计算机进行调试”,然后点击“确定”。进入“设置” -> “关于手机”,连续点击“版本号”7次,直到提示“您已处于开发者模式”。直接将电脑上的文件(如图片、APK)拖拽到 scrcpy 窗口,文件会被传输到手机的。手机上屏幕内容就会以一个窗口的形式显示在电脑上,你可以直接用鼠标和键盘操作手机。在某些情况下,可以直接在 scrcpy 窗口激活时打字,文字会输入到手机。返回“设置”,找到“系统”或“更多设置”中的“开发者选项”。在“开发者选项”中,找到并开启 “USB 调试”。
2025-11-10 17:11:15
1121
原创 RestTemplate使用示例
是 Spring 框架提供的一个用于同步(阻塞式)HTTP 请求的客户端工具类。它简化了与 HTTP 服务的通信过程,极大地方便了在 Java 应用中调用 RESTful Web 服务。模板方法设计模式:封装了复杂的底层细节(如强大的消息转换器:自动将 Java 对象与 HTTP 请求/响应体(如 JSON, XML)进行序列化和反序列化。集成 Spring 生态:与 Spring 的依赖注入、AOP 等无缝集成。全面的 HTTP 方法支持。
2025-11-09 18:59:10
714
原创 SpringAI整合deepseek的一个简单入门案例
temperature值越高,生成的文本越多样化,但也可能包含更多的随机性和不可预测的内容。1、本文大模型以deepseek为例,需提前到DeepSeek官网申请到key。值越低,生成的文本越接近于确定性的结果,即生成的文本会更加一致和可预测。二、配置springai的api地址和key,这里以deepseek为例。2、本文采用的调用deepseek在线api的方式。1.api-key需替换为自己在deepseek上申请到的key;2.关于temperature参数说明,请参考下文和项目需要进行配置。
2025-11-09 14:38:35
963
原创 Java对接微信支付
在controller中主要提供3个接口:微信下单,提供给微信的异步回调接口(被动等待微信返回支付是否成功的通知,该接口需配置在微信支付开发者平台,对应配置文件中的notifyUrl),主动查询微信API获得支付是否成功的结果。下面的数据是模拟数据,notifyUrl为提供给微信的异步回调接口,需本地开发好并部署到公网环境。我这里分别创建了订单表和支付表,分别对应用户在前台下的订单和订单相应的支付流水。3、创建配置文件,读取application.yml配置的商户信息。对接微信支付,需要在。
2025-11-09 12:04:17
310
原创 规则引擎Drools语法要点
规则文件的`RHS`部分的主要作用是通过**插入,删除或修改工作内存中的Fact数据**,来达到控制规则引擎执行的目的。Drools提供了一些方法可以用来操作工作内存中的数据,**操作完成后规则引擎会重新进行相关规则的匹配,**原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。1、如果对象类型为**包装类型**时,在一个规则中改变了global的值,那么**只针对当前规则有效**,对其他规则中的global不会有影响。LHS(Left Hand Side):是规则的条件部分的通用名称。
2025-11-01 12:45:46
894
原创 规则引擎入门使用教程
规则引擎(BRMS)是将业务决策从代码中分离的系统,支持动态修改规则而无需重启服务。Drools是一款基于Java的开源规则引擎,通过规则文件(.drl)定义业务规则。本文介绍了规则引擎的优势(集中管理、快速响应变更等)和适用场景(风控、促销等系统),并提供了Drools的Spring Boot集成示例:包括配置类、实体类、规则文件定义和单元测试。示例展示了如何根据订单金额计算积分,验证了规则引擎的业务规则解耦能力。规则引擎特别适合业务规则复杂且频繁变化的系统。
2025-11-01 12:13:04
621
原创 PocketBase轻量级后端解决方案
项目阶段推荐使用方式学习 / 原型直接使用 PocketBase个人项目 / 小型系统前端 + PocketBase,无需 Java 后端企业系统 / 微服务Java 作为主服务,PocketBase 作为快速子系统(例如内容、用户、上传)
2025-10-30 17:51:26
1042
原创 java使用lombok提示找不到符号问题的解决
正是两者不一一致导致lombok不能正确工作。意思是lombok未能正确工作,不能生成getter和setter方法,可是maven中已引入lombok的依赖。修改后,刷新Maven,再次启动,终于不报上面的错误了。符号: 方法 setTimestamp(long)java: 找不到符号。
2025-10-15 10:11:48
271
原创 JDK11先进特性
一款可扩展的低延迟垃圾收集器,目标是将停顿时间控制在 10ms 以内,即使处理 TB 级堆内存。它是一个低开销的性能剖析和事件收集框架,用于诊断生产环境中的性能问题。只是一个语法糖,编译时类型就已确定,不是动态类型。一个“无操作”的 GC,用于性能测试、内存分配测试和短期任务,帮助你了解应用的纯内存开销。这是最具颠覆性的特性之一,让我们在写代码时能少打很多字,同时保持代码可读性。,提供现代、易用、支持 HTTP/2 和 WebSocket 的客户端。用于接收方法返回的复杂类型,避免书写冗长的类型声明。
2025-10-14 16:06:59
875
原创 JDK17先进特性
JDK 17 是,相比 JDK 8 和 11,引入了大量能提升日常开发效率、代码可读性、可维护性和运行性能的“现代化特性”。下面从三个角度,做个简单的介绍。
2025-10-13 20:03:39
946
原创 java开发中对16进制数据的处理
前面文章介绍了16进制相对json在物联网开发进行数据传输的优势,本篇简单记录下在java开发中如何对16进制数据进行处理。3.在controller中调用上面的方法发送16进制的消息。1.将普通java对象转换为16进制的字符串;2.将16进制的字符串转换为字节数组;2.在service中添加一个方法。用于发送16进制字节数组的消息。3.将字节数组转换为字符串。用于不同类型数据的转换。
2025-10-12 17:42:08
245
原创 物联网和嵌入式开发中使用16进制的原因
4.嵌入式设备性能一般,16进制比json对设备性能要求更低。3.嵌入式设备内存有限,16进制比json占用更少的内存。1.比json更紧凑,传输速度更快,节省带宽。2.比json编解码更高效,解析速度更快。
2025-10-12 17:16:46
239
原创 使用okhttp3发送请求
OkHttp3 是一个高效的 HTTP 客户端,由 Square 公司开发,具有以下核心特点:• 连接池 - 减少请求延迟,支持HTTP/2和SPDY• 透明GZIP压缩 - 自动压缩请求体,减少数据传输量• 响应缓存 - 避免重复网络请求• 自动重试 - 处理瞬时故障和网络问题• 异步/同步支持 - 灵活的调用方式。
2025-10-12 17:06:52
302
原创 java接收小程序发送的protobuf消息
/接收数据,对ProtoBu数据进行反序列化,返回的是ChargingCmd对象,ChargingCmdProtobuf.ChargingCmd是我们定义的消息类型,//添加消息转换处理器,将WebSocketFrame消息转换为ProtoBuf二进制类型的消息。//处理二进制消息,protobuf消息以二进制形式传输的。//添加到list中,交给下一个handler处理。//发送数据,对ProtoBu数据进行序列化。//retain引用计数,防止释放。//发送数据,ProtoBu序列化。
2025-10-12 12:16:31
194
原创 nginx中proxy_pass配置
上面代码中的172.18.0.2为容器的ip,可能通过docker inspect 容器id或名称获得。192.168.1.100为远程服务器上的ip地址,需根据实际进行替换。推荐使用容器名称的方式,因为容器重启可能会导致IPAddress变化。app-container为容器名称,8080为容器对外暴露的端口。通过Networks中的IPAddress字段获得。
2025-10-11 14:57:39
279
原创 Linux系统为普通用户设置sudo权限
执行visudo命令等价于执行vim /etc/sudoers命令,但是在保存退出时,visudo会检查内部语法,避免用户输入错误信息,所以推荐使用visudo。sudo命令提供了一种机制,它可以在不用分享 root 用户的密码的前提下,为信任的用户提供系统的管理权限。wheel是基于RHEL的系统中的一个特殊用户组,它提供额外的权限,可以授权用户像超级用户一样执行受到限制的命令。当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限。
2025-10-09 15:24:10
416
原创 Netty服务器监听读写超时
跟客户端监听连接断开时的处理一样,既添加Netty内置的处理,同时也需要添加自定义处理器。先来看Netty内置的处理。上面代码添加了一个Netty内置的处理器:IdleStateHandler。
2025-10-03 12:45:01
363
原创 Netty客户端断开重新连接的处理
这里注册一个监听器,用于监听处理客户端启动时连接服务器端的状态,如果连接失败,单独启动一个线程,周期性执行连接的方法:schedule(),里边需要传入三个参数,线程,周期性执行的时间,时间单位,并在线程中定义需要执行的方法(连接)。这个是Netty内置的监听器,只能客户端启动时进行监听,如果客户端在运行时与服务器断开连接,它是监听不了的,需要自定义一个运行时处理器,专门用于监听客户端在运行时与服务器端的连接的状态。最后在Netty客户端中添加上该处理器。
2025-10-03 12:00:36
162
原创 Protobuf粘包半包问题的处理
(1)客户端处理粘包半包问题的处理器:ProtobufVarint32LengthFieldPrepender;(1)服务器处理粘包半包问题的处理器:ProtobufVarint32FrameDecoder;3、netty客户端添加上面定义的客户端处理器,服务器端添加上面定义的服务器端处理器。为了验证效果,将前面添加的处理器注释掉。2、创建protobuf服务器端处理器。1、创建protobuf客户端处理器。(3)自定义的服务器端业务处理器。(3)自定义的客户端业务处理器。(2)protobuf编码器;
2025-10-02 19:19:39
231
原创 protobuf在Java项目中的使用
在IDEA中右键proto文件,点击quick gen protobuf here,如果proto文件语法没问题,就会指定的包名下生成对应名字的java文件,注意留意控制台的输出。,选择zip下载到本地后,解压缩到指定目录。编辑环境变量,选择path,编辑,新建,填入:D:\softwares\protoc\bin 保存。打开cmd,输入protoc --version,如果出现版本号,则表明配置成功。1.Protocol Buffers:用于语法支持。3.Protobuf Highlight:语法高亮。
2025-10-02 17:25:50
338
原创 Netty粘包和半包问题产生的原因和解决方案
粘包:指接收方在一次读数据操作中,收到了多个数据包。即发送方的多个数据包“粘”在了一起,被接收方当做一个整体接收。例如:客户端分别发送了Hello和World两个包,但服务端一次就收到了HelloWorld。半包:指接收方在一次读数据操作中,只收到了一个数据包的部分数据。即一个数据包被“拆开”了,需要多次读取才能凑成一个完整的包。例如:客户端发送了HelloWorld,但服务端第一次收到Hel,第二次收到loWorld。重要提示。
2025-10-02 14:33:06
959
原创 Netty ByteBuf简介和引用计数对象的释放
如果没有引用计数,管理这些共享内存区域的生命周期将变得极其复杂和容易出错。),但为了在高并发网络编程中获得一个数量级的性能提升,这是一个非常值得的权衡。: 原计划进一步改进,但因其复杂性最终被放弃,Netty 团队选择继续优化和完善 4.x 分支。)等对象,这对JVM的垃圾回收器造成了巨大压力,导致GC暂停,进而影响应用的吞吐量和延迟。全面引入并使用引用计数进行生命周期管理。4、直接内存:脱离于JVM之外,读写性能高,但创建和销毁代价也高。当引用计数降为0时,对象并不立即被垃圾回收,而是被返回到对象池中。
2025-10-01 15:41:41
722
原创 使用Netty解析WebSocket协议
2、HttpObjectAggregator:可处理Http POST请求,用于将多个Http消息聚合为完整的HTTP请求,它能够将HttpMessage和HttpContent聚合为FullHttpRequest或FullHttpResponse。上面代码中依次添加了HTTP GET请求,POST请求,WebSocket请求,自定义的WebSocket处理器,使用了Netty来进行解析。方法所起的作用,当有客户端断开连接时,将该客户端从ConcurrentHashMap移除。触发时机:接收到消息时触发。
2025-10-01 13:26:19
323
原创 使用IDEA的 Generate快速生成代码
Generate虽然很早就知道,也偶尔用一下它生成一些方法。但细细究来,感觉知道的只是它的冰山一角,今天来做下系统性总结,巧用generate可以帮助我们提升效率,虽然现在有各种AI辅助工具,但一些场景下也有其存在的意义。简单来说,我们使用它来帮我们生成如下代码:1、类的构造方法;2、生成单元测试类,测试用例;3、生成继承类或实现类的方法;4、生成委托方法;Generate。
2025-10-01 12:15:48
1113
原创 linux普通账号管理
useradd Jimy -d /opt/common/workDir 指定用户的主目录。普通用户的操作通常还涉及到赋予sudo权限,由于篇幅较长,使用单独一往届日记来记录。比如添加用户Jimy,就使用useradd Jimy。执行命令输入密码,再次确认输入,即可设置成功。-s:指定用户的登录Shell。-g:指定用户所属的初始组。-c:指定用户的注释信息。-d:指定用户的主目录。复制初始配置文件到新家目录。
2025-09-30 15:51:00
187
原创 Springboot整合Netty的启动方式(二)
2025 [INFO] SimpleChannelInboundHandler:有新的客户端连接到服务器: 53546b35。本篇介绍下Springboot整合Netty的启动方式二,将Netty交由Spring进行管理。2025 [INFO] Netty客户端启动,监听的端口是:1919。2025 [INFO] Netty服务器监听的端口:1919。2025 [INFO] Netty服务器启动成功......Springboot 应用启动成功......
2025-09-24 22:35:26
301
原创 Springboot整合Netty的启动方式(一)
这个方法会阻塞,直到完成Netty初始化和启动完成,才能释放出线程资源。2025 [INFO] Netty服务器监听的端口:1919。2025 [INFO] Netty服务器启动成功......2025 [INFO] Netty服务器监听的端口:1919。2025 [INFO] Netty服务器启动成功......NettyApplication 服务启动......NettyApplication 服务启动......在前面Netty服务器类,有这么一个方法。编写Netty启动类。
2025-09-24 18:44:22
208
原创 Netty客户端的创建
3、客户端的Channel类型是NioSocketChannel,服务器使用的是NioServerSocketChannel;4、客户端的Channel初始化方法是handler(),服务器端所使用的是childHandler();2、客户端启动引导器使用的是Bootstap,服务器端使用的是ServerBootstrap;5、客户端的bind需要传入服务器的host和port,服务器只需传入port。1、客户端只需要1个NioEventLoopGroup,服务器端需要2个;客服端的创建,与服务器端。
2025-09-24 15:05:26
255
原创 Netty服务器端的创建
channel(NioServerSocketChannel.class) //指定使用NIO模型 .childHandler(new ChannelInitializer<>() // 为每个新成功建立的 TCP 连接初始化一个。会阻塞当前线程直到绑定完成。如果绑定失败(例如端口被占用),会抛出异常。本文记录下如何在我们的项目中创建Netty服务器端。,负责处理已被接受的连接的 I/O 读写业务逻辑。,负责接收新的客户端连接。: 保存服务器监听端口的。:提供资源清理的方法。的引用,以便后续关闭。
2025-09-24 14:46:03
358
原创 Netty框架知识总结
特性描述本质一个封装了 Java NIO 的网络应用框架模型异步事件驱动的 Reactor 线程模型目标简化网络编程,提供高性能、高并发的解决方案核心思想通过的责任链模式实现高度模块化和可扩展性简单来说,如果需要开发一个高性能的网络服务器(尤其是长连接、高并发的场景),Netty 几乎是 Java 领域毋庸置疑的首选。
2025-09-24 14:05:30
946
原创 Springboot实现WebSocket通信(二)
如果项目中已引入了spring-boot-starter-web,在引入spring-boot-starter-websocket时,由于spring-boot-starter-websocket集成有spring-boot-starter-web,因此需要将spring-boot-starter-websocket的spring-boot-starter-web包剔除掉,否则可能会导致依赖冲突。二、创建WebSocket消息处理器。三、创建WebSocket消息拦截器。
2025-09-23 17:47:21
347
空空如也
$.messager.alert()中文显示成???
2017-08-24
在前端页面格式化显示日期
2017-08-22
多文件上传文件数组不为空的判断
2017-08-19
恢复linux系统里的/bin/sh文件
2017-07-08
使用canvas绘制心电图
2017-05-06
内网怎样使用Maven管理JAVA WEB项目
2017-03-24
怎样将一个新的Web项目绑定到已备案的域名
2017-03-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅