重构MQ处理架构:MVEL表达式和责任链设计模式应用实践
重构MQ处理架构:MVEL表达式和责任链设计模式应用实践 https://mp.weixin.qq.com/s/_UZhfi1BiGNHQAHWhGus8Q
3.责任链设计模式
【3.1 定义】
责任链模式(Chain of Responsibility)又名职责链模式,是一种行为设计模式,它允许你构建一个由多个对象组成的链,每个对象都有机会处理请求,或者将请求传递给链中的下一个对象。这种模式常用于处理请求的对象之间存在层次关系的情况。责任链模式的主要目的是解耦发送者和接收者,使多个对象都有机会处理请求,而不是将请求发送者与接收者硬编码在一起。
【3.2 结构】
抽象处理者(Handler):定义一个处理请求的接口,包含抽象处理方法并维护一个对下一个处理者的引用。
具体处理者(Concrete Handler):实现处理请求的接口,判断能否处理本次请求,如果能够处理则处理,否则将请求传递给下一个处理者。
客户端类(Client):创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
【3.3 优缺点】
3.3.1 优点
a.松散耦合:责任链模式使得请求发送者和接收者解耦,每个处理者仅需关心自己能否处理请求,而不需要知道整个处理流程的细节。
b.灵活性:可以动态地改变处理者之间的关系和顺序,新增或删除处理者,以适应不同的需求和场景。
c.可扩展性:容易添加新的处理者,无需修改现有的代码,符合开闭原则。
d.单一职责原则:每个具体处理者只负责处理特定类型的请求,符合单一职责原则,使得代码更清晰和可维护。
3.3.2 缺点
性能问题:在责任链比较长的情况下,请求可能需要遍历整个链条才能找到合适的处理者,可能影响性能。
【3.4 Apache Chain 职责链】
整个Apache Chain职责链,包括Context、Command和Filter三个核心组件以及ChainBase类。
3.4.1 Context 接口
Context 表示命令执行的上下文,在命令间实现共享信息的传递,父接口是 Map,它只是一个标记接口。
3.4.2 Command 接口
Commons Chain 中最重要的接口,表示在 Chain 中的具体某一步要执行的命令。它只有一个方法:boolean execute(Context context),如果返回 true,那么表示 Chain 的处理结束,Chain 中的其他命令不会被调用;返回 false,则 Chain 会继续调用下一个 Command,直到 Chain 的末尾或抛出异常。
3.4.3 Filter 接口
它是一种特殊的 Command,除了 Command 的 execute 方法之外,还包括了一个方法:boolean postProcess(Context context, Exception exception),Commons Chain 会在执行了 Filter 的 execute 方法之后,执行 postprocess(不论 Chain 以何种方式结束);Filter 执行 execute 的顺序与 Filter 出现在 Chain 中出现的位置一致,但是执行 postprocess 顺序与之相反。如:execute 的执行顺序是:filter1 -> filter2;而 postprocess 的执行顺序是:filter2 -> filter1。
3.4.4 ChainBase 类
ChainBase 实现 Chain 接口。Chain表示“命令链”,要在其中执行的命令,需要先添加到 Chain 中,Chain 的父接口是 Command。ChainBase类可以直接在Spring使用。