自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Neo.Yang的专栏

终身学习, 日益精进

  • 博客(141)
  • 资源 (3)
  • 收藏
  • 关注

原创 Kafka应用Demo: 抽取消费者公共处理代码并利用redis实现多消费者实例负载分担

*** 异步任务模型基类. 定义模型公共属性// 任务唯一ID标识, 用UUID private String taskId = "";// 任务编码(任务类别) private String taskCode = "";// 创建人 private String createUser = "";// 创建时 private Date createTime = null;// 修改人 private String updateUser = "";

2024-05-15 15:44:17 372

原创 Kafka应用Demo:生产者自定义消息分区方法

下面以一个简单的例子举例,要求key为Tom的消息放1号分区,key为Alice的消息放2号分区。实际项目使用什么样的分区算法需要根据业务场景来决定。/*** 自定义分区算法*/// 分区数量@Override// 未指定分区键,使用轮循分区(指定了key的消息不参与轮循)// 基于业务的约定. 某些消息放到固定的分区return 1;return 2;// 其它情况按key的哈希值分区@Override@Override> map) {

2024-05-10 15:54:13 393 1

原创 Kafka应用Demo:指派分区订阅消息消费

Kafka环境搭建和生产者样例代码与《》相同。

2024-05-09 16:02:15 277

原创 Kafka应用Demo:多消费者实例按主题订阅消费消息,增强系统可靠性

在本地启动两个消费者进程,配置同的群组(neo1), 订阅同一个主题消费消息。生产者和消费者代码与《》相同。

2024-05-08 15:23:31 394

原创 Kafka应用Demo:按主题订阅消费消息

Kafka安装可参考官方网站的指导(https://kafka.apache.org/quickstart), 按步骤解压压缩包,修改配置。然后再启动zookeeper和kafka-server即可。需要注意的一点:如果是在VMware虚拟机上启动的kafka, 需要修改一下server.properties配置文件,增加如下配置:advertised.listener指定访问kafka的IP和端口,IP设置为虚拟机暴露给外部访问的IP。通过本地代码连接kafka,需要使用该配置。

2024-05-07 15:56:53 423

原创 读取spring boot项目resource目录下的文件

项目开发过程中,有一些情况下将配置文件放在resource下能简化代码实现和部署时的打包步骤。例如: 项目中使用的数据库升级脚本、初始化脚本。将文件放到resource下,打包在jar包中,不能直接通过File路径读取。下面介绍两种读取文本文件内容和获取文件夹下所有子文件名的方法。

2023-12-19 11:21:26 539

原创 C++11学习笔记: tuple(元组)

C++11中的tuple是用递归定义的模板类实现的,借助了可变参数模板类的能力。个人理解tuple就是将一堆数量不限,类型各异的数据打包到一起。tulpe可以使用tuple类的构造函数或者调用std::make_tuple方法来创建。

2023-04-07 14:44:20 322 1

原创 C++11学习笔记:lambda表达式

Java 8支持lambda表达式,语法上比C++11要简单一些。C++11 Lambda表达式的语法格式参考cppreference,。个人理解lambda表达式主要是用在低频调用,代码简单的处理场景,和标准模板库的泛型算法配套使用很方便。复杂逻辑或者高频调用的代码块最好定义一个类或者函数封装一下,这些逻辑写在lambda表达式里面影响代码的可读性。下面以统计vector中大于3的值的数量为例。

2023-04-04 15:57:00 200

原创 C++11学习笔记:基于范围的for循环

基于范围的for循环在java编程中很常用,C++11也引入了这个特性。在for循环中通过一个变量遍历数组或者容器中的元素,比用迭代器方便简洁。

2023-04-03 10:21:53 208

原创 C++11学习笔记: auto关键字

C++11关键字auto的部分使用场景

2023-03-30 09:23:25 376

原创 C++11学习笔记:用initializer_list实现C++变参函数

用initializer_list实现变参函数

2022-10-14 15:37:38 416

原创 Postgres数据库使用any和all判断数组解决IN和NOT IN条件参数超限的问题

因mysql被oracle收购以及我们和A国的关系,越来越多的商业项目开始使用postgres数据。postgres号称最先进的关系型数据库,本身的能力支持绝大多数项目是没有问题的。特别是在处理空间几何坐标数据上能力很强。刚接触postgres,因不熟悉,也可能会遇到一些“坑”。参数个数超过限制导致SQL执行失败就是其中之一。

2022-09-03 19:31:38 2608

原创 Mybatis批量插入数据的两种方式

用mybatis有两种批量插入数据的方式可选:1. 拼接批量插入多条数据的SQL. 2. 使用Batch Insert技术。

2022-08-30 00:26:54 49972 6

原创 定义Mybatis拦截器动态切换postgre数据库schema

背景随着业务的发展和合规要求,产品数据库将切换到Postgres。之前不同技术域,不同交付工程的数据分库管理的方式切换到PG数据库后将通过分schema管理。ORM继续使用Mybatis,为使用迁移工作量极可能小,现有的SQL代码不做大的修改,考虑在Mybatis执行过程中做拦截,替换sql中的schema标识。提取请求参数中的schema约定rest接口请求参数中增加schema,通过切面技术从请求头中schema保持到线程变量中。1. 提取schema代码package com.postgr

2022-04-05 21:22:36 4281 6

原创 RabbitMQ应用Demo:支持多个消费者实例热插拔

需求背景有这样一些原因需要在项目中部署多个消费者实例:基于系统的可靠性提升要求。特别是基于微服务架构的容器部署方案,微服务多实例部署是保证系统可靠性的基本要求。系统负载分担的诉求,通过多实例部署提升系统整体响应效率。应对场景包括:1)同时启动多个消费者实例能同步处理MQ分派的消息。 2) 当其中一个消费者实例挂了后重启,能继续处理消息队列中的消息。3)部署动态增加一个消费者实例,能立即投入到接收消息,处理消息的过程中。方案分析要满足上面描述的应用场景,有两点需要处理:1)消费者自动确认消息修

2022-03-06 18:47:04 2518

原创 通过Mybatis执行拼接的SQL批量插入数据并返回数据库自增ID

背景开发项目引入元数据管理,表和字段都允许用户自定义管理。操作数据库的SQL就不能在mybatis 的xml配置文件里面写具体的表名和子段名。解决这个问题有两种思路,一种是用PreparedStatement组装SQL语句通过JDBC连接执行;另一种是将表名,字段名称作为参数传递到mybatis执行。这里描述第二中方案,以比较复杂的批量插入数据为例。在MySQL中创建一个简单的t_user验证。其DDL如下所示:CREATE TABLE `t_user` ( `id` int NOT NULL

2022-02-19 16:20:43 2189 1

原创 RabbitMQ应用Demo:使用exchange广播消息

环境准备安装RabbitMq: 个人是先在Win10便携机上安装VMWare Workstation, 再安装Cent OS 操作系统,在此基础上安装RabbitMQ。安装过程可以参考这篇博客: https://blog.csdn.net/hsxy123123/article/details/104006744需要注意RabbitMQ官网提供的erlang与RabbitMQ的配套版本,按版本安装。消息生产者Demo代码 private final static String EXCHANG

2022-02-03 18:22:14 2361

原创 RabbitMQ应用Demo:使用queue点对点通知消息

环境准备安装RabbitMq: 个人是先在Win10便携机上安装VMWare Workstation, 再安装Cent OS 操作系统,在此基础上安装RabbitMQ。安装过程可以参考这篇博客: https://blog.csdn.net/hsxy123123/article/details/104006744需要注意RabbitMQ官网提供的erlang与RabbitMQ的配套版本,按版本安装。消息生产者Demo代码 private final static String QUEUE_N

2022-02-03 18:11:30 1814

原创 通过自定义阻塞队列触发ThreadPoolExecutor创建非核心线程执行任务

Java项目常使用ThreadPoolExecutor创建线程池,核心参数包含corePoolSize,maximumPoolSize,workQueue。我们希望构建的线程池能满足如下条件:线程数量可控。需要设置一个最大线程数量maximumPoolSize,防止线程无限制创建,耗尽系统资源。放到线程池中的任务不会被拒绝丢弃(任务被丢弃,将导致严重的业务BUG)。所以一般定义一个无界阻塞队列(不指定大小,容量最大值是Integer.MAX_VALUE),用于缓存待执行的任务。无界队列导致maxi

2021-11-07 09:57:00 793

原创 Swagger 3.0框架搭建及简单示例

在基于Spring boot搭建的Java微服务上集成Swagger 3.0方便Restful接口调测,由于第三方组件升级和业务连续性原因。原来的Swagger 2.0需要升级到Swagger 3.0。一. 引入Swagger 3.0依赖的包 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-start

2021-07-25 09:48:10 1794

原创 通过spring actuator监控微服务健康指标

使用Spring Boot搭建微服务框架已经是Java微服务开发的主流场景。微服务监控是微服务运维管理的重要一环。Spring Actuator拥有操作简单,监控指标完善,扩展信息好的优点。参考Spring官方指导文档,梳理了一下在项目中如何使用Spring Actuator。一、配置依赖在pom文件中引入依赖的jar包: <dependency> <groupId>org.springframework.boot</group

2020-12-13 15:31:09 909

原创 equals方法误用不同类型参数导致的问题

背景最近重构代码引入了一个问题,原因是由于两个模块都定义常量 ONE。 一个定义是数字类型的1, 另一个模块定义的是“1”。其中一个模块使用了equals方法,将传入的字段串参数与常量ONE比较。抽取了公共代码后,只保留了数字1的常量定义。由于要改的地方很多,import文件路径采用批量替换的方式处理,替换后代码编译没问题。系统上到生产环境后发现有问题了。问题分析Java对象都从Object中继承equals()方法,用于判断两个对象是否相等。开发过程中可以重写equals方法,实现自己的相等比较逻

2020-11-21 18:13:22 968

原创 打包Maven公共模块项目的JavaDoc和源码

抽取公共模块是为了将其编译成jar包提给其他人使用,相同的逻辑不用每个人实现一遍。公共模块代码可读性要求很高,为了方便用户使用,我们可以将公共模块的javadoc注释以及源码打包一并发布。一、打包JavaDoc注解在pom文件中增加打包javadoc的插件配置: <plugin> <groupId>org.apache.maven.plugins</groupId> <art

2020-11-15 22:28:00 516

原创 在IDEA中设置依赖调用公共模块代码

背景开发Java项目,经常会有一些公共的代码逻辑,如:常量定义,通用的枚举,模型,方法。如果每个微服都拷贝一份,重复代码会越来越多。我们通常的做法是把些公共的代码逻辑抽取出来,放一个新的Common工程维护,编译成jar包推送到Maven仓库。其它微服通过配置pom文件,拉取公共的Common包使用。在抽取Common模块后,开发中会有两个问题:开发阶段修改了Common模块代码,微服务如何调试。修改Common模块后各微服务如何及时获取最新的版本。下面说一下这两种问题的处理方式。在IDE

2020-10-18 07:35:05 3905 1

原创 用阻塞队列实现生产者消费者模式三(终止任务)

除了正常的任务处理完后结束生产者、消费者线程外;还有用户中途强制结束任务的场景。针对用户非正常的终止任务,如何结束程序处理? 我们还是使用毒丸的方式。一、定义一个任务管理器类用于保存任务被终止的标记/** * 任务管理类. 管理任务是否被终止的标识信息. * * @author elon * @since 1.0 */public class TaskManager { /** * 标识任务是否被终止 */ private boolean isTaskTe

2020-08-23 15:34:52 582 1

原创 用阻塞队列实现生产者消费者模式二(多线程消费)

在性能优化时使用生产者消费者模式,很多时候是为了提升数据的消费处理能力。采用多个消费者线程并发处理数据,能起到性能提升的效果。下文在“阻塞队列实现生产者消费者模式一(单线程消费)” 的基础上描述。一、在接口层增加测试接口package com.elon.rest;import com.elon.service.ProConsService;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;

2020-08-16 17:44:00 625

原创 用阻塞队列实现生产者消费者模式一(单线程消费)

生产者消费者模式不在23种常用设计模式里面,但在实际工作中也经常会用到。特别是在希望将数据的生产者和消费者做隔离,或者做多线程性能优化时能派上用场。代码目录结构目录说明:config:Swagger配置,方便通过swagger调用接口测试.constant: 枚举常量定义。model:模型定义。rest: restful接口定义。service: 实现业务逻辑。这一个简单的SpringBoot项目结构.核心代码说明EnumTaskEndType定义了几种常用的任务结束方式:pa

2020-08-16 14:39:24 836 1

原创 SpringBoot查询参数支持{}[]等特殊字符的处理方案

背景Spring Boot内置了tomcat用于发布web服务,我们定义的restful接口就是通过它发布的。最近平台统一要求升级了tomcat版本,导致原来可用的接口调不通。查询发现是因为最新的tomcat不允许查询参数中包含[]{}字符。但由于原接口中有很多参数是JSON格式的,JSON中肯定有[]{}字符。修改接口或者做转义处理要修改的地方比较多,风险比较大。决定短期通过修改tomcat...

2020-02-07 13:50:35 7919 1

原创 Java stream常用实例代码

应用场景定义对象实体场景一 根据属性过滤对象场景二 提取对象中的属性场景三 按对象属性分组定义对象实体package com.elon.model;/** * 简单用户实体类 * * @author elon */public class User { /** * 用户账号 */ private String account = ""; ...

2020-01-27 15:31:41 675

原创 Activiti应用实践(六)-任务责任人转派

一、概述业务流管理一般都会有责任人转派的需求,以前面博客中的请假电子流为例。如果审批人收到一个审批请求,他可以直接审批同意或者驳回,也可以转给其他人审批处理。二、流程当前处理人在activiti的act_ru_task存储了当前待处理的任务列表。可以看到有一条lisi的审批审批任务,任务ID是47502。三、转派责任人将审批任务转换wang wu处理,转派时只要传入/** * 转派责...

2019-08-24 13:13:19 1371

原创 Activiti应用实践(五)-查询BPMN XML文件和图片资源文件

一、概述Activiti流程部署后,前端也需要在页面上看到流程的定义,还有可能会修改。下面给的是获取图片资源文件和XML文件的样例代码。二、获取图片资源Activiti提供了经由BPMN XML文件生成png图片文件的功能,也有其它更强的能力。但需要解决不同环境,字体、乱码等问题。如果需求比较简单,只是需要静态查看一下流程的定义,倒是可以在部署时直接提供一张图片,后面再查询该图片返回给前端展...

2019-08-18 20:34:38 3247

原创 Activiti应用实践(四)-提交任务

一、概述在作业流管理中,如何一个流程节点完整后需要走到下一个节点都需要提交任务。创建请假申请电子流后需要提交,流程才能走到审批环节。审批人审批请假电子流,无论是审批通过或者审批不通过都需要提交,如果审批通过提交后流程结束,如果审批不通过,提交都驳回到申请人那里;这是通过不同的条件值实现的。二、示例代码/** * 提交任务。 * * @param taskId 任务ID * @retu...

2019-08-18 20:12:46 1342

原创 Activiti应用实践(三)-查询待办和已办任务

一、概述在开发作业管理功能时,查询某个用户的待办和已办任务是基本需求。activiti也提供了接口用于查询待办和已办任务。承接上两篇博客的介绍,这里的待办和已办是指审批人待审批的电子流和已审批完成的电子流。activitid的28张表中的act_ru_task记录了待办任务;act_hi_taskinst记录了历史的已办任务。二、实现逻辑/** * 查询用户待办任务列表。 * * @...

2019-08-18 19:47:43 27412 5

原创 Activiti应用实践(二)-流程部署和创建流程实例

接上一篇描述,开发完请假流程后可以导出一份bpmn格式的xml文件,这个文件可用于部署流程和创建流程实例。包含以下几个步骤:一、引入activiti依赖的jar包创建spring boot的maven项目,在pom文件中添加如下依赖項:<dependency> <groupId>org.activiti</groupId> <arti...

2019-08-17 12:08:47 2474 2

原创 Activiti应用实践(一)-流程开发环境搭建及开发示例

一、背景activiti是常用的作业流管理工具,由于最近的项目中涉及,提前研究一下。先从官方网站下载activiti流程编辑工具(https://www.activiti.org/get-started)。我下载的是6.0版本。二、部署安装包从下载的安装包中拷贝如下3个war到tomcat的webapps目录下。启动tomcat.,三、开发作业流启动tomcat后,打开http://l...

2019-08-11 16:08:33 537

原创 使用mybatis批量插入数据时回填主键自增ID的值

一、定义插入数据库的对象模型package com.postgres.model;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;/** * 用户模型定义。 */@ApiModel(value = "用户模型")@D...

2019-07-21 09:43:43 4116

原创 通过自定义函数实现postgres主键ID自增

一、背景考虑业务连续性,新项目使用postgres数据库。从mysql数据库换到postgres很多地方不熟悉,之前常用的在表中增加一个自增 id 做主键,在mysql中建表时可以直接设置自增,postgres没有这种功能。postgres中可以设置序列,但发现序列自增时不会绕过已有的 id,如果谁手动在数据库插入了一条数据,设置了一个大一些的id,后面再插入数据使用序列自增的话,会报主键id重...

2019-07-20 08:18:51 1569

原创 使用Feign封装HTTP请求代码实例

总体说明现在的Web后端基本上都是采用微服务架构,服务间交互走http协议,通过restful接口。调用restful接口的方式很多,有用httpclient、RestTemplate, 使用第三组件如CXF。下面介绍使用第三件Feign做http请求客户端封装。不论采用哪种方式,都是为了使http接口请求native化–让客户端代码像调用本地接口那样调用远程接口。服务端发布restful接...

2019-06-16 15:14:20 2685

原创 Spring Boot配置mybatis+xml访问数据库代码样例

概述spring boot搭配mybatis访问数据库是微服务常见配置。mybatis支持注解和xml配置两种方式。下面给一个xml配置的样例。样例代码代码目录结构在application.yml中配置数据库urlserver: context-path: /elon/mybatisxml port: 10001spring: datasource: url: ...

2019-04-03 23:03:40 889

原创 GIS地图点汇聚及空间搜索算法Java实现样例

背景当我们需要在GIS地图上显示的点数据量比较大时,会考虑将多个点汇聚成一个点展示;汇聚后图标显示一个数字,以表示当前汇聚点包含了多少个原始数据对象。用户可以选择这些汇聚点查看单个原始数据的详细信息。数据汇聚展示可以让地图呈现更简洁(如果所有点展开,地图缩小时显示得密密麻麻)。另外更重要的一点是考虑GIS的性能。方案分析汇聚算法与地图的放大级别(zoom size)和当前屏幕窗口边间有关系...

2019-03-23 11:54:45 7242 3

requestleave.bpmn20.xml

bmpn xml文件定义样例。以一个简单的请假电子流为例,是用activiti-app开发的。用于博客文章引用。

2019-08-11

STL原码剖析.pdf

STL原码剖析.pdf

2012-12-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除