首页 > 其他分享 >重构MQ处理架构:MVEL表达式和责任链设计模式应用实践

重构MQ处理架构:MVEL表达式和责任链设计模式应用实践

时间:2024-05-24 10:20:46浏览次数:18  
标签:请求 Chain 处理 MVEL 接口 MQ Command 设计模式

重构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使用。

 

翻译

搜索

复制

标签:请求,Chain,处理,MVEL,接口,MQ,Command,设计模式
From: https://www.cnblogs.com/papering/p/18210062

相关文章

  • Windos环境安装RocketMQ
    1.下载RocketMQ安装包,这里下载二进制包安装地址:https://rocketmq.apache.org/download/2.配置系统环境变量3.修改脚本文件配置(runbroker.cmd、runserver.cmd)RocketMQ默认的虚拟机内存较大,启动可能因为内存不足报错,用记事本打开bin目录下的runbroker.cmd打开runserver.cm......
  • uniapp中使用mqtt.js的踩坑记录
    最近在uniapp的vue3.0版本中使用mqtt.js库时遇到了一些坑,经过亲身踩坑,现在把实际能够实现在uniapp的app端能够使用mqtt.js的方法步骤记录如下:一、安装首先安装mqtt.js,建议使用较为稳定的3.0.0版本:[email protected]二、引入mqtt.jsimportmqttfrom'mqtt/dist/mqtt.......
  • Spring框架中都用到了哪些设计模式?
    这是一道相对有难度的题目,你不仅要回设计模式,还要知道每个设计模式在Spring中是如何使用的。简单工厂模式:Spring中的BeanFactory就是简单工厂模式的体现。根据传入一个唯一的标识来获得Bean对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定。工厂模式:Spring......
  • Asp .Net Core 系列:集成 CAP + RabbitMQ + MySQL(含幂等性)
    简介官网:https://cap.dotnetcore.xyz/CAP是什么?是一个EventBus,同时也是一个在微服务或者SOA系统中解决分布式事务问题的一个框架。它有助于创建可扩展,可靠并且易于更改的微服务系统。什么是EventBus?事件总线是一种机制,它允许不同的组件彼此通信而不彼此了解。组件可以......
  • RabbitMQ广播模式
    RabbitMQ广播模式Fanout交换机工作原理Fanout交换机会将接收到的消息广播给所有与之绑定的队列,不考虑路由键。每个绑定到fanout交换机的队列都会接收到消息。使用场景广播消息:所有消费者都需要接收到相同的消息。日志广播:将日志消息广播给多个日志处理服务。Direct......
  • 设计模式06----桥接模式
    桥接模式(BridgePattern)属于结构型设计模式,用于将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,使得这两层能够独立地扩展。桥接模式通常包含以下角色:抽象化(Abstraction):定义抽象类的接口,维护对实现化对象的引用。细化抽象(RefinedAbstraction):扩展抽象化角色,......
  • LLM-文心一言:modbus、opc、can、mqtt协议
    Modbus、OPC、CAN和MQTT都是不同的通信协议,它们在工业自动化、物联网和其他领域有着广泛的应用。以下是对这些协议的简要介绍:Modbus:Modbus是一种串行通信协议,由Modicon公司(现为施耐德电气的一部分)在1979年提出,用于可编程逻辑控制器(PLC)之间的通信。它已经成为工业领域通信协议的......
  • Java核心面试知识集—设计模式
    设计模式知识点笔记汇总1.单例模式(SingletonPattern)2.工厂模式3.抽象工厂模式(AbstractFactoryPattern)4.模板方法模式(TemplateMethodPattern)5.建造者模式(BuilderPattern)6.代理模式(ProxyPattern)7.原型模式(PrototypePattern)8.中介者模式9.命令模式10.责任链模式11......
  • rabbitMq的status报错Error: unable to perform an operation on node ‘rabbit……
    遇到下图这个错大部分问题可能是由于 RabbitMQ CLI工具的ErlangCookie与服务器上的不匹配而导致连接问题。ErlangCookie在RabbitMQ节点之间进行身份验证和安全通信时起着重要作用。可以在c盘搜索一下看下两个.erlang.cookie文件中的内容是否一致,不一致的话就改成一致的......
  • RocketMq如何实现顺序消息?
    RocketMq是一款金融级别的消息中间件,作为高可靠的中间件,在需要保证消息顺序性的场景下,可不能掉链子!那么,RocketMq是如何实现顺序消息的呢?RocketMq并不保证Topic维度的消息顺序性,而是在Queue维度保证了消息顺序性。RocketMq的消费进程会同步消费Queue中的消息,且消费......