自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

路的尽头在哪

大型线上菜鸡互啄、商业互吹论坛现场

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

原创 JUC锁:核心类 AQS 原理图文详解

前言好久没打开CSDN 了(随便找点存货发一发)2021.12.02 说实话,AQS 确实没了解过 ,阅读 Java 版本为 1.8.0.25。源码:AbstractQueuedSynchronizer.java - Gitee.comReentrantLock.java - Gitee.comCountDownLatch.java - Gitee.com中文文档:Java 8 中文版 - 在线API中文手册 - 码工具 (matools.com)AbstractQueuedS

2022-04-01 22:03:01 947

原创 【踩坑记录】jenkins 远程部署 publish over ssh

jar 包运行失败其他命令都能好好执行,单单 nohup java -jar & 运行无效。网上找了一圈,解决办法包括:执行命令前需要先 source /etc/profile 命令,同步环境java 、 jar包 和 日志文位置都用全路径。shell 命令加 #!/bin/bash反正都用上shell 命令执行超时现象是这样的:stack overflow 上的回答:然后就可以正常使用了。参考文章windows - Exception when publish

2021-10-20 02:30:00 547

原创 maven 分环境打包

1. 总体说明最近改 jenkins 部署,需要分 本地、测试、生产 三个环境。为了使用同一套 shell 脚本,得分环境继续 maven 打包。不同环境使用不同配置文件。2. Pom 配置在 pom.xml 中添加 profile 配置,按环境文件夹路径划分。<activeByDefault>true</activeByDefault> 将 dev 设置为默认环境,所以在本地就默认为开发环境。<profiles> <profile>

2021-10-19 02:15:00 1592

原创 jenkins 通过 SSH 远程部署

1. Jenkins 安装可以参考我以前的:Jenkins + Gitee 自动化构建实例jenkins dockerfile maven 自动打包、容器构建、发布2. 安装插件在 jenkins 插件管理中安装插件Publish Over SSH3. SSH 服务器拉到最底下,添加 SSH Server。可以在针对这个服务进行连接测试:4. 任务配置主要步骤:先 SSH 连接,删除原进程和文件maven 打包SSH 连接,发送文件执行 shell 命令

2021-10-16 23:27:15 6392

原创 重复读取 request 流数据

前言2021.10.15起因是在项目中,我自己习惯都是在拦截器中拿参数、打日志。但是一个接口对接方比较独特,参数都写在 request流 里面也是第一次遇到。但是问题是,request 流中的数据,只能被读取一次,现在日志打印读取了,后面 controller 里就没有了。问题复现接口接收数据对象:@Datapublic class QueryDTO { public String id; public Integer type;}接口方法:@RestCont

2021-10-16 18:22:28 1415

原创 Quartz - 任务调度框架整合使用

前言项目中遇到一个,需要 客户自定任务启动时间 的需求。原来一直都是在项目里硬编码一些定时器,所以没有学习过。很多开源的项目管理框架都已经做了 Quartz 的集成。我们居然连这么常用得东西居然没有做成模块化,实在是不应该。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:持久性作业 - 就是保持调度定时的状态;作业管

2021-10-07 15:07:09 3249 1

原创 简单实现修改内容前后变动日志(注解+反射)

需求说明实现目标:把修改的具体字段名以及修改前后内容做日志记录实现效果:集装箱数量:【1】变更为【3】;集装箱型:【40 Dry High】变更为【40 Dry Standard】;起运时间:【2021-09-16】变更为【2021-09-30】;自动下单限额:【1200.00】变更为【1500.00】;实现思路为了做到尽量通用,先假设实体类都实现了序列化 Serializable 。在实体中添加自定义注解反射,获取到字段,扫描存在注解的字段将修改前后的字段值做对比存在修

2021-09-18 23:14:07 1066

原创 docker compose 基础使用方法

前言Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排讲人话就是, 一个 yml 文件定义和运行多个 docker 容器,同时指定启动顺序compose 安装可以去最简单的方法,直接敲两个命令:curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/dock

2021-09-17 23:58:38 237

原创 RabbitMQ 延迟队列、惰性队列 简介

这篇比较简单,基础内容前两篇已经说过了,可以看以前的:Springboot RabbitMQ 基础使用、消息发送确认、签收springboot、rabbitMQ 死信队列延迟队列使用场景:订单十分钟内未支付则自动取消:下单发送消息 TTL 十分钟,自动转入死信队列 DLX(消费取消订单)用户发起退款,如果三天内没有得到处理则通知相关运营人员:发送退款请求消息 TTL 3天,还没消费转入死信队列(人工接入)类似场景还蛮多的。基于死信实现基础的延迟队列就不写了,和死信队列一样。实现原理

2021-09-15 22:24:14 558

原创 springboot、rabbitMQ 死信队列

前言死信:无法被消费的消息,称为死信。如果死信一直留在队列中,会导致一直被消费,却从不消费成功。所以我们专门开辟了一个来存放死信的队列,叫死信队列(DLX,dead-letter-exchange)。死信的几种来源:消息 TTL 过期(time to live,存活时间,可以用在限时支付消息)队列达到最大长度(队列满了,无法路由到该队列)消息被拒绝( basic.reject / basic.nack ),并且 requeue = false环境准备配置准备 MQ 的队列和环境

2021-09-13 23:23:40 3169 2

原创 Springboot RabbitMQ 基础使用、消息发送确认、签收

概述rabbitMQ 会做一个系列,包括:安装、基础使用、高级队列、集群。使用环境: jdk 8 、springboot 2.4.10常见概念:AMQP:高级消息队列协议,这是一个消息应用的规范。Broker: 接收和分发消息的应用,RabbitMQ Server 就是 Message Broker。Channel:Channel 作为轻量级 Connection 极大减少了操作系统建立 TCP connection 的开销。Exchange:message 到达 broker 的第一站,根

2021-09-08 23:36:55 1453

原创 swagger 在线文档分组,分包形成文档

knife4j 是一个贼不错的swagger扩展工具,有一套很不错的UI。还带有离线文档下载,最让我喜欢的是每一行字段都直接动态对比说明。访问地址:http://localhost:8080/doc.html文档地址:knife4j (xiaominfo.com)依赖<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2<

2021-09-03 00:39:59 383

原创 jenkins dockerfile maven 自动打包、容器构建、发布

概述想着在公司弄一套自动部署测试流程,jenkins + gitee 自动 build 已经测试成功了。下一步就是 docker + maven + jenkins + git 打包发布了。dockerfiledockerfile 可以根据命令定制镜像,用来构建 docker 容器。语法注意:dockerfile 命令都必须用大写FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。MAINTAINER:维护者,国际惯

2021-08-30 21:20:45 2685

原创 Jenkins + Gitee 自动化构建实例

概述因为本次项目涉及接口调试过多,所以弄个持续集成(CI)测试环境。本次测试使用 Gitee + jenkins 。打包部分先用 npm 做个 build 测试。预备环境:JDK 、node、git先说一个坑,原本图省事,直接通过 docker 安装了 jenkinsci/blueocean 镜像来安装。刚开始确实美滋滋,后来到拉代码打包发现,在容器里还怎么打包测试。所以重新开始。jenkins 安装完整手册看:Jenkins 用户手册jenkins 下载目录选择自己需要的 war 包

2021-08-28 21:55:59 2593

原创 Docker Gitea Mysql 快速搭建企业代码服务器

概述搭建一个企业代码仓库,网上对比一圈,发现 gitea 比较受欢迎。选用 docker 作为 gitea 容器主服务器装 mysql ,团队5人以下用 SQLite 3 也够用 。 mysql 安装MySQL 安装wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.r

2021-08-27 23:29:02 474

原创 SpringBoot - activeMQ 消息队列

前言环境: jdk 8、springboot 2.4.9、activemq 5.15.15JMS术语:Provider/MessageProvider:生产者Consumer/MessageConsumer:消费者PTP:Point To Point,点对点通信消息模型Pub/Sub:Publish/Subscribe,发布订阅消息模型Queue:队列,目标类型之一,和PTP结合Topic:主题,目标类型之一,和Pub/Sub结合ConnectionFactory:连接工厂,JMS用

2021-08-17 22:34:35 318

原创 Mybatis-Plus 多数据源

前言环境: jdk 8、springboot 2.4.9、mybatis-plus 3.4.3.1、dynamic-datasource 3.3.2使用文档: dynamic-datasource · 看云 在分布式事务比较困难的情况下,做读写分离还是蛮好用的。1. 依赖配置加入依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId&

2021-08-17 22:32:53 559

原创 阿里云OSS上传图片、PDF设置链接预览

去年的OSS还是链接可预览,今年可能是阿里云OSS升级了,变成直接下载了。所以重新改回预览,其他全部不变,上传添加 contentType 配置//文件名String originalFilename = file.getOriginalFilename();//拿到.后缀String type = originalFilename.substring(originalFilename.lastIndexOf("."));ObjectMetadata metadata = new Object

2021-08-12 20:59:31 5636

原创 水一篇 CountDownLatch

概述CountDownLatch 是 JUC 中一个比较常用的工具类,使用也很简单。。。而且大佬们的博客确实写得很好。。。尽量少些废话,尽快结束。因为源码确实不长,带上注解也才200行,就直接贴在最后了。总的就是:CountDownLatch 是 JDK 提供的一个同步工具,它可以让一个或多个线程等待,一直等到其他线程中执行完成一组操作。常用的方法有 countDown 方法和 await 方法,CountDownLatch 在初始化时,需要指定用给定一个整数作为计数器。当调用 countD

2021-06-19 15:38:28 337

原创 CAS、Unsafe、Atomic原子类,一波带走

原子类概述JUC 中多数类是通过 volatile 和 CAS 来实现的,CAS本质上提供的是一种无锁方案,而 Synchronized 和 Lock 是互斥锁方案。java 原子类本质上使用的是 CAS,而 CAS 底层是通过 Unsafe 类实现的。线程安全的实现方法包含:互斥同步:synchronized 和 ReentrantLock非阻塞同步:CAS 、 原子类AtomicXXXX无同步方案::栈封闭 、Thread Local 、可重入代码本篇主要讲述原子类,以及它所依赖的

2021-06-06 21:20:45 190 2

原创 volatile 关键字总结,原理+示例 - Java 轻量级同步

本文概述volatile 关键字对增删改查程序员应该是比较陌生的。(反正我前几年是一次没用过)暴露了我菜鸡的水准。。。volatile 是 JVM 提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步 synchronized,通常称为重量级锁,不过随着JVM优化,现在也不是特别重。轻量级 volatile ,因为它不会引起线程上下文的切换和调度。但是 volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。volatile 的特性

2021-06-05 22:55:25 597

原创 关键字 synchronized 简单介绍

本文概述讲解下 Java 中和并发相关的个关键字:synchronized 、volatile 。因为关键字已经是除了 JVM 外最底层的应用了。。。所以除了分析在 JVM 中关键字的作用,其他的只能通过代码举例说明,这样就会显得比较得…枯燥。synchronizedsynchronized 关键字是为了解决共享资源竞争的问题,共享资源一般是以对象形式存在的内存片段。所以,只有共享资源的读写访问才需要同步化,如果不是共享资源那么根本就没有必要同步。对 synchronized 的基础使用其

2021-05-30 22:37:42 269

原创 SpringCloud 版本选择及 SpringBoot 对应关系

废话开头当前时间 20210320,众所周知,SpringBoot 与 SpringCloud 需要版本对应,否则将会出现很多异常,一般都是找不到对应依赖。SpringBoot 与 SpringCloud 是分别定义版本号的,可以在以下两个网站查到还在维护的最新版本。https://spring.io/projects/spring-boot#learnhttps://spring.io/projects/spring-cloud#learn如果已经放弃维护了,尽量不要使用,老版本时间过长也

2021-03-21 22:31:18 861

原创 JVM 性能监控命令及工具

本文概述本文就不详细介绍了,也就列举一下常用的命令和工具。小水一篇。。。。。故障处理命令jps:虚拟机进程状况工具jps(JVM Process Tool)虚拟机进程状况工具,它的功能和 Unix 的 ps 命令类似:可以列出正在运行的虛拟机进程,并显示虚拟机执行主类名称(Main Class,main() 函数所在的类),以及这些进程的本地虛拟机唯一ID ( LVMID, Local Virtual Machine Identifier) 。而对本地虚拟机而言,LVMID 和进程 ID是

2020-11-12 22:59:28 132

原创 垃圾收集器,GC介绍 - JVM 基础最终弹

垃圾回收器的性能指标垃圾回收的基本性能指标如下:吞吐量:运行用户代码的时间占总运行时间的比例。总运行时间 = 程序的运行时间 + 内存回收的时间暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。内存占用:Java 堆区所占的内存大小。垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。收集频率:相对于应用程序的执行,收集操作发生的频率。快速:一个对象从诞生到被回收所经历的时间。其中比较重要的三个指标是 吞吐量 、 暂停时间 和 内存占用 ,而且 吞吐量 和 暂停时间 是

2020-11-09 21:25:33 201

原创 Java 垃圾回收算法和概念 - JVM秃头第五弹

垃圾回收概述终于学到垃圾回收(Garbage Collection)了。。。把这部分干掉,后面的就是调优了。。。总算要把 JVM 部分搞完了。。好嘞,开始开始,gogogo首先,第一个问题是:JVM 中,什么是垃圾?垃圾是指在 运行程序中没有任何指针指向的对象 ,这些对象需要被回收。然后,第二个问题是:JVM 为什么需要 GC ?这个问题的解答,可以很复杂,也可以很简单。在运行时数据区篇中,已经初步对 GC 的作用进行了介绍。不论年轻代、老年代还是现在基于直接内存的元空间

2020-11-07 00:23:10 109

原创 JVM 执行引擎简要介绍 - 编译器、解释器

对 JVM 而言,执行引擎就是执行代码的一个软件,所以可以不受硬件环境的约束,执行不被操作系统识别的指令集格式。JVM 的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被 JVM 所识别的字节码指令、符号表,以及其他辅助信息。

2020-10-24 00:08:21 446 1

原创 JVM 运行时数据区 - 多图预警、万字内存模型解读

堆和栈算是Java内存模型中最重要的两部分,栈是运行时单位(解决程序执行问题),堆是存储单位(数据存储问题)。PC 寄存器是用来存储指向下一条指令的地址,也就是即将要执行的指令代码。虚拟机栈和本地方法栈分别管理 Java 方法和本地方法。 虚拟机每调用一个方法将会在栈中压入一个对应方法的栈帧 ,内部包含局部变量表、操作数栈、动态链接和方法返回地址。-虚拟机栈存在两种常见异常 StackOverflowError 和 OutOfMemoryError 。

2020-10-22 13:47:08 160

原创 类加载机制 - Java虚拟机第二步

类加载机制概述本文所有代码和介绍,基于 JDK 1.8.0.25还是放上这个最眼熟的图,这个针对 hotspot 虚拟机所绘制的简图:本文要介绍的就是这个图中的 类加载器 ,主要内容包括类加载器的工作步骤,内部组成等。对于类加载器的内部结构,先看下面这个图:类加载器会把 .class 字节码加载到运行时数据区的方法区。除了类的信息外,方法区还存放着运行时常量池信息(版本、字段、方法、接口啥的)。class 文件生命周期从上面的图中可以看出:.class 文件在类加载器的执行过程

2020-09-25 14:52:24 167

原创 JVM 以及字节码文件简介 - Java虚拟机第一步

JVM 介绍众所周知,Java 是运行在 Java虚拟机上的,.java 文件只有编译成为 .class 文件才能在虚拟机上运行。那么这个虚拟机又是什么?在 CPU 层面,计算机是由一个个指令汇聚而成的,虚拟机就是将识别字节码文件,并将其转换为指令运行。Oracle 发布了一般又一般的 Java 和 JVM 规范,虚拟机就是遵循这个规范运行。规范的话全英文的,我是看不懂,有兴趣自己取:https://docs.oracle.com/javase/specs/index.html既然 JVM

2020-09-22 19:23:12 303

原创 StringBuffer 和 StringBuilder 的区别 - 源码解析、内容扩展

概述阅读 Java 版本为 1.8.0.25。先看 StringBuffer 和 StringBuilder 的继承关系图。StringBuffer 和 StringBuilder 都继承了 AbstractStringBuilder ,都是通过 char[] 数组实现,因为未加 final 修饰符,所以可修改。两者简单来说:StringBuffer :是一个线程安全类,方法使用 synchronized 修饰加锁,执行速度稍微慢点。StringBuilder :线程不安全,执行速度快。单线

2020-09-06 22:06:52 166

原创 WeakHashMap 源码简读 - 专注缓存特殊 Map

前言阅读 Java 版本为 1.8.0.25。WeakHashMap 是一个很特殊的集合类。在不对 WeakHashMap 进行任何操作的情况下,它的键值对也会被 GC 回收,因为它的 key 是弱引用。这种奇葩 Map 有啥用呢,其实在缓存情况下,还真有点用。源码位置先放上,因为这个类和 HashMap 其实类似,所有我觉得没必要特别仔细,知道特性就可以了:WeakHashMap 源码:https://github.com/qianwei4712/JDK1.8.0.25-read/blo

2020-09-03 22:26:14 163

原创 弱引用是什么,和其他引用有啥区别?

Java 存在四种引用,分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。

2020-08-26 20:55:03 7620

原创 LRU缓存机制的最佳实现,LinkedHashMap 源码解析

在 LinkedHashMap 环境下,当链表达到某个指定长度,put 方法添加新节点时,移除最长没有访问的元素。具体的实现可以是,顺序添加组建链表,当访问某一个元素节点,将该节点移动至末尾,达到长度需要移除时,移除第一个元素节点

2020-08-20 08:41:39 294

原创 Java 线程中断机制,interrupt 源码解析 - Thread 中断系列全搞定

一个线程执行完毕之后会自动结束,如果在运行过程中发生异常也会提前结束。void interrupt() ,中断线程。static boolean interrupted(),测试当前线程是否已被中断。通过此方法可以清除线程的中断状态。boolean isInterrupted()`,测试线程是否已经中断,线程的中断状态不受该方法的影响。协作式和抢占式线程调度的解释,线程中断属于协作式中断。

2020-08-02 19:42:05 498

原创 Java 线程间的通信、协作方式 - join 机制,wait-notify 机制

Java Thread 线程之间的通信和协作方式,介绍 Object 类的 wait,notify 系列方法,Thread 的 join 方法机制。

2020-08-01 19:02:28 240

原创 SpringBoot 配置SSL证书,同时支持 http 与 https

前言废话就不多讲了,直接开始。我用的是阿里云免费版 DV SSL 证书,流程中需要做域名验证,最后下载证书。阿里云,云盾免费证书申请,验证,下载证书(Tomcat)。配置文件支持 HTTPS配置类支持 HTTP证书获取阿里云证书申网上多的是,而且貌似也没有啥困难。申请成功后下载证书:SpringBoot 使用的是内置 Tomcat , 所以证书类型需要选择 Tomcat 。下载后会有一个 pfx 文件 和一个密钥文件。如果前置了 Nginx ,也需要下载 Nginx 证书且自

2020-07-27 14:40:33 605

原创 Java Thread线程基础机制,源码解读 - 优先级、守护这些玩意儿

Java 线程基础机制,priority 优先级、daemon 守护线程、sleep() 线程休眠、yield() 状态声明、其他 native 方法。

2020-07-25 19:13:08 177

原创 Java 线程的几种状态及状态间转换

Java 和操作系统关于线程的几种状态,以及状态间的相互转换

2020-07-25 10:53:26 295

原创 ECharts 绘制地图飞线

以 echarts 官方示例为基础起点,绘制地图飞线

2020-07-18 21:47:42 6656 2

分布式、微服务面试专题资料

Dubbo、SpringCloud、zookeeper、mq、spring boot、kafka资料汇总

2020-05-01

Mysql 专项面试题及答案.rar

mysql 面试资料,包含mysql 性能、sql优化、mysql 缓存、基础操作、索引等常见面试问题以及答案

2020-05-01

最新整理Java面试题

2020年整理多家公司常见面试题,共127页5大类,包含Jvm优化、微服务、并发、Spring、分布式

2020-04-30

空空如也

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

TA关注的人

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