自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(146)
  • 收藏
  • 关注

原创 Mybatis插件原理与开发

本文将从源码的角度介绍一下mybatis的插件原理与简单开发实战。

2023-12-07 23:01:26 486

原创 Mybatis中的设计模式

mybatis中的一些设计模式

2023-12-04 21:17:00 1283

原创 Mybatis总体执行流程

梳理mybatis的总体流程

2023-12-03 23:19:07 1192

原创 Flowable+React+bpmn-js实现工作流

由于新东家使用的是React,不是Vue,而自己一直想做一个关于工作流的应用出来,断断续续,花了几个月的时间,开发了工作流的功能,后面会继续完善。

2023-05-07 23:54:56 1908 5

原创 Flowable入门

Flowable 是一个使用 Java 编写的轻量级业务流程引擎,常用于需要人工审批相关的业务,比如请假、报销、采购等业务。对于复杂的业务流程,通过数据库的状态字段难以控制和维护,工作流引擎则更易于维护和拓展工作流的流程图更加直观,流程走到了哪里,一目了然。

2023-05-07 11:23:27 1385

原创 自定义发送邮件starter

上一篇文章实现了发送带有图片和附件功能的邮件,这篇文章主要是将其封装成starter,实现复用,因为邮件功能一般都比较独立,完全可以抽取出来,编写starter,其他工程引用即可。6. 在resources目录下,新建META-INF目录及spring.factories文件,配置需要自动装配的类。4. 编辑邮件服务的接口及其实现类。2. 新增邮件自定义属性。

2022-11-01 20:57:24 318

原创 Java根据模板导出PPT

Java生成或者导出PPT的问题,都可以归为一类问题:根据模板导出PPT。毕竟这样做,比直接生成PPT要简单。因为工作中,遇到了要生成PPT的需求,所以做了一个根据模板PPT,生成目标PPT的例子,希望可以帮助大家。

2022-10-30 17:50:37 4115 3

原创 SpringBoot发送带有图片和附件的邮件

最近工作中,使用到了发送邮件的功能,邮件内容嵌套了图片,并且要携带附件。在此记录一下,希望可以帮助大家。发送附件则是使用了MimeMessageHelper#addAttachment。发送图片主要是使用了MimeMessageHelper#addInline。前提:开通邮件的POP3/SMTP/IMAP功能。1. 引入发送邮件的依赖。3. 编写发送邮件的服务。2. 添加邮件属性配置。

2022-10-23 23:58:34 1510

原创 Nacos:服务注册源码简单分析

Nacos:服务注册源码分析nacos服务注册源码分析,分为nacos客户端和服务端代码,下面先看客户端代码的简单分析。客户端服务注册流程在微服务开发中,使用nacos服务注册功能,需引入 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-disco

2021-12-14 23:19:25 682

原创 Nacos:配置中心源码简单分析

Nacos:配置中心在spring cloud中,要想使用nacos的配置管理功能,需要引入如下: <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifac

2021-12-12 17:01:33 857

原创 服务调用:openfeign

openfeign,通过定义接口和使用注解的方式,实现服务调用,相比直接通过http调用,它更符合面向对象编程,并且具有更好的复用和维护效果。要想使用openfeign,需要引入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openf...

2021-09-17 23:13:43 974

原创 Gateway实现动态路由

本文主要聊聊Spring Cloud Gateway(以下简称gateway,使用的版本是2.2.1.RELEASE),结合Nacos的注册中心,实现根据微服务名,自动路由到对应的微服务。在gateway的官网上,可以看到如下描述:大致意思是,通过如下配置,可以实现自动根据服务发现为每一个服务创建了一个路由router,这个router将以服务名开头的请求路径转发到对应的服务:spring.cloud.gateway.discovery.locator.enabled=tru...

2021-09-15 22:09:00 3528 6

原创 Nacos:动态配置管理

在微服务的多环境开发中,使用Nacos配置,从开发、测试、到部署,都可以带来很大的便利性。一般来说,一个公司有多个项目,一个项目由多个微服务组成,并且会有开发、测试、生产环境的区分。而Nacos在配置管理这方面做得还是比较好的,它可以通过namespace(命名空间)、group(分组)和data-id进行配置文件的唯一性定位。动态配置1.引入依赖: <dependency> <groupId>com.alibaba...

2021-09-15 00:57:33 1484

原创 Nacos:服务注册与发现

Nacos是阿里巴巴的一款开源软件,主要用于:服务注册与发现和动态配置管理。更多介绍,可到官网了解:什么是 Nacos。本文主要简单聊聊Nacos作为服务注册和发现的功能,使用的服务端版本是1.1.4,目前最新版是2.xx。下载启动之后,如果是本地启动的,浏览器输入:http://localhost:8848/nacos,就来到了登录界面,默认的用户名和密码都是nacos,登录之后:可以看到,左侧菜单栏,包括三大模块:(1)配置管理(2)服务管理(3)集群管理本文主...

2021-09-15 00:12:28 410

原创 RabbitMQ:动态增减监听队列

rabbitmq可以动态的增减监听队列,目前我想到的使用场景是: 当有消息积压,或者预计不久的将来的某一段时间内,会有大量的消息需要消费时,可以增加监听队列,当恢复平常时候就减少监听队列。先看消费者工程的配置:@Configurationpublic class MessageListenerConfig { @Autowired private CachingConnectionFactory connectionFactory; @Autowired...

2021-09-11 18:15:11 2659

原创 RabbitMQ:死信队列

先看下相关概念:(1)死信:无法被消费的消息(2)死信交换机DLX:接收 无法被消费的消息 的交换机(3)死信队列:跟死信交换机绑定的队列消息变成死信有以下几种情况:消息TTL(存活时间)过期 队列达到最大长度 消息被拒绝(basic.reject / basic.nack),并且requeue = false(没有重新入队)先看交换机和队列的相关配置:@Configurationpublic class DeadLetterConfig { // 正常的交换

2021-09-11 17:48:14 114

原创 RabbitMQ:与SpringBoot整合

本文主要聊SpringBoot整合RabbitMQ,主要分为生产者和消费者两个工程,目录结构如下:先简单说一下RabbitMQ的一些核心概念:1.虚拟主机vhost:vhost是物理隔离的,你可以将vhost看作是一个个小型的RabbitMQ2.交换机exchange:生产者发送的消息不是直接到达队列的,而是交换机,然后交换机再根据路由key,路由到指定的队列,可以理解为一个分发消息的角色3.队列:存放消息的地方,消费者拿到的消息就是通过队列,可以理解为存放消息的容器4.bi.

2021-09-11 11:07:26 315 2

原创 Activiti之多实例任务

所谓多实例任务,就是一个任务,需要多个人协作完成,大致可以分为两种:(1)并行多实例:完成任务没有先后顺序的要求,并行执行(2)串行多实例:完成任务有先后顺序,也就是说,必须等待前一个人完成了任务,下一个人的 任务才开始在流程图中也可以体现出并行多实例与串行多实例的区别,注意看领导审批节点,多了3条线,如果3条线是竖直的,那就是并行多实例,如下所示:如果3条线是水平的,那就是串行多实例,如下所示:bpmn文件的流程图,本质就是一个xml文件,普通的用户任务...

2021-08-11 22:45:44 6667 3

原创 Activiti之流程跳转

流程的流转可以通过连线直观的展示出来,类似这样:但是如果连线比较多的时候,就是显得比较乱,对于一些退回的连线,也可以在代码中实现,不需要连线,看起来会简洁一点,但是流程的流转并不直观,就看如何取舍了。以下面的流程图为例,看下如何用代码实现流程节点的跳转,或者可以看作是退回操作:假设现在流程流转到辅导员审核这个环节,如何退回学生请假环节呢?主要是通过一个跳转命令来实现的,代码如下:public class JumpCmd implements Command<Void&..

2021-08-11 00:02:32 1762

原创 Activiti之高亮显示已流转的节点和线

实现高亮显示流程图节点和连线,大致效果如下:样子不怎么美观,但基本功能已经实现了。整体代码如下: /** * 根据流程实例Id,获取实时流程图片 * * @param processInstanceId * @param response * @return */ @GetMapping("/viewProcessImage") public void viewProcessImage(String pro.

2021-08-10 21:55:40 1773

原创 Activiti之HistoryService

HistoryService主要是查询历史数据。示例代码地址:https://github.com/qiuxinfa/activiti-study。下面以查询历史任务为例,看看HistoryService的作用:1.我发起的流程List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery() .st.

2021-08-10 00:00:00 1208

原创 Activiti之RuntimeService、TaskService

上篇文章聊了Activiti之RepositoryService,现在聊一下RuntimeService和TaskService。示例代码地址:https://github.com/qiuxinfa/activiti-study。先看下RuntimeService,它的主要作用是启动流程// 通过流程key启动流程ProcessInstance instance = runtimeService.startProcessInstanceByKey(PROCESS_KEY);启动流程的重载..

2021-08-09 23:47:06 1788

原创 Activiti之RepositoryService

之前写过一篇springBoot整合activiti的文章:springBoot整合activiti6入门demo。接下来主要写一些RepositoryService在工作流中的主要作用与操作。RepositoryService主要用于流程部署、

2021-08-09 22:16:22 2782

原创 Activiti工作流总体概述

之前写过一篇springBoot整合activiti的文章:springBoot整合activiti6入门demo。接下来写的内容也是基于activiti6进行的。虽然官网上已经出了activiti7,但是参考资料比较少,所以打算先从activiti6开始学,后面再学版本6和7的不同点即可。下面是activiti的流程引擎和服务之间的关系:上图来自于官网,activiti的核心就是流程引擎和7大服务:1.通过配置文件构建流程引擎2.通过流程引擎对象,可以得到7大服务对象...

2021-08-09 20:51:31 266

原创 线程池(二)浅析ThreadPoolExecutor

上一篇文章,聊了一下线程池的总体情况,今天主要聊聊线程池的核心类:ThreadPoolExecutor,接着上篇文章,先分析其重要的属性: // 阻塞队列,用来存放提交的任务 private final BlockingQueue<Runnable> workQueue; // 可重入锁 private final ReentrantLock mainLock = new ReentrantLock(); // worker集合,一个worker包装了

2021-04-21 00:32:58 434

原创 线程池总体概述

线程池主要是为了线程的复用,减少线程频繁创建和销毁的开销。ThreadPoolExecutor便是“线程池”,其继承结构如下:顶层接口Executor,只定义了一个执行任务的方法:void execute(Runnable command);ExecutorService则对Executor进行了拓展,增加了shutdown,submit等方法:而AbstractExecutorService则是对ExecutorService进行了默认实现,主要还是看ThreadPoolExec

2021-04-20 00:19:14 113

原创 多线程系列学习:AQS(二)释放锁

前面一篇文章写了如何获取锁:多线程系列学习:AQS(一)获取锁,下面以unlock()方法为入口,看看AQS如何释放锁: public void unlock() { sync.release(1); }接着看release()方法: public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if

2021-04-15 23:30:27 222

原创 多线程系列学习:AQS(一)获取锁

AQS是AbstractQueuedSynchronizer的简称,juc包下锁的实现,基本上需要借助于AQS的功能,如下图所示:通过继承结构,可以看到,常用的可重入锁ReentrantLock,以及同步辅助工具类CountDownLatch、Semaphore,都用到了AQS。首先要明白:锁分为独占锁和共享锁,独占锁又分为公平锁和非公平锁。独占锁:所谓独占锁,就是某一时刻,该锁只能被一个线程占有的 共享锁:共享锁则是某一时刻,该锁可以被多个线程同时占有 公平锁:获取锁的顺序,和请求锁

2021-04-14 23:51:29 593

原创 MySQL索引的几点疑问

索引,是一种数据结构,主要是为了加快数据查询。在InnoDb中,默认使用的是B+Tree。在看一些文章时,发现它们都是出奇的一致认为:MySQL每次查询只使用一个索引 含有null值的列,不会使用索引下面通过例子验证,这种说法是否正确,如何错误,请大佬指出。数据准备创建表sys_usercreate table sys_user(id bigint auto_increment primary key,username varchar(20),age int,email

2021-03-31 15:51:27 77

原创 多线程系列学习:LockSupport唤醒指定的线程

LockSupport是线程操作的工具类,其方法都是静态方法,主要是park和unpark方法,实现阻塞和唤醒,先看下方法定义及说明: /** * Disables the current thread for thread scheduling purposes unless the * permit is available. * * <p>If the permit is available then it is consumed and

2021-03-23 00:26:54 317

原创 多线程系列学习:CountDownLatch、CyclicBarrier和Semaphore

之所以把这3个类放在一起,因为它们都是线程协作的辅助类。CountDownLatch,可以实现某一些线程,等待其他线程执行完之后,才可以执行 CyclicBarrier,实现了多个线程间的相互等待,直到大家等待的条件满足了,就可以一起执行了 Semaphore,是信号量,可以控制并发的线程数一、CountDownLatchCountDownLatch,更多的是用于等待前面的线程执行完了,后面的才可以执行,测试如下:public class CountDownLatchTest {

2021-03-23 00:14:19 163

原创 多线程系列学习:ABA问题

ABA问题,描述的是一个变量v,它的值经历A -> B ->A的变化,导致看起来好像没有变一样,其实,第二次出现的A已经不是第一次出现的A了,是被修改过的。下面复现ABA问题,并解决测试代码:public class ABATest { public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(2); AtomicInteger num

2021-03-22 23:47:41 1004

原创 多线程系列学习:AtomicInteger

在 java.util.concurrent.atomic 包下,有很多原子类,这种原子类的出现,解决了多线程环境下,诸如:i++等非原子操作的线程安全问题,包括的类如下:下面以AtomicInteger为例了解其使用及基本原理,先看下类定义及相关说明:根据注释说明,可以大概知道,AtomicInteger主要用来解决类似于自动递增的计数问题,它并不能替代Integer类。注意到,它有一个成员属性 value,并且是用volatile修饰的,从而保证了可见性。首先来看下,不使..

2021-03-21 12:13:15 711

原创 多线程系列学习:线程终止

今天聊一下线程的终止,目前知道的是两种方式:通过标志变量终止 通过中断标记终止一、通过标志变量终止通过标志变量,可以终止正在运行的线程,测试代码如下: // 通过标记变量,退出正在运行的线程 static class Demo extends Thread{ // volatile修饰,保证每次读取的都是变量的最新值 private volatile boolean runFlag = true; @Overrid..

2021-03-21 00:53:34 75

原创 多线程系列学习:线程调度

今天主要学习一下线程调度,包括:休眠、加入和让步。一、线程的休眠先来看下,线程休眠的方法定义: /** * Causes the currently executing thread to sleep (temporarily cease * execution) for the specified number of milliseconds, subject to * the precision and accuracy of system time

2021-03-21 00:37:57 203

原创 多线程系列学习:线程间通信

为什么需要线程间的通信?其实,换一种问法会更容易理解其出现的意义:为什么需要线程间的协作?提到协作,意味着单个线程是无法完成任务的,就比如我们工作中,个人的能力是有限的,大多数情况下都需要团结协作,然后最终完成了任务。那么,在这里,你可以把团队的每一个人看作一个线程来理解,就比较容易理解线程间协作的必要性了。那么,线程间实现的通信方式哪有些呢?目前,我知道的有2种:通过对象的wait()、notify()和notifyAll()来实现 通过java.util.concurrent.locks.Co

2021-03-17 21:54:44 73

原创 多线程系列学习:synchronized关键字的理解与使用

关于synchronized关键字的学习,主要包括以下几个方面:为什么要使用synchronized关键字? 如何使用synchronized关键字?为什么要使用synchronized对同一个对象的属性进行并发访问,如果处理不当,就很容易出现读取到另一个线程修改后的数据,造成程序运行出错。看文字可能不太好理解,请看示例代码:public class SyncTest { public static void main(String[] args) { N.

2021-03-17 00:38:47 105

原创 多线程系列学习:线程创建的几种方式

线程的创建,个人理解,本质上还是创建了Thread对象,因为Callable接口最终会被包装成Runnable接口的对象,而Runnable接口对象只是Thread中的target而已。而启动一个线程,最终也是调用线程对象Thread的start()方法。创建线程的几种常见方式:继承Thread类 实现Runnable接口 实现Callable接口 通过线程池创建(这种方式后面再介绍)一、继承Thread类继承Thread类,重写run()方法class MyThread e.

2021-03-16 20:38:04 92

原创 多线程系列学习:线程状态

关于Java线程的状态,一般分为5状态和6状态,不管是5状态划分,还是6状态划分,都是为了更好的理解线程的运行流程,当然了,Thread源码里面确实是划分为6状态的。5状态划分1.新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread t = new Thread()。2.就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,调用其start()方法启动该线程,线程就进入到就绪状态,此时的线程,万事俱备,只欠CPU。3.运...

2021-03-16 00:16:35 49

原创 多线程系列学习:为什么需要多线程?

在学习多线程之前,有必要了解为什么会出现多线程,文章主要内容:有了进程,为什么还需要线程? 多线程的使用场景有了进程,为什么还需要线程?首先,要明白一点,进程包含线程,一个进程至少有一个线程,但线程依赖于进程而存在。先看下进程和线程的基本概念:进程:是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发,例如我们的QQ、微信,在没有运行时,就只是程序,但是当这些程序被调入内存执行,就会创建对应的进程被cpu调度 线程:是进程的子任务,是CPU调度的基本..

2021-03-15 21:35:06 438

空空如也

空空如也

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

TA关注的人

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