slf4j

线程八锁

微笑、不失礼 提交于 2020-08-17 08:45:30
所谓的“线程八锁” 其实就是考察 synchronized 锁住的是哪个对象 情况1:12 或 21 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { log.debug("1"); } public synchronized void b() { log.debug("2"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); }).start(); new Thread(()->{ n1.b(); }).start(); } 情况2:1s后12,或 2 1s后 1 @Slf4j(topic = "c.Number") class Number{ public synchronized void a() { sleep(1); log.debug("1"); } public synchronized void b() { log.debug("2"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()->{ n1.a(); })

SpringBoot 基础入门

自古美人都是妖i 提交于 2020-08-17 05:04:16
1. 用IDEA自动创建SpringBoot项目 2. 理解自动生成的文件的作用以及含义 3. 在Java中增加一个controller层,编写一个HelloWorld接口 在网页打印出Hello World @RestController public class HelloController { @RequestMapping("/hello") public String hello(String name){ return "hello world " + name; } } SpringBoot基础概念: 一、Spring Boot 、 Spring MVC 、Spring对比 二、Spring Boot 自动配置 三、什么是Spring Boot Starter? Spring Boot Starter是一组被依赖第三方类库的集合。 如果你要开发一个web应用程序,就通过包管理工具(如maven)引入spring-boot-starter-web就可以了,而不用分别引入下面这么多依赖类库,spring-boot-starter-web一次性帮你引入下面的这些常用类库。 Spring — spring 核心, beans, context上下文, AOP面向切面 Web MVC — Spring MVC Jackson — JSON数据的序列化与反序列化

SpringBoot2 整合MinIO中间件,实现文件便捷管理

北慕城南 提交于 2020-08-17 03:39:31
本文源码: GitHub·点这里 || GitEE·点这里 一、MinIO简介 1、基础描述 MinIO是一个开源的对象存储服务。适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。 2、存储机制 MinIO使用按对象的嵌入式擦除编码保护数据,该编码以汇编代码编写,可提供最高的性能。MinIO使用Reed-Solomon代码将对象划分为n/2个数据和n / 2个奇偶校验块-尽管可以将它们配置为任何所需的冗余级别。 这意味着在12个驱动器设置中,将一个对象分片为6个数据和6个奇偶校验块。即使丢失了多达5个((n/2)–1)个驱动器(无论是奇偶校验还是数据),仍然可以从其余驱动器可靠地重建数据。MinIO的实现可确保即使丢失或无法使用多个设备,也可以读取对象或写入新对象。最后,MinIO的擦除代码位于对象级别,并且可以一次修复一个对象。 二、MinIO环境搭建 1、安装包下载 https://dl.min.io/server/minio/release/linux-amd64/minio 建议使用某雷下载,速度会快点,下载包上传到 /opt/minioconfig/run 目录下。

SLF4J: Class path contains multiple SLF4J bindings.

梦想的初衷 提交于 2020-08-17 03:00:02
错误信息: SLF4J Warning: Class Path Contains Multiple SLF4J Bindings 错误原因: 我个人博客系统一个爬虫组件用到webmagic,而webmagic与lomback中的slf有冲突。 解决办法(webmagic排除相关依赖即可): <!-- webmagic--> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>${webmagic.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> 参考解决问题地址: SLF4J Warning: Class Path Contains Multiple SLF4J Bindings 来源: oschina 链接: https://my

Springboot集成flowable modeler web流程设计器

孤人 提交于 2020-08-16 23:48:14
之前画流程图都是用tomcat启动flowable modeler,但是这样启动就不能在分配任务用户/用户组的时候查询自己系统里的数据。所以现在需要把flowable modeler集成到项目里来。 之前自己也搜索了很多文章,都感觉不是很清晰,可能也是因为我刚接触不久。现在自己集成好了之后,记录一下自己学习的结果。 首先需要创建一个springboot应用,pom文件中引入相关jar包: <properties> <java.version>1.8</java.version> <flowable.version>6.4.1</flowable.version> <lombok.version>1.18.0</lombok.version> <fastjson.version>1.2.9</fastjson.version> </properties> < dependencyManagement > < dependencies > < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-dependencies </ artifactId > < type > pom </ type > < scope > import </ scope > </

不用找了,基于 Redis 的分布式锁实战来了!

十年热恋 提交于 2020-08-16 10:22:52
作者:菜蚜 my.oschina.net/wnjustdoit/blog/1606215 前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁, 基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了。乐观锁和悲观锁最根本的区别在于线程之间是否相互阻塞。 那么,本文主要来讨论基于redis的分布式锁算法问题。 从2.6.12版本开始,redis为SET命令增加了一系列选项(set [key] NX/XX EX/PX [expiration]): EX seconds – 设置键key的过期时间,单位时秒 PX milliseconds – 设置键key的过期时间,单位时毫秒 NX – 只有键key不存在的时候才会设置key的值 XX – 只有键key存在的时候才会设置key的值 原文地址: https://redis.io/commands/set 中文地址: http://redis.cn/commands/set.html 注意: 由于SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。 这里简单提一下,在旧版本的redis中(指2.6.12版本之前),使用redis实现分布式锁一般需要setNX、expire、getSet

Springboot之Actuator

こ雲淡風輕ζ 提交于 2020-08-16 05:06:11
澳大利亚国立大学(澳大利亚)校训:“重要的是弄清事物的本质。” 昨天因为加班耽搁了写文章,在此反思5分钟。。。。 今天要讲的是另一个Springboot核心机制,Spring自带的监控神器Actuator,集成非常简单,使用起来更是简单到爽歪歪,就是简单地rest接口调用查看,在要求不高的监控环境可以使用,如果需要可视化的监控推荐: Grafana 结合 prometheus 。 一 配置Actuator 1 引入Actuator起步依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.1.3.RELEASE</version> <optional>true</optional> </dependency> 2 在application.properties中配置相关参数 #设置监控访问的应用根路径,默认是/actuator management.endpoints.web.base-path=/monitor #暴露监控访问接口,默认是/health和/info management.endpoints.web.exposure.include=* #显式屏蔽监控访问接口

gateway欺人太甚!

戏子无情 提交于 2020-08-15 18:09:09
需求: 通过gateway来转义请求参数中的html标签的“<”、“>”等,来防止xss攻击 版本: springbootVersion:2.1.6RELASE springCloudGatewayVersion:2.1.2RELASE 因为gateway版本不同所以获取请求参数的方式也不同,这个版本的gateway是通过webflux来处理参数的,什么是 webflux 请点击查看,这里就不过多赘述了 对于gateway的过滤器有很多种实现方式,根据具体的业务需求来选定最便捷、最简单的处理方式 这里是我自定义gatewayfilter过滤器代码实现: 此代码只处理了两种contentType是:application/json和application/json;charset=UTF-8 对于contentType是multipart/form-data没有处理这是缺陷,如有好的处理方式请留言,大家一起学习一起进步 import lombok.extern.slf4j.Slf4j; import org.owasp.esapi.ESAPI; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter

字符串数据脱敏以及与日志框架logback的集成(日志脱敏)

…衆ロ難τιáo~ 提交于 2020-08-15 16:51:44
字符串数据脱敏框架 可选择唯品会的工具: https://github.com/vipshop/vjtools/blob/master/vjkit/docs/data_masking.md 也可以自定义,用正则或者其他方式(如:commons-lang3#StringUtils) 与logback集成 分析: 由于logback的api和语法多种多样( http://logback.qos.ch/manual/architecture.html , 如下),导致在logback级别处理数据脱敏不太方便,为了保持日志框架原本自由的使用方式,所以在调用前处理日志脱敏,且注意加上必要的日志打印判断提高性能。 logback基本语法: String message = "This is a message."; logger.info(message); logger.info("This is a message"); String param = "some variable"; logger.info("This is a message. {}", param); String param1 = "some variable1"; String param2 = "some variable2"; logger.info("This is a message. {} {}",

Java实现大批量数据导入导出(100W以上) -(一)导入

一曲冷凌霜 提交于 2020-08-15 15:15:30
最近业务方有一个需求,需要一次导入超过100万数据到系统数据库。可能大家首先会想,这么大的数据,干嘛通过程序去实现导入,为什么不直接通过SQL导入到数据库。 大数据量报表导出请参考: Java实现大批量数据导入导出(100W以上) -(二)导出 一、为什么一定要在代码实现 说说为什么不能通过SQL直接导入到数据库,而是通过程序实现: 1. 首先,这个导入功能开始提供页面导入,只是开始业务方保证的一次只有<3W的数据导入; 2. 其次,业务方导入的内容需要做校验,比如门店号,商品号等是否系统存在,需要程序校验; 3. 最后,业务方导入的都是编码,数据库中还要存入对应名称,方便后期查询,SQL导入也是无法实现的。 基于以上上三点,就无法直接通过SQL语句导入数据库。那就只能老老实实的想办法通过程序实现。 二、程序实现有以下技术难点 1. 一次读取这么大的数据量,肯定会导致服务器内存溢出; 2. 调用接口保存一次传输数据量太大,网络传输压力会很大; 3. 最终通过SQL一次批量插入,对数据库压力也比较大,如果业务同时操作这个表数据,很容易造成死锁。 三、解决思路 根据列举的技术难点我的解决思路是: 1. 既然一次读取整个导入文件,那就先将文件流上传到服务器磁盘,然后分批从磁盘读取(支持多线程读取),这样就防止内存溢出; 2. 调用插入数据库接口也是根据分批读取的内容进行调用; 3.