springboot事件发布机制之生产运用

文章目录

  • 前言
  • 一、使用场景
  • 二、注意事项
    • 1.降低业务代码和主流程逻辑的耦合度
    • 2.是否需要在同一个事物、是否需要进行异步处理
  • 三、总结


前言

大家好我是大飞!
现在大环境不好了,防御式编程当然是现在必不可少的技能了,今天说一下防御式编程之事件发布机制。之前也写过一篇【关于事件发布机制源码浅析】的文章,如果之前还没了解过事件发布机制的同学可以看一下这篇文章,没有用过的可以先看一下我的这篇文章。之前简单介绍过事件发布机制,今天讲一下在实际情况中的运用需要注意哪些问题。`


一、使用场景

我的使用场景,最近做了一项目核心的业务都是审批流,事件流程的情况非常多,并且这次没有使用流程引擎。在项目开发结束之后,需要迭代一个待办的功能,就是流程到了哪个节点,就需要给节点的审批人发消息。这个时候我肯定不希望在以前的业务代码的里面写太多的逻辑代码,尽量不要影响以前的代码逻辑。这个时候我觉得引入spring boot的事件发布机制还不错,不排除后续还有其他需求引入进来。这样方便以后扩展把。

二、注意事项

1.降低业务代码和主流程逻辑的耦合度

我这次主要在审批业务中集成事件,代码逻辑已经十分复杂了。为了防止主流程业务逻辑再次复杂,我在业务代码的最后,进行事件的发布。处理事件的监听器肯定还需要很多参数,这些参数虽然可以从业务代码中传过去,但是这样就是在业务代码中写更多的逻辑。所以我们发布事件的时候就传递主要的参数,详细的参数就由各个监听器去处理吧。

  @Transactional(rollbackFor = Exception.class)@Overridepublic void commitApproveRet(Long applyId) {Apply apply = baseMapper.selectById(applyId);.....................................................................baseMapper.updateById(apply);processRoster(nextOrCutNode);//发布事件applicationContext.publishEvent(NextApproveEvent.initEvent(apply,nextOrCutNode);}

2.是否需要在同一个事物、是否需要进行异步处理

实际开发中还需要特别注意事件监听器的逻辑 是否需要和主流程保持在同一事物中,以及是否使用多线程进行异步处理。

目前我的业务场景,适合异步操作。但是异步的前提我的业务逻辑的事物已经完成提交了。因为我是直接用注解开启的事物,所以我想在监听器里面执行数据库查询的时候还不能使用多线程。所以我监听器的处理逻辑,是在数据库操作完成之后,再开启的多线程进行处理。

  @EventListenerpublic void approvedEventListener(NextApproveEvent event){log.info("-------------发送完成代办消息----------");try{List<ToDo> list = handleData(event);executor.execute(()->{SendToDoUtils.sendMsg(list);));}catch (Exception e){log.error("发送完成待办消息出错:{}",JSON.toJSONString(event),e);}}

在使用事件发布机制的时候,我们要在业务上确定,监听事件的处理逻辑和主流程是否要进行强绑定;如果需要就必须保证在同一事务中。我在业务系统的开发过程,几乎都不需要要强绑定。不需要强绑定的情况,在事件处理的时候就可以进行异步处理,提高程序响应速度,或者捕捉异常,防止事务回滚影响正常业务。当然如果是业务上需要进行强绑定,就必须保证在同一事务下,就不要捕捉异常,防止事务不能回滚。

三、总结

做了六年的java开发了,在业务开发中比较难受的就是维护别的代码,特别是那种不写注释,还滥用设计模式的代码了。能在业务代码中用设计模式的大多都是为了学习而写的,所以是为写设计模式而使用设计模式罢了。
比如我们用的事件发布机制(观察模式),一个事件可以实现多个监听器,多个监听处理的业务逻辑不一样,可能有些业务需要和主流程进行同步处理,可能有些有是异步处理,异步处理时候,我事务还没提交就去读取数据,或者修改数据等问题。如果在开发中,不去考虑这些问题,可能在测试中还不会发现问题,发布到生产之后就会出各种问题。当然我还是鼓励大家在实际开发中,大胆使用,大胆探索,提升自我实力才是王道!

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

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

相关文章

数据结构与算法笔记:基础篇 - 红黑树(上):为什么工程中都用红黑树这种二叉树?

概述 上两篇文章&#xff0c;我们依次讲解了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树&#xff0c;它支持快速插入、删除、查找操作&#xff0c;各个操作的时间复杂度跟树的高度成正比&#xff0c;理想情况下&#xff0c;时间复杂度是 O ( l o g n ) O(logn) …

互联网应用主流框架整合之SpringMVC初始化及各组件工作原理

Spring MVC的初始化和流程 MVC理念的发展 SpringMVC是Spring提供给Web应用领域的框架设计&#xff0c;MVC分别是Model-View-Controller的缩写&#xff0c;它是一个设计理念&#xff0c;不仅仅存在于Java中&#xff0c;各类语言及开发均可用&#xff0c;其运转流程和各组件的应…

双列集合 HashMap以及TreeMap底层原理

双列集合 特点&#xff1a; 双列集合一次需要存一对数据&#xff0c;分别为键和值 键不能重复&#xff0c;值可以重复 键和值是一一对应的&#xff0c;每个键只能找到自己对应的值 键和值这个整体在Java中叫做“Entry对象” Map的常见API Map是双列集合的顶层接口&#xff0c;…

基于SpringBoot二手图书管理系统

摘 要 本毕业论文设计并实现了一款基于 Spring Boot 的二手图书管理系统。该系统旨在解决传统图书管理系统存在的一系列问题&#xff0c;如用户体验不佳、功能单一等。首先&#xff0c;论文详细分析了当前二手图书市场的需求和存在的问题&#xff0c;明确了设计该系统的必要性…

优秀的程序员不是你的尽头,而是起点

大家好&#xff0c;我是神仙约架&#xff0c;普通本硕毕业&#xff0c;有着10多年编程经验的“老”程序员。我曾独立挑起大梁&#xff0c;承接过各种项目&#xff0c;为公司解决了不少棘手的问题。今天&#xff0c;我想以一位过来人的身份&#xff0c;给刚踏入编程世界的你们一…

你还不知道无线PLC?

随着技术的不断发展&#xff0c;工业控制系统也在经历着革新。无线PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种结合了无线通讯技术和传统PLC系统的创新型技术。它为工业自动化提供了一种更灵活、更便捷的解决方案&#xff0c…

C#实现定时执行任务

using System; using System.Timers;class Program {static void Main(){Timer timer new Timer();timer.Interval 1000; // 设置定时器间隔时间&#xff0c;单位为毫秒timer.Elapsed Timer_Elapsed;timer.Start();Console.WriteLine("Press any key to exit...")…

k8s-CCE创建工作负载变量引用

CCE创建工作负载变量引用 背景&#xff0c;看到cce创建负载时会生成变量&#xff0c;如下。在skywaking-agent的使用&#xff0c;想要调用cce负载变量生成service_name。 -Dskywalking.agent.authentication里含有敏感信息需要写到配置项。简单粗糙的都写到配置项好像不合适。…

AP的数据库性能到底重要吗?

先说结论&#xff1a;没那么重要。甚至可能不重要。 我用我的经历和分析给大家说说。诸位看看如何。 不重要的观点是不是不能接受&#xff1f; 因为这些是站在我们角度觉得的。而实际上使用者&#xff08;业务或者用户&#xff09;&#xff0c;真的不太在乎我们所在乎的。 …

简单聊聊大数据解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

IO流(转换流)

InputStreamReader&#xff08;字符输入转换流 &#xff09; 解决不同编码时&#xff0c;字符流读取文本内容乱码的问题 public static void main(String[] args) {try (//1.得到文件的原始字节流(GBK的字节流形式)FileInputStream is new FileInputStream("src/666.tx…

C语言 | Leetcode C语言题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; int candy(int* ratings, int ratingsSize) {int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < ratingsSize; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] ratings[i - 1] ? 1 : pre 1;ret pre;inc…

2024PTA算法竞赛考试编程题代码

目录 前言 题目和代码 L1-006 连续因子 L1-009 N个数求和 L2-004 这是二叉搜索树吗&#xff1f; L2-006 树的遍历 L2-007 家庭房产 L4-118 均是素数 L4-203 三足鼎立 L2-002 链表去重 L2-003 月饼 L2-026 小字辈 L4-201 出栈序列的合法性 L4-205 浪漫侧影 前言 所…

理解 Java 中的 `final` 关键字

理解 Java 中的 final 关键字 final 关键字是 Java 编程语言中一个重要的修饰符&#xff0c;它可以应用于类、方法和变量。理解 final 的用法和作用对于编写稳健和高效的 Java 代码至关重要。在本文中&#xff0c;我们将深入探讨 final 关键字的各种用法及其意义。 一、final…

python数据分析-Matplotlib绘图实例以及金融数据分析应用

通过学习扩展库matplotlib及背后的理论知识进行数据分析和可视化&#xff0c;重点以案例分析为主&#xff0c;通过实际案例演示相关理论和Python语言的应用。 读取文件countries-aggregated.csv数据&#xff0c;其中Date&#xff1a;日期, Country&#xff1a;国家, Confirmed…

‘AndroidStudio工具平台’尝试运行‘Android原生项目’

AndroidStudio工具平台 (内嵌Intelli IDEA集成环境) /Users/haijunyan/Library/Android/sdk 配置环境变量: #adb命令,安装APK查看连接设备 platform-tools #emulator命令,通过命令创建模拟器 tools #用NDK框架搭建的项目,用到下面的命令编译 ndk-bundle 等等 //查看当前设备…

Linux iptables详解

前言&#xff1a;事情是这样的。最近部门在进行故障演练&#xff0c;攻方同学利用iptables制造了一个故障。演练最终肯定是取得了理想的效果&#xff0c;即业务同学在规定时间内定位了问题并恢复了业务(ps&#xff1a;你懂得)。 对我个人来讲一直知道iptables的存储&#xff0…

Linux信号基础

一、信号概念 信号是事件发生时对进程的通知机制&#xff0c;也可以把它称为软件中断。信号与硬件中断的相似之处在于能够 打断程序当前执行的正常流程&#xff0c;其实是在软件层次上对中断机制的一种模拟。大多数情况下&#xff0c;是无法预测信号达到的准确时间&#xff0c;…

pyqt opengl 小黑块

目录 OpenGLWidget_g初始化函数&#xff1a; 解决方法&#xff1a;把初始化函数的parent去掉 pyqt opengl 小黑块 原因&#xff1a; 创建OpenGLWidget_g的时候把main_window作为父类&#xff08;self&#xff09;传进去了&#xff0c; self.opengl_widget OpenGLWidget_g(…

Java面向对象-方法的重写、super

Java面向对象-方法的重写、super 一、方法的重写二、super关键字1、super可以省略2、super不可以省略3、super修饰构造器4、继承条件下构造方法的执行过程 一、方法的重写 1、发生在子类和父类中&#xff0c;当子类对父类提供的方法不满意的时候&#xff0c;要对父类的方法进行…