PDFBox使用指南

1. 介绍

Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。使用该库可以开发创建,转换和操作PDF文档的Java程序。

2. 特性

  • 提取文本 - 使用PDFBox,您可以从PDF文件中提取Unicode文本。
  • 拆分和合并 - 使用PDFBox,您可以将单个PDF文件分成多个文件,并将它们作为单个文件合并。
  • 填写表单 - 使用PDFBox,您可以填写文档中的表单数据。
  • 打印 - 使用PDFBox,您可以使用标准Java打印API打印PDF文件。
  • 另存为图像 - 使用PDFBox,您可以将PDF保存为图像文件,如PNG或JPEG。
  • 创建PDF - 使用PDFBox,您可以通过创建Java程序创建新的PDF文件,还可以包括图像和字体。
  • 签名 - 使用PDFBox,您可以将数字签名添加到PDF文件。

3. 引入

1
2
3
4
5
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.17</version>
</dependency>

4. 应用示例

4.1 PDFBox指定位置添加文本

指定字体文件simsun.ttf支持添加中文文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PDDocument doc = null;
try {
File file = new File("C:\\origin.pdf");
doc = PDDocument.load(file);

String fontFilePath = "C:\\simsun.ttf";
PDType0Font font = PDType0Font.load(doc, new File(fontFilePath));

PDPage page = doc.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.PREPEND,
true);
contentStream.beginText();
contentStream.setFont(font, 10);
float offsetx = 40;
float offsety = 105;
contentStream.newLineAtOffset(offsetx, offsety);
contentStream.showText("hello, world");
contentStream.endText();
contentStream.close();

doc.save("C:\\result.pdf");

doc.close();
} catch (IOException e) {
// TODO handle exception
}

spring-retry

Spring Retry实现重试操作

dependency

1
2
3
4
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>

注解

在启动入口加入重试配置

1
@EnableRetry

使用

1
@Retryable(value = Exception.class, maxAttempts = 3,backoff = @Backoff(delay = 2000, multiplier = 1.5))

参考

  • @EnableRetry 能否重试
  • @Retryable 标注此注解的方法在发生异常时会进行重试
    • value:指定处理的异常类
    • include:指定处理的异常类和value一样,默认为空,当exclude也为空时,默认所有异常
    • exclude:指定异常不处理,默认空,当include也为空时,默认所有异常
    • maxAttempts:最大重试次数。默认3次
    • backoff: 重试等待策略。默认使用@Backoff注解
  • @Backoff 重试等待策略
    • 不设置参数时,默认使用FixedBackOffPolicy(指定等待时间),重试等待1000ms
    • 设置delay,使用FixedBackOffPolicy(指定等待时间),重试等待填写的时间
    • 设置delay和maxDealy时,重试等待在这两个值之间均态分布
    • 设置delay、maxDealy、multiplier,使用 ExponentialBackOffPolicy(指数级重试间隔的实现 ),multiplier即指定延迟倍数,比如delay=5000l,multiplier=2,则第一次重试为5秒,第二次为10秒,第三次为20秒……
  • @Recover 用于@Retryable重试失败后处理方法,此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。

redis

Redis是一个开源的使用 ANSI C语言编写,支持网络,可基于内存也可持久化的日志型,Key-Value数据库,并提供了多种语言的 API ,相比 Memcached 它支持存储的类型相对更多 (字符,哈希,集合,有序集合,列表等),同时Redis是线程安全的。

redis-cli

安装

命令

1
2
3
4
redis-cli -h redis.test.net -a TlJ8JsgzWHMOcbBMUEIw info memory
redis-cli -h redis.test.net -a TlJ8JsgzWHMOcbBMUEIw keys "*"
redis-cli -h redis.test.net -a TlJ8JsgzWHMOcbBMUEIw keys "KEY:KEYNAME*"
redis-cli -h redis.test.net -a TlJ8JsgzWHMOcbBMUEIw keys "KEY:KEYNAME*" | xargs redis-cli -h redis.test.net -a TlJ8JsgzWHMOcbBMUEIw del

Redis 客户端

连接池

客户端连接 Redis 使用的是 TCP协议,直连的方式每次需要建立 TCP连接,而连接池的方式是可以预先初始化好客户端连接,所以每次只需要从 连接池借用即可,而借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建TCP连接的开销。另外,直连的方式无法限制 redis客户端对象的个数,在极端情况下可能会造成连接泄漏,而连接池的形式可以有效的保护和控制资源的使用。
客户端直连方式和连接池方式的对比:
优点缺点
直连
优点:简单方便,适用于少量长期连接的场景
缺点:

  1. 存在每次新建/关闭TCP连接开销
  2. 资源无法控制,极端情况下出现连接泄漏
  3. Jedis对象线程不安全(Lettuce对象是线程安全的)
    连接池
    优点:无需每次连接生成Jedis对象,降低开销
    缺点:使用连接池的形式保护和控制资源的使用相对于直连,使用更加麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题

Lettuce

spring-boot

spring-cloud

registry

注册中心
Eureka

Eureka自我保护机制

springcloud服务已经关但是Eureka还是显示up,该状态持续很久,访问该服务也返回错误,但在注册中心界面,该服务却一直存在,且为UP状态,并且在大约十分钟后,出现一行红色大字:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
原因:自我保护机制。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。

进程间通信

Feign

负载均衡

客户端负载均衡
Ribbon

分布式配置中心

Spring Cloud Config
动态刷新
http://blog.didispace.com/springcloud4-2/
消息总线

kubernetes

基本概念

集群

一个集群指容器运行所需要的云资源组合,关联了若干服务器节点、负载均衡、专有网络等云资源。

节点

一台服务器(可以是虚拟机实例或者物理服务器)已经安装了 Docker Engine,可以用于部署和管理容器;容器服务的 Agent 程序会安装到节点上并注册到一个集群上。集群中的节点数量可以伸缩。

容器

一个通过 Docker 镜像创建的运行时实例,一个节点可运行多个容器。

镜像

Docker 镜像是容器应用打包的标准格式,在部署容器化应用时可以指定镜像,镜像可以来自于 Docker Hub,阿里云容器 Hub,或者用户的私有 Registry。镜像 ID 可以由镜像所在仓库 URI 和镜像 Tag(缺省为 latest)唯一确认。

编排模板

java-8

Stream API

lambda

Date-Time

死锁

  1. for update 是否锁表

  2. 事务传播 @Transactional

  3. 异常 MySQLTransactionRollbackException

  4. 隔离级别

    1
    2
    3
    4
    5
    6
    7
    8
    show engines;
    show variables like '%storage_engine%';
    select version();
    select @@tx_isolation; -- 查看数据库隔离级别
    select @@autocommit;
    show variables like 'innodb_lock_wait_timeout';
    show global variables like 'innodb_lock_wait_timeout';
    set innodb_lock_wait_timeout=1000; -- 设置当前会话 Innodb 行锁等待超时时间,单位秒
  5. INNODB 事务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT
    `trx_id`,
    `trx_state` AS 事务状态,
    `trx_started` AS 开始时间,
    `trx_requested_lock_id`,
    `trx_wait_started`,
    `trx_weight` AS 权重,
    `trx_mysql_thread_id` AS 线程ID,
    `trx_query`,
    `trx_operation_state`,
    `trx_tables_locked` AS 锁表个数,
    `trx_rows_locked` AS 锁表行数,
    `trx_rows_modified` AS 修改行数,
    `trx_autocommit_non_locking` AS 是否自动提交
    FROM
    INNODB_TRX t;
  6. 场景模拟

spring-boot-2.0

context-path

1
2
3
4
# 旧版
server.context-path: xxxx
# 新版
server.servlet.context-path: xxxx

Actuator

Dependency

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Endpoints

执行器端点(endpoints)可用于监控应用及与应用进行交互

  • env 显示来自Spring的 ConfigurableEnvironment的属性
  • health 显示应用的健康信息
  • info 显示任意的应用信息
  • metrics 展示当前应用的metrics信息
  • mappings 显示一个所有@RequestMapping路径的集合列表
  • logfile 返回日志文件内容(如果设置了logging.file或logging.path属性的话)
  • prometheus 以可以被Prometheus服务器抓取的格式显示metrics信息

启用禁用:

1
2
management.endpoint.metrics.enabled=true
management.endpoint.env.enabled=true

sonar

start

1
2
3
4
5
6
7
8
9
docker run -d --name sonarqube \
-p 9797:9000 -p 9092:9092 \
-v /opt/sonarqube/temp:/opt/sonarqube/temp \
-v /opt/sonarqube/conf:/opt/sonarqube/conf \
-v /opt/sonarqube/extensions:/opt/sonarqube/extensions \
-e SONARQUBE_JDBC_USERNAME=username \
-e SONARQUBE_JDBC_PASSWORD=password \
-e SONARQUBE_JDBC_URL="jdbc:mysql://192.168.20.234:3306/sonar?useUnicode=true&characterEncoding=utf8" \
sonarqube:7.1

postgres db

1
2
3
4
5
6
7
8
9
docker pull postgres:10
docker pull sonarqube:7.9.1-community
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=1 --name postgres postgres:10
docker run -d --name sonarqube \
-p 9000:9000 \
-e "SONARQUBE_JDBC_URL=jdbc:postgresql://192.168.114.131:5432/sonar" \
-e "SONARQUBE_JDBC_USERNAME=postgres" \
-e "SONARQUBE_JDBC_PASSWORD=1" \
sonarqube:7.9.1-community

plugins

1
2
3
4
5
6
7
8
FROM sonarqube
ADD ./sonar-l10n-zh-plugin-1.15.jar /opt/sonarqube/extensions/plugins/sonar-l10n-zh-plugin-1.15.jar
ADD ./sonar-java-plugin-4.7.0.9212.jar /opt/sonarqube/extensions/plugins/sonar-java-plugin-4.7.0.9212.jar
ADD ./sonar-findbugs-plugin-3.4.4.jar /opt/sonarqube/extensions/plugins/sonar-findbugs-plugin-3.4.4.jar
ADD ./checkstyle-sonar-plugin-3.6.jar /opt/sonarqube/extensions/plugins/checkstyle-sonar-plugin-3.6.jar
ADD ./backelite-sonar-swift-plugin-0.3.2.jar /opt/sonarqube/extensions/plugins/backelite-sonar-swift-plugin-0.3.2.jar
ADD ./sonar-web-plugin-2.5.0.476.jar /opt/sonarqube/extensions/plugins/sonar-web-plugin-2.5.0.476.jar
ADD ./sonar-javascript-plugin-2.21.0.4409.jar /opt/sonarqube/extensions/plugins/sonar-javascript-plugin-2.21.0.4409.jar

IDE Support

Eclipse
IDEA

maven项目sonar扫描本地配置和扫描相关命令

1
mvn sonar:sonar
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×