mirror of https://github.com/longtai-cn/hippo4j
parent
e141e5d16f
commit
5fc2906041
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"label": "开发者手册",
|
||||||
|
"position": 5,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "Hippo4j 留给使用者能够扩展的知识点。"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 0
|
||||||
|
---
|
||||||
|
|
||||||
|
# 内置拒绝策略
|
||||||
|
|
||||||
|
内置两种拒绝策略说明:
|
||||||
|
|
||||||
|
**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class RunsOldestTaskPolicy implements RejectedExecutionHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
|
||||||
|
if (executor.isShutdown()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BlockingQueue<Runnable> workQueue = executor.getQueue();
|
||||||
|
Runnable firstWork = workQueue.poll();
|
||||||
|
boolean newTaskAdd = workQueue.offer(r);
|
||||||
|
if (firstWork != null) {
|
||||||
|
firstWork.run();
|
||||||
|
}
|
||||||
|
if (!newTaskAdd) {
|
||||||
|
executor.execute(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Slf4j
|
||||||
|
public class SyncPutQueuePolicy implements RejectedExecutionHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
|
||||||
|
if (executor.isShutdown()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
executor.getQueue().put(r);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("Adding Queue task to thread pool failed.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "快速开始",
|
||||||
|
"position": 3,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"label": "依赖配置中心",
|
||||||
|
"position": 2,
|
||||||
|
"collapsed": true
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# 参数默认配置
|
||||||
|
|
||||||
|
曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
spring:
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
default-executor:
|
||||||
|
core-pool-size: 4
|
||||||
|
maximum-pool-size: 6
|
||||||
|
blocking-queue: ResizableCapacityLinkedBlockingQueue
|
||||||
|
queue-capacity: 1024
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 9999
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
active-alarm: 90
|
||||||
|
capacity-alarm: 85
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
notify:
|
||||||
|
interval: 5
|
||||||
|
receives: chen.ma
|
||||||
|
executors:
|
||||||
|
- thread-pool-id: message-produce
|
||||||
|
- thread-pool-id: message-consume
|
||||||
|
core-pool-size: 80
|
||||||
|
maximum-pool-size: 100
|
||||||
|
execute-time-out: 1000
|
||||||
|
notify:
|
||||||
|
interval: 6
|
||||||
|
receives: chen.ma
|
||||||
|
```
|
||||||
|
|
||||||
|
`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。
|
||||||
|
|
||||||
|
如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。
|
||||||
|
|
||||||
|
通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。
|
||||||
|
|
||||||
|
提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。
|
@ -0,0 +1,121 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# 适配SpringBoot1x
|
||||||
|
|
||||||
|
目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hippo4j</groupId>
|
||||||
|
<artifactId>hippo4j-config-spring-boot-1x-starter</artifactId>
|
||||||
|
<version>1.5.0</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
Nacos SpringBoot 配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
ext-config:
|
||||||
|
- data-id: hippo4j-nacos.yaml
|
||||||
|
group: DEFAULT_GROUP
|
||||||
|
refresh: true
|
||||||
|
server-addr: 127.0.0.1:8848
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
config-file-type: yml
|
||||||
|
nacos:
|
||||||
|
data-id: hippo4j-nacos.yaml
|
||||||
|
group: DEFAULT_GROUP
|
||||||
|
```
|
||||||
|
|
||||||
|
Apollo SpringBoot 配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apollo:
|
||||||
|
autoUpdateInjectedSpringProperties: true
|
||||||
|
bootstrap:
|
||||||
|
eagerLoad:
|
||||||
|
enabled: true
|
||||||
|
enabled: true
|
||||||
|
namespaces: application
|
||||||
|
meta: http://127.0.0.1:8080
|
||||||
|
app:
|
||||||
|
id: dynamic-threadpool-example
|
||||||
|
spring:
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
apollo:
|
||||||
|
namespace: application
|
||||||
|
```
|
||||||
|
|
||||||
|
动态线程池通用配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
management:
|
||||||
|
context-path: /actuator
|
||||||
|
security:
|
||||||
|
enabled: false
|
||||||
|
server:
|
||||||
|
port: 8091
|
||||||
|
servlet:
|
||||||
|
context-path: /example
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: dynamic-threadpool-example
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
banner: true
|
||||||
|
check-state-interval: 5
|
||||||
|
collect-type: micrometer
|
||||||
|
config-file-type: properties
|
||||||
|
enable: true
|
||||||
|
executors:
|
||||||
|
- active-alarm: 80
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
blocking-queue: LinkedBlockingQueue
|
||||||
|
capacity-alarm: 80
|
||||||
|
core-pool-size: 1
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 6691
|
||||||
|
maximum-pool-size: 1
|
||||||
|
notify:
|
||||||
|
interval: 8
|
||||||
|
receives: chen.ma
|
||||||
|
queue-capacity: 1
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
thread-name-prefix: message-consume
|
||||||
|
thread-pool-id: message-consume
|
||||||
|
- active-alarm: 80
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
blocking-queue: LinkedBlockingQueue
|
||||||
|
capacity-alarm: 80
|
||||||
|
core-pool-size: 1
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 6691
|
||||||
|
maximum-pool-size: 1
|
||||||
|
notify:
|
||||||
|
interval: 8
|
||||||
|
receives: chen.ma
|
||||||
|
queue-capacity: 1
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
thread-name-prefix: message-produce
|
||||||
|
thread-pool-id: message-produce
|
||||||
|
notify-platforms:
|
||||||
|
- platform: WECHAT
|
||||||
|
token: ac0426a5-c712-474c-9bff-72b8b8f5caff
|
||||||
|
profiles:
|
||||||
|
active: dev
|
||||||
|
```
|
||||||
|
|
||||||
|
具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。
|
||||||
|
|
||||||
|
- `/hippo4j-config-nacos-spring-boot-1x-starter-example`
|
||||||
|
- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example`
|
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 730 KiB |
After Width: | Height: | Size: 27 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"label": "无中间件依赖",
|
||||||
|
"position": 3,
|
||||||
|
"collapsed": true
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# 简介
|
||||||
|
|
||||||
|
## 线程池痛点
|
||||||
|
|
||||||
|
线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。
|
||||||
|
|
||||||
|
如果有在项目中实际使用线程池,相信你可能会遇到以下痛点:
|
||||||
|
|
||||||
|
- 线程池随便定义,线程资源过多,造成服务器高负载。
|
||||||
|
|
||||||
|
- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。
|
||||||
|
- 线程池任务执行时间超过平均执行周期,开发人员无法感知。
|
||||||
|
- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。
|
||||||
|
- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。
|
||||||
|
- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。
|
||||||
|
- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。
|
||||||
|
- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。
|
||||||
|
|
||||||
|
## 什么是 Hippo4j
|
||||||
|
|
||||||
|
Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。
|
||||||
|
|
||||||
|
提供以下功能支持:
|
||||||
|
|
||||||
|
- 全局管控 - 管理应用线程池实例。
|
||||||
|
|
||||||
|
- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。
|
||||||
|
- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。
|
||||||
|
- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。
|
||||||
|
- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。
|
||||||
|
- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。
|
||||||
|
- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。
|
||||||
|
- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start)
|
||||||
|
|
||||||
|
演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html)
|
||||||
|
|
||||||
|
## 接入登记
|
||||||
|
|
||||||
|
更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。
|
||||||
|
|
||||||
|
## 联系我
|
||||||
|
|
||||||
|
开源不易,右上角点个 Star 鼓励一下吧!
|
||||||
|
|
||||||
|
如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。
|
||||||
|
|
||||||
|
使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。
|
||||||
|
|
||||||
|
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20230317191041262-mini.png)
|
||||||
|
|
||||||
|
## 友情链接
|
||||||
|
|
||||||
|
- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。
|
||||||
|
|
||||||
|
- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!
|
||||||
|
- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。
|
||||||
|
- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。
|
||||||
|
- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。
|
||||||
|
|
||||||
|
## 贡献者
|
||||||
|
|
||||||
|
感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "运维指南",
|
||||||
|
"position": 4,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "其它",
|
||||||
|
"position": 6,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"label": "用户指南",
|
||||||
|
"position": 2,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"label": "开发者手册",
|
||||||
|
"position": 5,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "Hippo4j 留给使用者能够扩展的知识点。"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 0
|
||||||
|
---
|
||||||
|
|
||||||
|
# 内置拒绝策略
|
||||||
|
|
||||||
|
内置两种拒绝策略说明:
|
||||||
|
|
||||||
|
**RunsOldestTaskPolicy**:添加新任务并由主线程运行最早的任务。
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class RunsOldestTaskPolicy implements RejectedExecutionHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
|
||||||
|
if (executor.isShutdown()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BlockingQueue<Runnable> workQueue = executor.getQueue();
|
||||||
|
Runnable firstWork = workQueue.poll();
|
||||||
|
boolean newTaskAdd = workQueue.offer(r);
|
||||||
|
if (firstWork != null) {
|
||||||
|
firstWork.run();
|
||||||
|
}
|
||||||
|
if (!newTaskAdd) {
|
||||||
|
executor.execute(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**SyncPutQueuePolicy**:主线程把拒绝任务以阻塞的方式添加到队列。
|
||||||
|
|
||||||
|
```java
|
||||||
|
@Slf4j
|
||||||
|
public class SyncPutQueuePolicy implements RejectedExecutionHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
|
||||||
|
if (executor.isShutdown()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
executor.getQueue().put(r);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("Adding Queue task to thread pool failed.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "快速开始",
|
||||||
|
"position": 3,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"label": "依赖配置中心",
|
||||||
|
"position": 2,
|
||||||
|
"collapsed": true
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
# 参数默认配置
|
||||||
|
|
||||||
|
曾有多名小伙伴反馈说,项目中线程池一多,配置文件中配置就显得很臃肿。为此 hippo4j-config 开发出了动态线程池默认配置。
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
spring:
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
default-executor:
|
||||||
|
core-pool-size: 4
|
||||||
|
maximum-pool-size: 6
|
||||||
|
blocking-queue: ResizableCapacityLinkedBlockingQueue
|
||||||
|
queue-capacity: 1024
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 9999
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
active-alarm: 90
|
||||||
|
capacity-alarm: 85
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
notify:
|
||||||
|
interval: 5
|
||||||
|
receives: chen.ma
|
||||||
|
executors:
|
||||||
|
- thread-pool-id: message-produce
|
||||||
|
- thread-pool-id: message-consume
|
||||||
|
core-pool-size: 80
|
||||||
|
maximum-pool-size: 100
|
||||||
|
execute-time-out: 1000
|
||||||
|
notify:
|
||||||
|
interval: 6
|
||||||
|
receives: chen.ma
|
||||||
|
```
|
||||||
|
|
||||||
|
`spring.dynamic.thread-pool.executors` 层级下,仅需要配置 `thread-pool-id`,其余配置从 `spring.dynamic.thread-pool.default-executor` 读取。
|
||||||
|
|
||||||
|
如果 `spring.dynamic.thread-pool.executors` 下配置和 `spring.dynamic.thread-pool.default-executor` 冲突,以前者为主。
|
||||||
|
|
||||||
|
通过该自定义配置方式,可减少大量重复线程池参数配置项,提高核心配置简洁度。
|
||||||
|
|
||||||
|
提示:`spring.dynamic.thread-pool.default-executor` 层级下参数,不提供动态刷新功能。
|
@ -0,0 +1,121 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
# 适配SpringBoot1x
|
||||||
|
|
||||||
|
目前已支持 Nacos、Apollo 配置中心适配 SpringBoot 1.5.x 版本。
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>cn.hippo4j</groupId>
|
||||||
|
<artifactId>hippo4j-config-spring-boot-1x-starter</artifactId>
|
||||||
|
<version>1.5.0</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
Nacos SpringBoot 配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
config:
|
||||||
|
ext-config:
|
||||||
|
- data-id: hippo4j-nacos.yaml
|
||||||
|
group: DEFAULT_GROUP
|
||||||
|
refresh: true
|
||||||
|
server-addr: 127.0.0.1:8848
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
config-file-type: yml
|
||||||
|
nacos:
|
||||||
|
data-id: hippo4j-nacos.yaml
|
||||||
|
group: DEFAULT_GROUP
|
||||||
|
```
|
||||||
|
|
||||||
|
Apollo SpringBoot 配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apollo:
|
||||||
|
autoUpdateInjectedSpringProperties: true
|
||||||
|
bootstrap:
|
||||||
|
eagerLoad:
|
||||||
|
enabled: true
|
||||||
|
enabled: true
|
||||||
|
namespaces: application
|
||||||
|
meta: http://127.0.0.1:8080
|
||||||
|
app:
|
||||||
|
id: dynamic-threadpool-example
|
||||||
|
spring:
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
apollo:
|
||||||
|
namespace: application
|
||||||
|
```
|
||||||
|
|
||||||
|
动态线程池通用配置如下:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
management:
|
||||||
|
context-path: /actuator
|
||||||
|
security:
|
||||||
|
enabled: false
|
||||||
|
server:
|
||||||
|
port: 8091
|
||||||
|
servlet:
|
||||||
|
context-path: /example
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: dynamic-threadpool-example
|
||||||
|
dynamic:
|
||||||
|
thread-pool:
|
||||||
|
banner: true
|
||||||
|
check-state-interval: 5
|
||||||
|
collect-type: micrometer
|
||||||
|
config-file-type: properties
|
||||||
|
enable: true
|
||||||
|
executors:
|
||||||
|
- active-alarm: 80
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
blocking-queue: LinkedBlockingQueue
|
||||||
|
capacity-alarm: 80
|
||||||
|
core-pool-size: 1
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 6691
|
||||||
|
maximum-pool-size: 1
|
||||||
|
notify:
|
||||||
|
interval: 8
|
||||||
|
receives: chen.ma
|
||||||
|
queue-capacity: 1
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
thread-name-prefix: message-consume
|
||||||
|
thread-pool-id: message-consume
|
||||||
|
- active-alarm: 80
|
||||||
|
alarm: true
|
||||||
|
allow-core-thread-time-out: true
|
||||||
|
blocking-queue: LinkedBlockingQueue
|
||||||
|
capacity-alarm: 80
|
||||||
|
core-pool-size: 1
|
||||||
|
execute-time-out: 1000
|
||||||
|
keep-alive-time: 6691
|
||||||
|
maximum-pool-size: 1
|
||||||
|
notify:
|
||||||
|
interval: 8
|
||||||
|
receives: chen.ma
|
||||||
|
queue-capacity: 1
|
||||||
|
rejected-handler: AbortPolicy
|
||||||
|
thread-name-prefix: message-produce
|
||||||
|
thread-pool-id: message-produce
|
||||||
|
notify-platforms:
|
||||||
|
- platform: WECHAT
|
||||||
|
token: ac0426a5-c712-474c-9bff-72b8b8f5caff
|
||||||
|
profiles:
|
||||||
|
active: dev
|
||||||
|
```
|
||||||
|
|
||||||
|
具体 Demo 运行请参考以下示例模块,已验证对应线程池动态变更、报警以及运行时监控功能。
|
||||||
|
|
||||||
|
- `/hippo4j-config-nacos-spring-boot-1x-starter-example`
|
||||||
|
- `hippo4j-example/hippo4j-config-apollo-spring-boot-1x-starter-example`
|
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 730 KiB |
After Width: | Height: | Size: 27 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"label": "无中间件依赖",
|
||||||
|
"position": 3,
|
||||||
|
"collapsed": true
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# 简介
|
||||||
|
|
||||||
|
## 线程池痛点
|
||||||
|
|
||||||
|
线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。
|
||||||
|
|
||||||
|
如果有在项目中实际使用线程池,相信你可能会遇到以下痛点:
|
||||||
|
|
||||||
|
- 线程池随便定义,线程资源过多,造成服务器高负载。
|
||||||
|
|
||||||
|
- 线程池参数不易评估,随着业务的并发提升,业务面临出现故障的风险。
|
||||||
|
- 线程池任务执行时间超过平均执行周期,开发人员无法感知。
|
||||||
|
- 线程池任务堆积,触发拒绝策略,影响既有业务正常运行。
|
||||||
|
- 当业务出现超时、熔断等问题时,因为没有监控,无法确定是不是线程池引起。
|
||||||
|
- 原生线程池不支持运行时变量的传递,比如 MDC 上下文遇到线程池就 GG。
|
||||||
|
- 无法执行优雅关闭,当项目关闭时,大量正在运行的线程池任务被丢弃。
|
||||||
|
- 线程池运行中,任务执行停止,怀疑发生死锁或执行耗时操作,但是无从下手。
|
||||||
|
|
||||||
|
## 什么是 Hippo4j
|
||||||
|
|
||||||
|
Hippo4j 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力。
|
||||||
|
|
||||||
|
提供以下功能支持:
|
||||||
|
|
||||||
|
- 全局管控 - 管理应用线程池实例。
|
||||||
|
|
||||||
|
- 动态变更 - 应用运行时动态变更线程池参数,包括不限于:核心、最大线程数、阻塞队列容量、拒绝策略等。
|
||||||
|
- 通知报警 - 内置四种报警通知策略,线程池活跃度、容量水位、拒绝策略以及任务执行时间超长。
|
||||||
|
- 运行监控 - 实时查看线程池运行时数据,最近半小时线程池运行数据图表展示。
|
||||||
|
- 功能扩展 - 支持线程池任务传递上下文;项目关闭时,支持等待线程池在指定时间内完成任务。
|
||||||
|
- 多种模式 - 内置两种使用模式:[依赖配置中心](https://hippo4j.cn/docs/user_docs/getting_started/config/hippo4j-config-start) 和 [无中间件依赖](https://hippo4j.cn/docs/user_docs/getting_started/server/hippo4j-server-start)。
|
||||||
|
- 容器管理 - Tomcat、Jetty、Undertow 容器线程池运行时查看和线程数变更。
|
||||||
|
- 框架适配 - Dubbo、Hystrix、RabbitMQ、RocketMQ 等消费线程池运行时数据查看和线程数变更。
|
||||||
|
|
||||||
|
## 快速开始
|
||||||
|
|
||||||
|
对于本地演示目的,请参阅 [Quick start](https://hippo4j.cn/docs/user_docs/user_guide/quick-start)
|
||||||
|
|
||||||
|
演示环境: [http://console.hippo4j.cn/index.html](http://console.hippo4j.cn/index.html)
|
||||||
|
|
||||||
|
## 接入登记
|
||||||
|
|
||||||
|
更多接入的公司,欢迎在 [登记地址](https://github.com/opengoofy/hippo4j/issues/13) 登记,登记仅仅为了产品推广。
|
||||||
|
|
||||||
|
## 联系我
|
||||||
|
|
||||||
|
开源不易,右上角点个 Star 鼓励一下吧!
|
||||||
|
|
||||||
|
如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。
|
||||||
|
|
||||||
|
使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。
|
||||||
|
|
||||||
|
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20230317191041262-mini.png)
|
||||||
|
|
||||||
|
## 友情链接
|
||||||
|
|
||||||
|
- [[ LiteFlow ]](https://liteflow.yomahub.com/):轻量,快速,稳定可编排的组件式规则引擎。
|
||||||
|
|
||||||
|
- [[ Sa-Token ]](https://github.com/dromara/sa-token):一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!
|
||||||
|
- [[ HertzBeat ]](https://github.com/dromara/hertzbeat):易用友好的云监控系统, 无需 Agent, 强大自定义监控能力。
|
||||||
|
- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。
|
||||||
|
- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。
|
||||||
|
|
||||||
|
## 贡献者
|
||||||
|
|
||||||
|
感谢所有为项目作出贡献的开发者。如果有意贡献,参考 [good first issue](https://github.com/opengoofy/hippo4j/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)。
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "运维指南",
|
||||||
|
"position": 4,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"label": "其它",
|
||||||
|
"position": 6,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"label": "用户指南",
|
||||||
|
"position": 2,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"tutorialSidebar": [
|
||||||
|
{
|
||||||
|
"type": "autogenerated",
|
||||||
|
"dirName": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"user_docs": [
|
||||||
|
{
|
||||||
|
"type": "autogenerated",
|
||||||
|
"dirName": "user_docs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"sponsor": [
|
||||||
|
{
|
||||||
|
"type": "autogenerated",
|
||||||
|
"dirName": "sponsor"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
[
|
[
|
||||||
|
"1.5.0",
|
||||||
"1.4.3",
|
"1.4.3",
|
||||||
"1.4.2"
|
"1.4.2"
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in new issue