需求来源

现有采集数据平台:主要是通过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 不同类型 不同控件_策略模式支持不同类型的消息队列相关推荐

  1. fabric.js 不同类型 不同控件_耐温灌封胶都哪几个类型?不同类型的灌封胶有哪些不同之处?...

    在胶粘剂市场上,灌封胶属于广义概念,并不是特指某一个种类.能够对电子元器件进行灌封和粘接,起到保护的作用.尤其是耐温灌封胶,能够抵抗高温,不会受到高温的影响,正常去工作.这种胶粘剂更有市场,被更多领域 ...

  2. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  3. layui日期与vue_详解Vue.js和layui日期控件冲突问题解决办法

    详解Vue.js和layui日期控件冲突问题解决办法 发布于 2020-8-10| 复制链接 摘记: 事故还原: 今天在用layui的日期控件的时候发现一个问题,就是form表单中的日期选择之后,如果 ...

  4. java 开源控件_一些好用的开源控件

    工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验.有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附上,毕竟人家是会更新的.大家还有什么好用的开源控件欢 ...

  5. js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件

    js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件 参考文章: (1)js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) ...

  6. java绘制图表控件_画图控件 Chart Control -Java架构师必看

    .NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直网络 .NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用 ...

  7. WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法。

    WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 原文: WPF编程,通过KeyFrame 类型制作控件线性动画的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https ...

  8. CADEditorX新控件_可进君羊交流与学习

    CADEditorX是一个ActiveX组件,用于在支持ActiveX和COM技术的任何开发环境中(例如C#,Visual C ++,Delphi,VB,JavaScript等)将CAD功能添加到网页 ...

  9. 如何将第三方控件嵌入ToolStrip控件,并提供Design-Time支持

    最近研究了一下如何将第三方控件嵌入到ToolStrip控件中,并能提供Design-Time下的支持. 下面将详细讲解如何把系统的MonthCalendar控件嵌入到ToolStrip控件中. 以下的 ...

最新文章

  1. Tungsten Fabric SDN — 与 OpenStack 的集成架构
  2. [Issue Fixed]-不能为虚拟电脑xxx打开一个新任务
  3. CentOS添加一个新的硬盘、添加分区到挂载的过程
  4. 网络编程(part4)--刷新缓冲区
  5. 无线路由器的WDS功能如何配置?
  6. 在ASP.NET Core中使用Apworks快速开发数据服务
  7. 2.2 理解 mini-batch 梯度下降法
  8. C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
  9. 2022微服务面试题 最新50道题(含答案解析)
  10. AI方向的实验室调研(截至18年,未更新)
  11. html实现点击下载文件
  12. 2020计算机校友会大学排名,2020年校友会大学排名:一个世界一流大学,一个中国一流大学...
  13. 记一次react项目部署之后页面加载极度缓慢的问题
  14. Vue keep-alive的使用
  15. 越来越快的jsRuntime——Bun
  16. verilog always块中case相关问题
  17. Python数据类型变量命名format集合等
  18. FF新闻、头条新闻等开机弹出的广告删除办法
  19. 想精通单片机开发,这些必备基础知识不可不掌握
  20. python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...

热门文章

  1. c获取当前程序的路径_漏洞挖掘|使用AFL Fuzzing网络程序
  2. 各种图片格式的生成工具(HTML、URL、BBCode、Markdown、Link)
  3. Youki的C++命名规则
  4. windows设置开机启动项
  5. Android——Fragment的使用(上)
  6. 881.BoatstoSavePeople
  7. JAVA之outofmemory
  8. Python:获取命令行参数
  9. 如何在一个页面中动态放置多个Droppable来接受不同的Draggable?(accept参数的用法)...
  10. 面试—每日一题(2)