Spring事件监听在业务使用中的优化
事件驱动的开发方式在业务系统开发中扮演着关键角色,若能妥善运用,将对系统的拓展性产生至关重要的影响。Spring框架对事件驱动进行了出色的封装,然而在实际业务应用中,我们发现了一些可优化的领域,因此针对这些问题进行了封装和优化工作。 Spring事件驱动的使用在电商订单创建的场景中,一旦订单成功创建,必须执行一系列附加的业务操作。这些操作包括向用户发送相关信息,并将订单信息同步到相关系统中。考虑到此场景的特点,事件驱动的开发方式被广泛认为是最合适的选择,因其能够在不对业务系统造成负面影响的前提下进行处理。 事件定义在订单创建事件中,可以定义包含订单对象以及与订单相关的属性,例如订单ID等。通过此事件,能够有效地传递订单信息,并为其他业务操作提供必要的数据依据。 12345678@Data@AllArgsConstructorpublic class CreateTradeEvent{ // 可以在此定义订单创建事件中的相关属性 private Trade trade; } 事件发布在订单成功创建之后,我们可以获取到订单实体或其他...
知其然知其所以然:Boolean类型命名规范
对应阿里巴巴开发手册-编码规约-命名风格第9条,规约中写的比较模糊,之前只知道这样命名可能会存在问题,这里探索一下具体什么场景会存在问题。 对上面举的反例感觉有些怪,**基本数据类型Boolean isDeleted属性的Getter方法是isDeleted()**,手册应该写的有问题,印象中基本数据类型boolean是这样的,但是Boolean包装类型并不是如此,后面会对这里进行探索,坑很大。 实例深究JavaBean规范首先了解下JavaBean的规范,属性应该由一组读写方法(Getter/Setter)来访问,如果操作的字段为boolean类型,此时Getter不应命名为getXXX方法,而应该是isXXX,如果boolean类型的属性名以is开头,则将属性名中的is自动去除,例如boolean isSuccess的Getter是isSuccess(),但是对于Boolean类型的属性并没有明确的规范进行约定。 以下示例基于IDEA 2023.1 JDK11 布尔类型存在基本数据类型和包装类型,所以存在四种情况 1234private boolean succe...
Ubuntu 安装 Docker 操作手册
官方操作手册 操作系统要求要安装 Docker 引擎,您需要以下 Ubuntu 版本的 64 位版本之一: Ubuntu Questing 25.10 Ubuntu 探索版 25.10 Ubuntu Plucky 25.04 Ubuntu 勇敢版 25.04 Ubuntu Noble 24.04 (LTS) Ubuntu 贵族版 24.04 (LTS) Ubuntu Jammy 22.04 (LTS) Ubuntu 甜蜜版 22.04 (LTS) Ubuntu 的 Docker Engine 与 x86_64(或 amd64)、armhf、arm64、s390x 和 ppc64le(ppc64el)架构兼容。 查看系统版本 1234567891011121314sharkidon@ubuntu:~$ cat /etc/os-releasePRETTY_NAME="Ubuntu 25.10"NAME="Ubuntu"VERSION_ID="25.10"VERSION="25.10 (Questing ...
Ubuntu修改国内源解决下载问题
经常使用Ubuntu的同学都会遇到软件安装下载速度慢的情况,究其原因,是因为Ubuntu默认源的地址都在国外所导致,其实国内也有很多优秀的源,比如阿里源、中科大源、清华源、163源等,只需要简单的更换一下源,下载度立刻就上来了。 以下操作都必须在管理员模式下(使用su命令进入)进行,否则会执行失败 备份官方源 1mv /etc/apt/sources.list /etc/apt/sources.list.bk 下载第三方源文件更换 具体使用哪一个,可以自行测试按照效果选用 1234567891011#163源wget 'https://gitee.com/zaozuotime/ubuntu-update-source-file/raw/master/163.sources.list' -O /etc/apt/sources.list#阿里源wget 'https://gitee.com/zaozuotime/ubuntu-update-source-file/raw/master/aliyun.sources.list' -O /etc...
Tomcat进程残留问题
运行shutdown.sh,tomcat停止, 但它的java进程还在, 不过状态为S(sleep), 不是运行时的R(Runnable), 如果不kill的话, 这种进程越来越多,导致JVM进程越来越多, 占据了大量的内存空间, 有可能使得新程序在启动JVM时由于内存不够用而无法启动。 kill强制杀死进程1ps -ef|grep java 若显示以下内容代表使用的java进程还存在,没有完全停止 12345root 50530 1 99 10:25 pts/0 00:00:45 /usr/local/java/jdk1.7.0_51/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-7.0.92/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dign...
Oracle特殊字符处理
在Oracle数据库中,有时字段中会存入一些特殊字符(设计不当或者程序BUG),例如制表符、换行符以及回车符等,如果包含特殊字符是看不出来的,但是在进行字段关联的时候就会查不出数据。 特殊字符ASCII码定义: 制表符 chr(9)换行符 chr(10)回车符 chr(13) 去掉表中的特殊字符1update table set field=replace(field,chr(9), '') where instr(field, chr(9)) > 0 其他特殊字符也可以使用ascii函数查出ASCII码然后进行替换1select ascii('?') from dual;
Linux防火墙命令
linux系统常用的防火墙分别是iptables和firewall防火墙,记录一下常用的命令 firewall防火墙12345678910111213141516171819202122232425#查看firewall服务状态systemctl status firewalld#查看firewall的状态firewall-cmd --state# 开启service firewalld start# 重启service firewalld restart# 关闭service firewalld stop#查看防火墙规则firewall-cmd --list-all # 查询端口是否开放firewall-cmd --query-port=8080/tcp# 开放80端口firewall-cmd --permanent --add-port=80/tcp# 移除端口firewall-cmd --permanent --remove-port=8080/tcp#重启防火墙(修改配置后要重启防火墙)firewall-cmd --reload 参数解释firwall-cmd:是Lin...
Windows系统SSH服务安装指南
最近在做Jenkins的持续集成,公司的应用服务器大多是Windows系统,平时的运维主要是靠远程桌面的方式,为了使用Jenkins自动部署,需要在windows系统上安装SSH的服务,这里介绍微软官方的解决方案,详细介绍可以参考官网wiki。基于PowerShell的OpenSSH: https://github.com/PowerShell/Win32-OpenSSH/releases 安装步骤 进入链接下载最新的OpenSSH-Win64.zip,解压至 C:\Program Files\OpenSSH 打开cmd,进入 C:\Program Files\OpenSSH安装目录,执行以下命令 1powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1 设置服务自动启动并启动服务 12sc config sshd start= autonet start sshd 修复主机端的文件权限,进入 C:\Program Files\OpenSSH,右键 FixHostFilePermissions.ps1【使...
Spring MVC接口监控必备:原始路径模板获取全解析
问题场景原始路径模板:/users/{id}实际获取路径:/users/40000478 在监控和统计场景中,带具体参数值的路径会导致: 相同的接口被统计为多个不同的路径 难以进行有效的聚合分析 通知信息不够清晰直观 解决方案:Spring MVC路径模板获取Spring MVC在处理请求时,会在请求属性中存储丰富的映射信息。通过以下方式可以获取原始路径模板: 12345678910111213import org.springframework.web.servlet.HandlerMapping;import javax.servlet.http.HttpServletRequest;public class MonitoringUtils { public static String getOriginalPathPattern(HttpServletRequest request) { // 获取最佳匹配的路径模式,如 /ad/launch/task/sendConfirmEmail/{id...
Typora安装与配置
Typora安装注册 先安装 typora-setup-x64-1.2.4.exe,并记录安装路径,下载地址 将 app.asar 替换到安装路径下的resources文件夹,替换掉app.asar文件 重启typora!!!!!! 输入邮箱、注册码,邮箱随便输入,注册码:E8Q9Y5-KXMTL5-7578SL-4S5XKS 仅供学习,请在下载24小时之内删除,请支持正版 图片上传文件 -> 偏好设置中设置图像相关配置,上传服务我使用的是PicGo-Core(command line),其实和PicGo-Core(app)一样,主要是我不想托盘中多出一个程序放在那里,看着不舒服 点击下载或更新,下载更新完成后,点击打开配置文件,配置图床的地址,有些版本能直接打开,有些无反应,需要手动进到指定的目录进行修改config.json文件 picgo 的默认配置文件为~/.picgo/config.json。其中~为用户目录。不同系统的用户目录不太一样。 linux 和 macOS 均为~/.picgo/config.json。 windows 则为C:\Users\你的用...
VSCode Python开发配置
Jupyter VSCode中安装jupter插件 使用#%%分割代码块 .ipynb文件中使用jupyter vscode中运行jupter时提示需要安装ipykernel,安装报错可以执行以下脚本进行安装 打开工程:code + 路径 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ipykernel Pylance Python › Analysis: auto format string Python › Analysis › Inlay Hints: Call Argument Names 选择partial Python › Analysis: Type Checking Mode 选择standard Python › Analysis: inlay Hints:Function Return Types IntelliCode CompletionsAI自动补全功能 Code Spell Checker单词拼写检查 Error lens错误检查
Spring事务代码重构实战:用事务回调优化业务逻辑
背景在开发过程中我们更多的是使用Spring的声明式事务,也就是使用@Transactional注解。 需要注意的是@Transactional在很多种情况下失效,总结起来大概两种场景,第一没有经过Spring Bean的AOP代理,比如同一个bean中,一个方法调用另一个方法,如果第二个方法使用声明式事务处理就不会生效。 第二是在异步线程中,Spring的声明式事务不会达到预期的效果,在方法中启动了一个异步线程,异步线程中事务控制,这种情况对于事务的处理会达不到预期效果,因为主线程和异步线程拿到的数据库连接不同,无法保证主线程和异步线程的事务一致性。 在很多场景下,可能会有分布式事务问题,但是由于各种历史原因,或者引入的成本太高,或者这个场景对一致性的要求并不是特别的高,我们一般会尽量的去保证做到事务的一致性,并没有引入本地消息表、事务消息等去实现。 在开发过程中,我们要保证事务尽量小。因为开启关闭事务是有资源消耗成本存在,另外就是数据库的连接池也是有限的,如果存在大事务,他持有的这个线程一直不释放,那么对于整个线程池的吞吐量会有影响,所以在代码实现时需要避免大事务,能批量...








