fabric.js 不同类型 不同控件_策略模式支持不同类型的消息队列
需求来源
现有采集数据平台:主要是通过snmp协议等各种协议从不同的系统中获取数据,并将数据发送到kafka中。
最近在和项目经理聊天的过程中发现现有一个客户数据量不大,数万级别,这样的客户还不少,使用ActiveMQ或者RabbitMQ就可以支撑,但是采集数据平台现在只能对接kafka,所以需要对数据采集平台进行改造,让采集平台可以通过配置的方式就可以达到消息队列之间的切换。
需求分析和设计
对接不同厂商的数据,它们之间都会有这样的共性。
共性1:通过一种方式获取厂商的数据。
共性2:将厂商的数据发送到消息队列中。
共性3:消息队列客户端的连接初始化和获取。
这样我们就能够将以上三点抽象成一个接口,叫做厂商生产者接口,将以上3个共性作为厂商生产者接口中的方法。未来对接任何一个厂商,只需要实现这个接口即可。厂商生产者接口代码设计如下。
/** * @author : zhangqing * @Description: 消息队列生产者策略,ActiveMQ,Kafka,RabbitMq等等 * @date : 2020年06月08日 16:33 */public interface ProducerStrategy { /** * 获取来自不同厂商类型的数据,将数据进行处理,作为生产者数据的来源 */ public void produceData(); /** * 数据发送到队列 * @param data */ public void sendRecordToQueue(String data); /** * 获取消息队列生产者的客户端 * @return */ public T getProducerClient();}
为了满足需求,使用策略模式 + 反射的技术,可以做到根据配置文件中设定的参数,就可以指定当前项目使用哪个消息队列。策略模式设计如下:
UML类图可能会不太严谨
解释一下以上的策略模式:
1、项目为SpringBoot构建,在DynamicSnmpClient中有一个queueType属性,当前属性是获取项目启动的时候指定的消息队列类型。
2、QueueContext为策略模式中的环境类,主要是封装动作或者算法的行为,在这里是封装了发送厂商数据的行为。
3、左图的Abstract抽象类,主要是进一步对消息队列进行抽象,我们将初始化消息队列和发送消息队列的行为,直接在抽象类中实现,因为这两个行为是每个消息队列必须要实现的行为。
4、最下面为具体的实现,最终的实现只有发送数据这个行为,也就是不同系统对接,需要我们自己去实现,消息队列的初始化和发送行为已经被实现,开发人员就可以更加专注于各个厂商对接代码的开发。
反射技术的实现:用反射技术主要就是根据配置文件中的类型去实例化消息队列。
public ProducerStrategy getQueueType(String queueProducerClass) throws Exception{ Class> clazz = Class.forName(queueProducerClass); ProducerStrategy producerStrategy = (ProducerStrategy)clazz.getMethod("getInstance").invoke(null,null); return producerStrategy; }
配置消息队列的类型
通过 抽象出厂商接口 + 策略模式 + 反射技术可以做到以下两点。
1、灵活性:不用修改代码就可以切换消息队列的类型,只需启动项目指定类型即可。
2、扩展性:如果在增加一个消息队列,我们只需要增加对接厂商的代码,不用修改原本的代码,做到设计模式中的开闭原则:对扩展是开放的,对修改是关闭。
fabric.js 不同类型 不同控件_策略模式支持不同类型的消息队列相关推荐
- fabric.js 不同类型 不同控件_耐温灌封胶都哪几个类型?不同类型的灌封胶有哪些不同之处?...
在胶粘剂市场上,灌封胶属于广义概念,并不是特指某一个种类.能够对电子元器件进行灌封和粘接,起到保护的作用.尤其是耐温灌封胶,能够抵抗高温,不会受到高温的影响,正常去工作.这种胶粘剂更有市场,被更多领域 ...
- JS与APP原生控件交互
"热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...
- layui日期与vue_详解Vue.js和layui日期控件冲突问题解决办法
详解Vue.js和layui日期控件冲突问题解决办法 发布于 2020-8-10| 复制链接 摘记: 事故还原: 今天在用layui的日期控件的时候发现一个问题,就是form表单中的日期选择之后,如果 ...
- java 开源控件_一些好用的开源控件
工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验.有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附上,毕竟人家是会更新的.大家还有什么好用的开源控件欢 ...
- js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件
js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件 参考文章: (1)js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) ...
- java绘制图表控件_画图控件 Chart Control -Java架构师必看
.NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直网络 .NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用 ...
- WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法。
WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 原文: WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https ...
- CADEditorX新控件_可进君羊交流与学习
CADEditorX是一个ActiveX组件,用于在支持ActiveX和COM技术的任何开发环境中(例如C#,Visual C ++,Delphi,VB,JavaScript等)将CAD功能添加到网页 ...
- 如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持
最近研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持. 下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中. 以下的 ...
最新文章
- Tungsten Fabric SDN — 与 OpenStack 的集成架构
- [Issue Fixed]-不能为虚拟电脑xxx打开一个新任务
- CentOS添加一个新的硬盘、添加分区到挂载的过程
- 网络编程(part4)--刷新缓冲区
- 无线路由器的WDS功能如何配置?
- 在ASP.NET Core中使用Apworks快速开发数据服务
- 2.2 理解 mini-batch 梯度下降法
- C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
- 2022微服务面试题 最新50道题(含答案解析)
- AI方向的实验室调研(截至18年,未更新)
- html实现点击下载文件
- 2020计算机校友会大学排名,2020年校友会大学排名:一个世界一流大学,一个中国一流大学...
- 记一次react项目部署之后页面加载极度缓慢的问题
- Vue keep-alive的使用
- 越来越快的jsRuntime——Bun
- verilog always块中case相关问题
- Python数据类型变量命名format集合等
- FF新闻、头条新闻等开机弹出的广告删除办法
- 想精通单片机开发,这些必备基础知识不可不掌握
- python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...
热门文章
- c获取当前程序的路径_漏洞挖掘|使用AFL Fuzzing网络程序
- 各种图片格式的生成工具(HTML、URL、BBCode、Markdown、Link)
- Youki的C++命名规则
- windows设置开机启动项
- Android——Fragment的使用(上)
- 881.BoatstoSavePeople
- JAVA之outofmemory
- Python:获取命令行参数
- 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)...
- 面试—每日一题(2)