《Java工程师必读手册》——Java经验之谈系列——那些年,我们见过的Java服务端“问题”(4)

简介: 《Java工程师必读手册》——Java经验之谈系列——那些年,我们见过的Java服务端“问题”(4)

接上篇:https://developer.aliyun.com/article/1228228?spm=a2c6h.13148508.setting.32.62774f0e61109O


三、 流程定义不合理

 

1. 原有的采购流程

 

这是一个简易的采购流程,由库管系统发起采购,采购员开始采购,采购员完成采购,同时回流采集订单到库管系统。

 

image.png 

 

其中,完成采购动作的核心代码如下:

 

image.png 

 

由于函数backflowPurchaseOrder(回流采购单)调用了HTTP接口,可能引起以下问题:

 

该函数可能耗费时间较长,导致完成采购接口成为慢接口;

该函数可能失败抛出异常,导致客户调用完成采购接口失败。

 

2. 优化的采购流程

 

通过需求分析,把“采购员完成采购并回流采集订单”动作拆分为采购员完成采购回流采集订单两个独立的动作,把采购完成拆分为采购完成和“回流完成”两个独立的状态,更方便采购流程的管理和实现。

 

image.png 

 

拆分采购流程的动作和状态后,核心代码如下:

 

image.png 

 

其中,函数executeBackflow(执行回流)由定时作业触发执行。如果回流采购单失败,采购单状态并不会修改为“已回流”;等下次定时作业执行时,将会继续执行回流动作;直到回流采购单成功为止。

 

3. 有限状态机介绍

 

1) 概念

 

有限状态机(Finite-state machine,FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的一个数学模型。

 

2) 要素

 

状态机可归纳为4个要素:现态、条件、动作、次态。

 

image.png 

 

现态指当前流程所处的状态,包括起始、中间、终结状态

条件也可称为事件;当一个条件被满足时,将会触发一个动作并执行一次状态的迁移

动作:当条件满足后要执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态

次态:当条件满足后要迁往的状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

 

3) 状态

 

状态表示流程中的持久状态,流程图上的每一个圈代表一个状态。

 

初始状态:流程开始时的某一状态;

中间状态:流程中间过程的某一状态;

终结状态:流程完成时的某一状态。

 

使用建议

 

状态必须是一个持久状态,而不能是一个临时状态;

终结状态不能是中间状态,不能继续进行流程流转;

状态划分合理,不要把多个状态强制合并为一个状态;

状态尽量精简,同一状态的不同情况可以用其它字段表示。

 

4) 动作

 

动作的三要素:角色、现态、次态,流程图上的每一条线代表一个动作。

 

角色:谁发起的这个操作,可以是用户、定时任务等;

现态:触发动作时当前的状态,是执行动作的前提条件;

次态:完成动作后达到的状态,是执行动作的最终目标。

 

使用建议

 

每个动作执行前,必须检查当前状态和触发动作状态的一致性;

状态机的状态更改,只能通过动作进行,其它操作都是不符合规范的;

需要添加分布式锁保证动作的原子性,添加数据库事务保证数据的一致性;

类似的动作(比如操作用户、请求参数、动作含义等)可以合并为一个动作,并根据动作执行结果转向不同的状态。

 

接下篇:https://developer.aliyun.com/article/1228223?groupCode=java

相关文章
|
2月前
|
架构师 前端开发 Java
Java开发工程师的职业规划应该是什么样的?
Java开发工程师的职业规划涵盖多个阶段,包括初入行业(0-1年)、技能提升(1-3年)、技术专家(3-5年)及管理或专家路线选择(5年以上)。各阶段设定了明确的技能要求与职业目标,从掌握Java基础、常用框架到深入研究高级技术、微服务架构乃至担任管理职务或成为技术专家。通过持续学习与实践,结合个人兴趣,Java工程师可在技术或管理领域找到合适的发展方向,最终实现职业成功。
320 83
|
5天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
14 1
|
26天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。 查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。 从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。
62 0
|
2月前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
62 18
|
2月前
|
人工智能 前端开发 Java
Java开发工程师转哪个行业比较好?
Java开发工程师转哪个行业比较好?
207 2
|
3月前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
2月前
|
小程序 前端开发 JavaScript
Java开发工程师转小程序开发的前景如何?
Java开发工程师转小程序开发的前景如何?
43 0
|
4月前
|
Java
图解java工程师学习路线
图解java工程师学习路线
212 0
|
5月前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
34 0
|
5月前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
37 0