2019.08.15日记,记录一次多个业务并行运行的思路

2024-06-17 14:18

本文主要是介绍2019.08.15日记,记录一次多个业务并行运行的思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记录一次在处理业务过程中遇到的问题,

背景是这样子,有一天boss过来找我说,小王呀,公司现在有一个只有一个支付宝的支付功能,为了拓展业务,所以又打算接入一个微信的支付功能,现在要求这两个功能同时上线运行,然后又随机分配,如果其中一个出了问题可以马上切换到另一个顶上去!

然后boss说完需求就自顾自的去忙了,留下一脸懵逼的我!!

不管怎么样,需求提出来了,功能还是要做的。

思前想后,想出了一个解决思路,可以利用多态的思想,建立一个基类/接口,上代码

public interface BaseData {public String getName();
}

然后其下面有两个子类


@Component("DataOne")
public class DataOne implements BaseData {public String getName(){return "DataOne";}
}
@Component("DataTwo")
public class DataTwo implements BaseData {public String getName(){return "DataTwo";}
}

最后再创建一个代理类

@Component
public class PoxyData {Random random = new Random();@Autowired@Qualifier("DataOne")BaseData DataOne;@Autowired@Qualifier("DataTwo")BaseData DataTwo;public BaseData getData(){List<BaseData> baseDataList = new ArrayList<>();baseDataList.add(DataOne);baseDataList.add(DataTwo);int index =  random.nextInt(2);return baseDataList.get(index);}}

最后是调用

@RestController
public class TestController {@AutowiredPoxyData poxyData;@GetMapping("/test1")public String testClient1() {return poxyData.getData().getName();}
}

最后看一下运行结果

这里可以看到大概的功能已经实现了

通过一个代理类去封装里面业务实现的细节的,然后对外只暴露一代理类,跟据需求去里面取对应的实现类就行了。

然后你以为这样子就可以吗?图样图森破,细心的同学可能已经发现了

没错,就是他,这是不是意味着,如果有多个业务的话,就要写多个属性??这对于这么懒的小编来说,是不可以接受的

于是,屁颠屁颠的跑去跟小组长求救,于是乎有了改良版


@Component
public class PoxyData  implements BeanPostProcessor {Random random = new Random();List<BaseData> baseDataList = new ArrayList<>();
//    @Autowired
//    @Qualifier("DataOne")
//    BaseData DataOne;
//
//    @Autowired
//    @Qualifier("DataTwo")
//    BaseData DataTwo;@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof BaseData) {baseDataList.add((BaseData) bean);}return bean;}public BaseData getData(){int index =  random.nextInt(2);return baseDataList.get(index);}}

通过继承BeanPostProcessor ,然后他的 postProcessAfterInitialization方法里面把BaseData的子类全部放到集合中,

对于BeanPostProcessor不了解的同学,可以点这里去了解一下

就此,可以实现boss提出的功能啦!想想还是蛮开心的啦

这篇关于2019.08.15日记,记录一次多个业务并行运行的思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069675

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项