Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	agent/hippo4j-agent-plugin/adapter-plugins/dubbo-plugin/src/main/java/cn/hippo4j/agent/adapter/dubbo/DubboThreadPoolAdapter.java
pull/1464/head
furao 2 years ago
commit c4ad2c7697

BIN
.DS_Store vendored

Binary file not shown.

@ -1,27 +0,0 @@
---
name: "BUG Report"
about: Submitting problem defects helps us to improve
---
## BUG Report
Before you start reporting errors, make sure you carefully review the following steps:
- Search for open and closed [GitHub ISSUE](https://github.com/opengoofy/hippo4j/issues)
- Read [Frequently asked questions](https://hippo4j.cn/community/faq)
Please answer these questions before submitting them. Thank you.
### Which Project did you use? Hippo4j config or Hippo4j server?
### Which version did you use?
### Expected behavior
### Actual behavior
### Cause analysis (if possible)
### Problem recurrence steps
### Sample code to reproduce the problem (for example, the GitHub Link)

@ -0,0 +1,112 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Bug report
title: "[Bug] Bug title "
description: If something isn't working as expected.
labels: [ "type: bug" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: dropdown
attributes:
label: Environment
description: Describe the environment.
options:
- Mac
- Windows
- Linux
- Other
validations:
required: true
- type: dropdown
attributes:
label: Hippo4j version
description: Describe the Hippo4j version.
options:
- develop
- 1.5.0
- 1.4.3
- Other
validations:
required: true
- type: textarea
attributes:
label: What happened
description: Describe what happened.
placeholder: >
A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
attributes:
label: How to reproduce
description: >
Describe the steps to reproduce the bug here.
placeholder: >
Please make sure you provide a reproducible step-by-step case of how to reproduce the problem
as minimally and precisely as possible.
validations:
required: true
- type: textarea
attributes:
label: Debug logs
description: Anything else we need to know?
placeholder: >
Add your debug logs here.
validations:
required: false
- type: checkboxes
attributes:
label: Are you willing to submit PR?
description: >
This is absolutely not required, but we are happy to guide you in the contribution process
especially if you already have a good understanding of how to implement the fix.
options:
- label: Yes I am willing to submit a PR!
- type: checkboxes
attributes:
label: Code of Conduct
description: >
The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it..
options:
- label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) *
- type: markdown
attributes:
value: "Thanks for completing our form!"

@ -0,0 +1,68 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Documentation Related
title: "[Doc] Documentation Related "
description: I find some issues related to the documentation.
labels: [ "type: documentation" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: textarea
attributes:
label: Documentation Related
description: Describe the suggestion about document.
placeholder: >
e.g There is a typo
validations:
required: true
- type: checkboxes
attributes:
label: Are you willing to submit PR?
description: >
This is absolutely not required, but we are happy to guide you in the contribution process
especially if you already have a good understanding of how to implement the fix.
options:
- label: Yes I am willing to submit a PR!
- type: checkboxes
attributes:
label: Code of Conduct
description: >
The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it..
options:
- label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) *
- type: markdown
attributes:
value: "Thanks for completing our form!"

@ -0,0 +1,77 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Enhancement Request
title: "[Enhancement] Enhancement title"
description: I want to suggest an enhancement for this project
labels: [ "type: enhancement" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: textarea
attributes:
label: Enhancement Request
description: Describe the suggestion.
placeholder: >
First of all: Have you checked the docs https://hippo4j.cn/community/dev_convention/code,
or GitHub issues whether someone else has already reported your issue?
validations:
required: true
- type: textarea
attributes:
label: Describe the solution you'd like
description: Describe the suggestion.
placeholder: >
A clear and concise description of what you want to happen. Add any considered drawbacks.
validations:
required: true
- type: checkboxes
attributes:
label: Are you willing to submit PR?
description: >
This is absolutely not required, but we are happy to guide you in the contribution process
especially if you already have a good understanding of how to implement the fix.
options:
- label: Yes I am willing to submit a PR!
- type: checkboxes
attributes:
label: Code of Conduct
description: >
The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it..
options:
- label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) *
- type: markdown
attributes:
value: "Thanks for completing our form!"

@ -1,12 +0,0 @@
---
name: "Demand advice"
about: Propose ideas and suggestions for this project
---
## Demand advice
Please answer these questions before submitting them. Thank you.
### Is your function request related to the problem?
### Describe the function you want

@ -0,0 +1,70 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Feature Request
title: "[Feature] Feature title "
description: I want to suggest a feature for this project.
labels: [ "type: feature" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: textarea
attributes:
label: Feature Request
description: Describe the feature.
placeholder: >
First of all: Have you checked the docs https://hippo4j.cn/community/dev_convention/code,
or GitHub issues whether someone else has already reported your issue?
Maybe the feature already exists?
validations:
required: true
- type: checkboxes
attributes:
label: Are you willing to submit PR?
description: >
This is absolutely not required, but we are happy to guide you in the contribution process
especially if you already have a good understanding of how to implement the fix.
options:
- label: Yes I am willing to submit a PR!
- type: checkboxes
attributes:
label: Code of Conduct
description: >
The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it..
options:
- label: I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct) *
- type: markdown
attributes:
value: "Thanks for completing our form!"

@ -1,27 +0,0 @@
---
name: "Question"
about: Use questions that were not answered in the documentation or discussion
---
## Question
Before you begin to report problems, make sure you carefully review the following steps:
- Searches for open and closed [GitHub ISSUE](https://github.com/opengoofy/hippo4j/issues)
- Read [Frequently asked questions](https://hippo4j.cn/community/faq)
Please answer these questions before submitting them. Thank you.
### Which Project did you use? Hippo4j config or Hippo4j server?
### Which version did you use?
### Expected behavior
### Actual behavior
### Cause analysis (if possible)
### Problem recurrence steps
### Sample code to reproduce the problem (for example, the GitHub Link)

@ -0,0 +1,51 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Question
title: "[Question] Question title "
description: I have a question that isn't answered in docs or issue.
labels: [ "type: question" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: textarea
attributes:
label: Question
description: Describe your question.
placeholder: >
Describe your question here :D
validations:
required: true
- type: markdown
attributes:
value: "Thanks for completing our form!"

@ -0,0 +1,86 @@
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
name: Unit Test
title: "[Unit Test] Unit test title"
description: I want to do some unit tests for this project
labels: [ "type: testing" ]
body:
- type: markdown
attributes:
value: |
For better global communication, Please write in English.
- type: checkboxes
attributes:
label: Search before asking
description: >
Please make sure to search in the [issues](https://github.com/opengoofy/hippo4j/issues)
first to see whether the same issue was reported already.
options:
- label: >
I had searched in the [issues](https://github.com/opengoofy/hippo4j/issues) and found
no similar issues.
required: true
- type: checkboxes
attributes:
label: Read the unit testing guidelines
description: >
Read the [develop guidelines](https://hippo4j.cn/community/dev_convention/code) before writing unit test code.
options:
- label: >
I have read.
required: true
- type: textarea
attributes:
label: Unit test request
description: Describe the unit test.
placeholder: >
First of all: Have you checked the docs https://hippo4j.cn/community/category/贡献规约,
or GitHub issues whether someone else has already reported your issue?
Maybe the unit tests you want to do have already been done?
validations:
required: true
- type: textarea
attributes:
label: Describe the unit tests you want to do
description: Describe the unit test.
value: |
Module name:
Located at:
Task status: ×(unfinished) / √(finished)
| Task Status | Class | Type |
| :------: | :------ | :------ |
| × | xxxxxx | xxxxxx |
validations:
required: true
- type: checkboxes
attributes:
label: Are you willing to submit PR?
description: >
This is absolutely not required, but we are happy to guide you in the contribution process
especially if you already have a good understanding of how to implement the fix.
options:
- label: Yes I am willing to submit a PR!
- type: markdown
attributes:
value: "Thanks for completing our form!"

2
.gitignore vendored

@ -36,7 +36,7 @@ build/
!**/src/test/**/build/
### VS Code ###
.vscode/
# .vscode/
# maven plugin ignore
*.gpg

@ -0,0 +1,35 @@
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"editor.formatOnSave": true
},
"typescript.tsdk":"./node_modules/typescript/lib"
}

@ -120,7 +120,8 @@ For full documentation & more details, visit: [Docs](https://www.hippo4j.cn)
- [[ JavaGuide ]](https://github.com/Snailclimb/JavaGuide):一份涵盖大部分 Java 程序员所需要掌握的核心知识。
- [[ toBeBetterJavaer ]](https://github.com/itwanger/toBeBetterJavaer):一份通俗易懂、风趣幽默的 Java 学习指南。
- [[ Jpom ]](https://gitee.com/dromara/Jpom):简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。
- [[ CongoMall ]](https://gitee.com/opengoofy/congomall):作者的另一个开源项目刚果商城,包含了商城业务和基础架构两大模块。
- [[ 12306 ]](https://gitee.com/nageoffer/12306):完成高仿 12306 用户+抢票+订单+支付服务,帮助学生主打就业的项目。
- [[ CongoMall ]](https://gitee.com/nageoffer/congomall):企业级商城,基于 DDD 领域驱动模型开发,包含商城业务和基础架构。
### 贡献者

@ -17,36 +17,22 @@
# The service name in UI
# ${service name} = [${group name}::]${logic name}
# The group name is optional only.
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
agent.service_name=${HIPPO4J_AGENT_NAME:Your_ApplicationName}
# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:}
agent.namespace=${HIPPO4J_AGENT_NAMESPACE:}
# The agent cluster
agent.cluster=${SW_AGENT_CLUSTER:}
# The number of sampled traces per 3 seconds
# Negative or zero means off, by default
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:-1}
# Authentication active is based on backend setting, see application.yml for more details.
agent.authentication=${SW_AGENT_AUTHENTICATION:}
# The max number of TraceSegmentRef in a single span to keep memory cost estimatable.
agent.trace_segment_ref_limit_per_span=${SW_TRACE_SEGMENT_LIMIT:500}
# The max amount of spans in a single segment.
# Through this config item, SkyWalking keep your application memory cost estimated.
agent.span_limit_per_segment=${SW_AGENT_SPAN_LIMIT:300}
agent.cluster=${HIPPO4J_AGENT_CLUSTER:}
# If the operation name of the first span is included in this set, this segment should be ignored. Multiple values should be separated by `,`.
agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
agent.ignore_suffix=${HIPPO4J_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
# If true, SkyWalking agent will save all instrumented classes files in `/debugging` folder.
# If true, Hippo4j agent will save all instrumented classes files in `/debugging` folder.
# SkyWalking team may ask for these files in order to resolve compatible problem.
agent.is_open_debugging_class=${SW_AGENT_OPEN_DEBUG:false}
# If true, SkyWalking agent will cache all instrumented classes files to memory or disk files (decided by class cache mode),
# If true, Hippo4j agent will cache all instrumented classes files to memory or disk files (decided by class cache mode),
# allow other javaagent to enhance those classes that enhanced by SkyWalking agent.
agent.is_cache_enhanced_class=${SW_AGENT_CACHE_CLASS:false}
@ -55,71 +41,18 @@ agent.is_cache_enhanced_class=${SW_AGENT_CACHE_CLASS:false}
# FILE: cache class bytes in `/class-cache` folder, automatically clean up cached class files when the application exits
agent.class_cache_mode=${SW_AGENT_CLASS_CACHE_MODE:MEMORY}
# Instance name is the identity of an instance, should be unique in the service. If empty, SkyWalking agent will
# generate an 32-bit uuid. BY Default, SkyWalking uses UUID@hostname as the instance name. Max length is 50(UTF-8 char)
agent.instance_name=${SW_AGENT_INSTANCE_NAME:}
# service instance properties in json format. e.g. agent.instance_properties_json = {"org": "apache-skywalking"}
agent.instance_properties_json=${SW_INSTANCE_PROPERTIES_JSON:}
# How depth the agent goes, when log all cause exceptions.
agent.cause_exception_depth=${SW_AGENT_CAUSE_EXCEPTION_DEPTH:5}
# Force reconnection period of grpc, based on grpc_channel_check_interval.
agent.force_reconnection_period=${SW_AGENT_FORCE_RECONNECTION_PERIOD:1}
# The operationName max length
# Notice, in the current practice, we don't recommend the length over 190.
agent.operation_name_threshold=${SW_AGENT_OPERATION_NAME_THRESHOLD:150}
# Keep tracing even the backend is not available if this value is true.
agent.keep_tracing=${SW_AGENT_KEEP_TRACING:false}
# The agent use gRPC plain text in default.
# If true, SkyWalking agent uses TLS even no CA file detected.
agent.force_tls=${SW_AGENT_FORCE_TLS:false}
# gRPC SSL trusted ca file.
agent.ssl_trusted_ca_path=${SW_AGENT_SSL_TRUSTED_CA_PATH:/ca/ca.crt}
# enable mTLS when ssl_key_path and ssl_cert_chain_path exist.
agent.ssl_key_path=${SW_AGENT_SSL_KEY_PATH:}
agent.ssl_cert_chain_path=${SW_AGENT_SSL_CERT_CHAIN_PATH:}
# Limit the length of the ipv4 list size.
osinfo.ipv4_list_size=${SW_AGENT_OSINFO_IPV4_LIST_SIZE:10}
# grpc channel status check interval.
collector.grpc_channel_check_interval=${SW_AGENT_COLLECTOR_GRPC_CHANNEL_CHECK_INTERVAL:30}
# Agent heartbeat report period. Unit, second.
collector.heartbeat_period=${SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD:30}
# The agent sends the instance properties to the backend every
# collector.heartbeat_period * collector.properties_report_period_factor seconds
collector.properties_report_period_factor=${SW_AGENT_COLLECTOR_PROPERTIES_REPORT_PERIOD_FACTOR:10}
# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
# How long grpc client will timeout in sending data to upstream. Unit is second.
collector.grpc_upstream_timeout=${SW_AGENT_COLLECTOR_GRPC_UPSTREAM_TIMEOUT:30}
# Sniffer get profile task list interval.
collector.get_profile_task_interval=${SW_AGENT_COLLECTOR_GET_PROFILE_TASK_INTERVAL:20}
# Sniffer get agent dynamic config interval.
collector.get_agent_dynamic_config_interval=${SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL:20}
# If true, skywalking agent will enable periodically resolving DNS to update receiver service addresses.
collector.is_resolve_dns_periodically=${SW_AGENT_COLLECTOR_IS_RESOLVE_DNS_PERIODICALLY:false}
# Logging level
logging.level=${SW_LOGGING_LEVEL:INFO}
logging.level=${HIPPO4J_LOGGING_LEVEL:INFO}
# Logging file_name
logging.file_name=${SW_LOGGING_FILE_NAME:hippo4j-api.log}
logging.file_name=${HIPPO4J_LOGGING_FILE_NAME:hippo4j-api.log}
# Log output. Default is FILE. Use CONSOLE means output to stdout.
logging.output=${SW_LOGGING_OUTPUT:FILE}
# Log files directory. Default is blank string, meaning use "{theHippo4jAgentJarDir}/logs " to output logs.
# {theHippo4jAgentJarDir} is the directory where the hippo4j agent jar file is located
logging.dir=${SW_LOGGING_DIR:}
logging.dir=${HIPPO4J_LOGGING_DIR:}
# Logger resolver: PATTERN or JSON. The default is PATTERN, which uses logging.pattern to print traditional text logs.
# JSON resolver prints logs in JSON format.
logging.resolver=${SW_LOGGING_RESOLVER:PATTERN}
logging.resolver=${HIPPO4J_LOGGING_RESOLVER:PATTERN}
# Logging format. There are all conversion specifiers:
# * %level means log level.
# * %timestamp means now of time with format yyyy-MM-dd HH:mm:ss:SSS.
@ -128,147 +61,16 @@ logging.resolver=${SW_LOGGING_RESOLVER:PATTERN}
# * %class means SimpleName of TargetClass.
# * %throwable means a throwable which user called.
# * %agent_name means agent.service_name. Only apply to the PatternLogger.
logging.pattern=${SW_LOGGING_PATTERN:%level %timestamp %thread %class : %msg %throwable}
logging.pattern=${HIPPO4J_LOGGING_PATTERN:%level %timestamp %thread %class : %msg %throwable}
# Logging max_file_size, default: 300 * 1024 * 1024 = 314572800
logging.max_file_size=${SW_LOGGING_MAX_FILE_SIZE:314572800}
logging.max_file_size=${HIPPO4J_LOGGING_MAX_FILE_SIZE:314572800}
# The max history log files. When rollover happened, if log files exceed this number,
# then the oldest file will be delete. Negative or zero means off, by default.
logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:-1}
# Listed exceptions would not be treated as an error. Because in some codes, the exception is being used as a way of controlling business flow.
# Besides, the annotation named IgnoredException in the trace toolkit is another way to configure ignored exceptions.
statuscheck.ignored_exceptions=${SW_STATUSCHECK_IGNORED_EXCEPTIONS:}
# The max recursive depth when checking the exception traced by the agent. Typically, we don't recommend setting this more than 10, which could cause a performance issue. Negative value and 0 would be ignored, which means all exceptions would make the span tagged in error status.
statuscheck.max_recursive_depth=${SW_STATUSCHECK_MAX_RECURSIVE_DEPTH:1}
# Max element count in the correlation context
correlation.element_max_number=${SW_CORRELATION_ELEMENT_MAX_NUMBER:3}
# Max value length of each element.
correlation.value_max_length=${SW_CORRELATION_VALUE_MAX_LENGTH:128}
# Tag the span by the key/value in the correlation context, when the keys listed here exist.
correlation.auto_tag_keys=${SW_CORRELATION_AUTO_TAG_KEYS:}
# The buffer size of collected JVM info.
jvm.buffer_size=${SW_JVM_BUFFER_SIZE:600}
# The buffer channel size.
buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5}
# The buffer size.
buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300}
# If true, skywalking agent will enable profile when user create a new profile task. Otherwise disable profile.
profile.active=${SW_AGENT_PROFILE_ACTIVE:true}
# Parallel monitor segment count
profile.max_parallel=${SW_AGENT_PROFILE_MAX_PARALLEL:5}
# Max monitor segment time(minutes), if current segment monitor time out of limit, then stop it.
profile.duration=${SW_AGENT_PROFILE_DURATION:10}
# Max dump thread stack depth
profile.dump_max_stack_depth=${SW_AGENT_PROFILE_DUMP_MAX_STACK_DEPTH:500}
# Snapshot transport to backend buffer size
profile.snapshot_transport_buffer_size=${SW_AGENT_PROFILE_SNAPSHOT_TRANSPORT_BUFFER_SIZE:4500}
# If true, the agent collects and reports metrics to the backend.
meter.active=${SW_METER_ACTIVE:true}
# Report meters interval. The unit is second
meter.report_interval=${SW_METER_REPORT_INTERVAL:20}
# Max size of the meter pool
meter.max_meter_size=${SW_METER_MAX_METER_SIZE:500}
# The max size of message to send to server.Default is 10 MB
log.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
logging.max_history_files=${HIPPO4J_LOGGING_MAX_HISTORY_FILES:-1}
# Mount the specific folders of the plugins. Plugins in mounted folders would work.
plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations}
# Peer maximum description limit.
plugin.peer_max_length=${SW_PLUGIN_PEER_MAX_LENGTH:200}
# Exclude some plugins define in plugins dir.Plugin names is defined in [Agent plugin list](Plugin-list.md)
plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:}
# If true, trace all the parameters in MongoDB access, default is false. Only trace the operation, not include parameters.
plugin.mongodb.trace_param=${SW_PLUGIN_MONGODB_TRACE_PARAM:false}
# If set to positive number, the `WriteRequest.params` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem.
plugin.mongodb.filter_length_limit=${SW_PLUGIN_MONGODB_FILTER_LENGTH_LIMIT:256}
# If true, trace all the DSL(Domain Specific Language) in ElasticSearch access, default is false.
plugin.elasticsearch.trace_dsl=${SW_PLUGIN_ELASTICSEARCH_TRACE_DSL:false}
# If true, the fully qualified method name will be used as the endpoint name instead of the request URL, default is false.
plugin.springmvc.use_qualified_name_as_endpoint_name=${SW_PLUGIN_SPRINGMVC_USE_QUALIFIED_NAME_AS_ENDPOINT_NAME:false}
# If true, the fully qualified method name will be used as the operation name instead of the given operation name, default is false.
plugin.toolit.use_qualified_name_as_operation_name=${SW_PLUGIN_TOOLIT_USE_QUALIFIED_NAME_AS_OPERATION_NAME:false}
# If set to true, the parameters of the sql (typically `java.sql.PreparedStatement`) would be collected.
plugin.jdbc.trace_sql_parameters=${SW_JDBC_TRACE_SQL_PARAMETERS:false}
# If set to positive number, the `db.sql.parameters` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem.
plugin.jdbc.sql_parameters_max_length=${SW_PLUGIN_JDBC_SQL_PARAMETERS_MAX_LENGTH:512}
# If set to positive number, the `db.statement` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem.
plugin.jdbc.sql_body_max_length=${SW_PLUGIN_JDBC_SQL_BODY_MAX_LENGTH:2048}
# If true, trace all the query parameters(include deleteByIds and deleteByQuery) in Solr query request, default is false.
plugin.solrj.trace_statement=${SW_PLUGIN_SOLRJ_TRACE_STATEMENT:false}
# If true, trace all the operation parameters in Solr request, default is false.
plugin.solrj.trace_ops_params=${SW_PLUGIN_SOLRJ_TRACE_OPS_PARAMS:false}
# If true, trace all middleware/business handlers that are part of the Light4J handler chain for a request.
plugin.light4j.trace_handler_chain=${SW_PLUGIN_LIGHT4J_TRACE_HANDLER_CHAIN:false}
# If true, the transaction definition name will be simplified.
plugin.springtransaction.simplify_transaction_definition_name=${SW_PLUGIN_SPRINGTRANSACTION_SIMPLIFY_TRANSACTION_DEFINITION_NAME:false}
# Threading classes (`java.lang.Runnable` and `java.util.concurrent.Callable`) and their subclasses, including anonymous inner classes whose name match any one of the `THREADING_CLASS_PREFIXES` (splitted by `,`) will be instrumented, make sure to only specify as narrow prefixes as what you're expecting to instrument, (`java.` and `javax.` will be ignored due to safety issues)
plugin.jdkthreading.threading_class_prefixes=${SW_PLUGIN_JDKTHREADING_THREADING_CLASS_PREFIXES:}
# This config item controls that whether the Tomcat plugin should collect the parameters of the request. Also, activate implicitly in the profiled trace.
plugin.tomcat.collect_http_params=${SW_PLUGIN_TOMCAT_COLLECT_HTTP_PARAMS:false}
# This config item controls that whether the SpringMVC plugin should collect the parameters of the request, when your Spring application is based on Tomcat, consider only setting either `plugin.tomcat.collect_http_params` or `plugin.springmvc.collect_http_params`. Also, activate implicitly in the profiled trace.
plugin.springmvc.collect_http_params=${SW_PLUGIN_SPRINGMVC_COLLECT_HTTP_PARAMS:false}
# This config item controls that whether the HttpClient plugin should collect the parameters of the request
plugin.httpclient.collect_http_params=${SW_PLUGIN_HTTPCLIENT_COLLECT_HTTP_PARAMS:false}
# When `COLLECT_HTTP_PARAMS` is enabled, how many characters to keep and send to the OAP backend, use negative values to keep and send the complete parameters, NB. this config item is added for the sake of performance.
plugin.http.http_params_length_threshold=${SW_PLUGIN_HTTP_HTTP_PARAMS_LENGTH_THRESHOLD:1024}
# When `include_http_headers` declares header names, this threshold controls the length limitation of all header values. use negative values to keep and send the complete headers. Note. this config item is added for the sake of performance.
plugin.http.http_headers_length_threshold=${SW_PLUGIN_HTTP_HTTP_HEADERS_LENGTH_THRESHOLD:2048}
# Set the header names, which should be collected by the plugin. Header name must follow `javax.servlet.http` definition. Multiple names should be split by comma.
plugin.http.include_http_headers=${SW_PLUGIN_HTTP_INCLUDE_HTTP_HEADERS:}
# This config item controls that whether the Feign plugin should collect the http body of the request.
plugin.feign.collect_request_body=${SW_PLUGIN_FEIGN_COLLECT_REQUEST_BODY:false}
# When `COLLECT_REQUEST_BODY` is enabled, how many characters to keep and send to the OAP backend, use negative values to keep and send the complete body.
plugin.feign.filter_length_limit=${SW_PLUGIN_FEIGN_FILTER_LENGTH_LIMIT:1024}
# When `COLLECT_REQUEST_BODY` is enabled and content-type start with SUPPORTED_CONTENT_TYPES_PREFIX, collect the body of the request , multiple paths should be separated by `,`
plugin.feign.supported_content_types_prefix=${SW_PLUGIN_FEIGN_SUPPORTED_CONTENT_TYPES_PREFIX:application/json,text/}
# If true, trace all the influxql(query and write) in InfluxDB access, default is true.
plugin.influxdb.trace_influxql=${SW_PLUGIN_INFLUXDB_TRACE_INFLUXQL:true}
# Apache Dubbo consumer collect `arguments` in RPC call, use `Object#toString` to collect `arguments`.
plugin.dubbo.collect_consumer_arguments=${SW_PLUGIN_DUBBO_COLLECT_CONSUMER_ARGUMENTS:false}
# When `plugin.dubbo.collect_consumer_arguments` is `true`, Arguments of length from the front will to the OAP backend
plugin.dubbo.consumer_arguments_length_threshold=${SW_PLUGIN_DUBBO_CONSUMER_ARGUMENTS_LENGTH_THRESHOLD:256}
# Apache Dubbo provider collect `arguments` in RPC call, use `Object#toString` to collect `arguments`.
plugin.dubbo.collect_provider_arguments=${SW_PLUGIN_DUBBO_COLLECT_PROVIDER_ARGUMENTS:false}
# When `plugin.dubbo.collect_provider_arguments` is `true`, Arguments of length from the front will to the OAP backend
plugin.dubbo.provider_arguments_length_threshold=${SW_PLUGIN_DUBBO_PROVIDER_ARGUMENTS_LENGTH_THRESHOLD:256}
# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster.
plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
# Timeout period of reading topics from the Kafka server, the unit is second.
plugin.kafka.get_topic_timeout=${SW_GET_TOPIC_TIMEOUT:10}
# Kafka producer configuration. Read [producer configure](http://kafka.apache.org/24/documentation.html#producerconfigs)
# to get more details. Check document for more details and examples.
plugin.kafka.producer_config=${sw_plugin_kafka_producer_config:}
# Configure Kafka Producer configuration in JSON format. Notice it will be overridden by plugin.kafka.producer_config[key], if the key duplication.
plugin.kafka.producer_config_json=${SW_PLUGIN_KAFKA_PRODUCER_CONFIG_JSON:}
# Specify which Kafka topic name for Meter System data to report to.
plugin.kafka.topic_meter=${SW_PLUGIN_KAFKA_TOPIC_METER:skywalking-meters}
# Specify which Kafka topic name for JVM metrics data to report to.
plugin.kafka.topic_metrics=${SW_PLUGIN_KAFKA_TOPIC_METRICS:skywalking-metrics}
# Specify which Kafka topic name for traces data to report to.
plugin.kafka.topic_segment=${SW_PLUGIN_KAFKA_TOPIC_SEGMENT:skywalking-segments}
# Specify which Kafka topic name for Thread Profiling snapshot to report to.
plugin.kafka.topic_profiling=${SW_PLUGIN_KAFKA_TOPIC_PROFILINGS:skywalking-profilings}
# Specify which Kafka topic name for the register or heartbeat data of Service Instance to report to.
plugin.kafka.topic_management=${SW_PLUGIN_KAFKA_TOPIC_MANAGEMENT:skywalking-managements}
# Specify which Kafka topic name for the logging data to report to.
plugin.kafka.topic_logging=${SW_PLUGIN_KAFKA_TOPIC_LOGGING:skywalking-logs}
# isolate multi OAP server when using same Kafka cluster (final topic name will append namespace before Kafka topics with `-` ).
plugin.kafka.namespace=${SW_KAFKA_NAMESPACE:}
# Match spring beans with regular expression for the class name. Multiple expressions could be separated by a comma. This only works when `Spring annotation plugin` has been activated.
plugin.springannotation.classname_match_regex=${SW_SPRINGANNOTATION_CLASSNAME_MATCH_REGEX:}
# Whether or not to transmit logged data as formatted or un-formatted.
plugin.toolkit.log.transmit_formatted=${SW_PLUGIN_TOOLKIT_LOG_TRANSMIT_FORMATTED:true}
# If set to true, the parameters of Redis commands would be collected by Lettuce agent.
plugin.lettuce.trace_redis_parameters=${SW_PLUGIN_LETTUCE_TRACE_REDIS_PARAMETERS:false}
# If set to positive number and `plugin.lettuce.trace_redis_parameters` is set to `true`, Redis command parameters would be collected and truncated to this length.
plugin.lettuce.redis_parameter_max_length=${SW_PLUGIN_LETTUCE_REDIS_PARAMETER_MAX_LENGTH:128}
# If set to true, the parameters of the cypher would be collected.
plugin.neo4j.trace_cypher_parameters=${SW_PLUGIN_NEO4J_TRACE_CYPHER_PARAMETERS:false}
# If set to positive number, the `db.cypher.parameters` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem.
plugin.neo4j.cypher_parameters_max_length=${SW_PLUGIN_NEO4J_CYPHER_PARAMETERS_MAX_LENGTH:512}
# If set to positive number, the `db.statement` would be truncated to this length, otherwise it would be completely saved, which may cause performance problem.
plugin.neo4j.cypher_body_max_length=${SW_PLUGIN_NEO4J_CYPHER_BODY_MAX_LENGTH:2048}
# If set to a positive number and activate `trace sampler CPU policy plugin`, the trace would not be collected when agent process CPU usage percent is greater than `plugin.cpupolicy.sample_cpu_usage_percent_limit`.
plugin.cpupolicy.sample_cpu_usage_percent_limit=${SW_SAMPLE_CPU_USAGE_PERCENT_LIMIT:-1}
plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:}

@ -83,6 +83,11 @@
<artifactId>hippo4j-threadpool-dynamic-mode-config</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.hippo4j</groupId>
<artifactId>hippo4j-threadpool-kernel-monitor</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>

@ -75,12 +75,6 @@ public class Config {
@Length(20)
public static String CLUSTER = "";
/**
* Authentication active is based on backend setting, see application.yml for more details. For most scenarios,
* this needs backend extensions, only basic match auth provided in default implementation.
*/
public static String AUTHENTICATION = "";
/**
* If true, Hippo4j agent will save all instrumented classes files in `/debugging` folder. Hippo4j team
* may ask for these files in order to resolve compatible problem.
@ -99,177 +93,6 @@ public class Config {
* folder, automatically clean up cached class files when the application exits
*/
public static ClassCacheMode CLASS_CACHE_MODE = ClassCacheMode.MEMORY;
/**
* The identifier of the instance
*/
@Length(50)
public volatile static String INSTANCE_NAME = "";
/**
* service instance properties in json format. e.g. agent.instance_properties_json = {"org":
* "cn.hippo4j"}
*/
public static String INSTANCE_PROPERTIES_JSON = "";
/**
* How depth the agent goes, when log cause exceptions.
*/
public static int CAUSE_EXCEPTION_DEPTH = 5;
/**
* Force reconnection period of grpc, based on grpc_channel_check_interval. If count of check grpc channel
* status more than this number. The channel check will call channel.getState(true) to requestConnection.
*/
public static long FORCE_RECONNECTION_PERIOD = 1;
/**
* Limit the length of the operationName to prevent the overlength issue in the storage.
*
* <p>NOTICE</p>
* In the current practice, we don't recommend the length over 190.
*/
public static int OPERATION_NAME_THRESHOLD = 150;
/**
* Keep tracing even the backend is not available.
*/
public static boolean KEEP_TRACING = false;
/**
* Force open TLS for gRPC channel if true.
*/
public static boolean FORCE_TLS = false;
/**
* SSL trusted ca file. If it exists, will enable TLS for gRPC channel.
*/
public static String SSL_TRUSTED_CA_PATH = "ca" + Constants.PATH_SEPARATOR + "ca.crt";
/**
* Key cert chain file. If ssl_cert_chain and ssl_key exist, will enable mTLS for gRPC channel.
*/
public static String SSL_CERT_CHAIN_PATH;
/**
* Private key file. If ssl_cert_chain and ssl_key exist, will enable mTLS for gRPC channel.
*/
public static String SSL_KEY_PATH;
}
public static class OsInfo {
/**
* Limit the length of the ipv4 list size.
*/
public static int IPV4_LIST_SIZE = 10;
}
public static class Collector {
/**
* grpc channel status check interval
*/
public static long GRPC_CHANNEL_CHECK_INTERVAL = 30;
/**
* The period in which the agent report a heartbeat to the backend.
*/
public static long HEARTBEAT_PERIOD = 30;
/**
* The agent sends the instance properties to the backend every `collector.heartbeat_period *
* collector.properties_report_period_factor` seconds
*/
public static int PROPERTIES_REPORT_PERIOD_FACTOR = 10;
/**
* Collector hippo4j trace receiver service addresses.
*/
public static String BACKEND_SERVICE = "";
/**
* How long grpc client will timeout in sending data to upstream.
*/
public static int GRPC_UPSTREAM_TIMEOUT = 30;
/**
* Get profile task list interval
*/
public static int GET_PROFILE_TASK_INTERVAL = 20;
/**
* Get agent dynamic config interval
*/
public static int GET_AGENT_DYNAMIC_CONFIG_INTERVAL = 20;
/**
* If true, hippo4j agent will enable periodically resolving DNS to update receiver service addresses.
*/
public static boolean IS_RESOLVE_DNS_PERIODICALLY = false;
}
public static class Profile {
/**
* If true, hippo4j agent will enable profile when user create a new profile task. Otherwise disable
* profile.
*/
public static boolean ACTIVE = true;
/**
* Parallel monitor segment count
*/
public static int MAX_PARALLEL = 5;
/**
* Max monitor segment time(minutes), if current segment monitor time out of limit, then stop it.
*/
public static int MAX_DURATION = 10;
/**
* Max dump thread stack depth
*/
public static int DUMP_MAX_STACK_DEPTH = 500;
/**
* Snapshot transport to backend buffer size
*/
public static int SNAPSHOT_TRANSPORT_BUFFER_SIZE = 500;
}
public static class Meter {
/**
* If true, Hippo4j agent will enable sending meters. Otherwise disable meter report.
*/
public static boolean ACTIVE = true;
/**
* Report meters interval
*/
public static Integer REPORT_INTERVAL = 20;
/**
* Max size of the meter count.
*/
public static Integer MAX_METER_SIZE = 500;
}
public static class Jvm {
/**
* The buffer size of collected JVM info.
*/
public static int BUFFER_SIZE = 60 * 10;
}
public static class Log {
/**
* The max size of message to send to server.Default is 10 MB.
*/
public static int MAX_MESSAGE_SIZE = 10 * 1024 * 1024;
}
public static class Buffer {
public static int CHANNEL_SIZE = 5;
public static int BUFFER_SIZE = 300;
}
public static class Logging {
@ -326,22 +149,6 @@ public class Config {
public static String PATTERN = "%level %timestamp %thread %class : %msg %throwable";
}
public static class StatusCheck {
/**
* Listed exceptions would not be treated as an error. Because in some codes, the exception is being used as a
* way of controlling business flow.
*/
public static String IGNORED_EXCEPTIONS = "";
/**
* The max recursive depth when checking the exception traced by the agent. Typically, we don't recommend
* setting this more than 10, which could cause a performance issue. Negative value and 0 would be ignored,
* which means all exceptions would make the span tagged in error status.
*/
public static Integer MAX_RECURSIVE_DEPTH = 1;
}
public static class Plugin {
/**
@ -385,22 +192,4 @@ public class Config {
}
}
}
public static class Correlation {
/**
* Max element count in the correlation context.
*/
public static int ELEMENT_MAX_NUMBER = 3;
/**
* Max value length of each element.
*/
public static int VALUE_MAX_LENGTH = 128;
/**
* Tag the span by the key/value in the correlation context, when the keys listed here exist.
*/
public static String AUTO_TAG_KEYS = "";
}
}

@ -17,7 +17,7 @@
package cn.hippo4j.agent.adapter.dubbo;
import cn.hippo4j.common.executor.ThreadPoolRegistry;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum;
import cn.hippo4j.common.model.executor.ExecutorProperties;
@ -78,7 +78,7 @@ public class DubboThreadPoolAdapter {
.queueCapacity(executor.getQueue().remainingCapacity())
.rejectedHandler(RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(executor.getRejectedExecutionHandler().getClass().getSimpleName()).getName())
.build();
ThreadPoolRegistry.putHolder(executorName, executor, executorProperties);
ThreadPoolExecutorRegistry.putHolder(executorName, executor, executorProperties);
}
public static String mark() {

@ -28,6 +28,7 @@ import cn.hippo4j.agent.plugin.spring.common.support.SpringThreadPoolRegisterSup
import cn.hippo4j.common.extension.design.AbstractSubjectCenter;
import cn.hippo4j.threadpool.dynamic.api.ThreadPoolDynamicRefresh;
import cn.hippo4j.threadpool.dynamic.mode.config.refresher.event.DynamicThreadPoolRefreshListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ConfigurableApplicationContext;
import java.lang.reflect.Method;
@ -35,6 +36,7 @@ import java.lang.reflect.Method;
/**
* Event publishing started interceptor
*/
@Slf4j
public class EventPublishingStartedInterceptor implements InstanceMethodsAroundInterceptor {
private static final ILog LOGGER = LogManager.getLogger(EventPublishingStartedInterceptor.class);
@ -57,6 +59,7 @@ public class EventPublishingStartedInterceptor implements InstanceMethodsAroundI
dynamicRefresh.registerListener();
AbstractSubjectCenter.register(AbstractSubjectCenter.SubjectType.THREAD_POOL_DYNAMIC_REFRESH,
new DynamicThreadPoolRefreshListener());
return ret;
}

@ -52,6 +52,23 @@ public class SpringBootConfig {
public static List<String> NAMESPACE = Arrays.asList("application");
}
/**
* Monitor
*/
@SpringBootConfigNode(root = SpringBootConfig.class)
public static class Monitor {
public static Boolean enable = Boolean.TRUE;
public static String collectTypes = "micrometer";
public static String threadPoolTypes = "dynamic";
public static Long initialDelay = 10000L;
public static Long collectInterval = 5000L;
}
public static String CONFIG_FILE_TYPE;
}
}

@ -0,0 +1,73 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.hippo4j.agent.plugin.spring.common.define;
import cn.hippo4j.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import cn.hippo4j.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import cn.hippo4j.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import cn.hippo4j.agent.core.plugin.match.ClassMatch;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import static cn.hippo4j.agent.core.plugin.match.NameMatch.byName;
import static net.bytebuddy.matcher.ElementMatchers.named;
public class SpringApplicationInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
private static final String ENHANCE_CLASS = "org.springframework.boot.SpringApplication";
private static final String RUN_INTERCEPTOR = "cn.hippo4j.agent.plugin.spring.common.interceptor.SpringApplicationRunInterceptor";
@Override
protected ClassMatch enhanceClass() {
return byName(ENHANCE_CLASS);
}
@Override
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[0];
}
@Override
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[]{
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("run");
}
@Override
public String getMethodsInterceptor() {
return RUN_INTERCEPTOR;
}
@Override
public boolean isOverrideArgs() {
return false;
}
}
};
}
@Override
protected String[] witnessClasses() {
return new String[]{"org.springframework.boot.SpringApplication"};
}
}

@ -18,9 +18,10 @@
package cn.hippo4j.agent.plugin.spring.common.support;
import cn.hippo4j.agent.core.util.ReflectUtil;
import cn.hippo4j.common.executor.ThreadPoolRegistry;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.common.executor.support.BlockingQueueTypeEnum;
import cn.hippo4j.common.executor.support.RejectedPolicyTypeEnum;
import cn.hippo4j.common.handler.DynamicThreadPoolAdapterChoose;
import cn.hippo4j.common.model.executor.ExecutorProperties;
import cn.hippo4j.common.toolkit.BooleanUtil;
import org.slf4j.Logger;
@ -41,7 +42,7 @@ public class SpringThreadPoolRegisterSupport {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringThreadPoolRegisterSupport.class);
public static void registerThreadPoolInstances(ApplicationContext context) {
Map<ThreadPoolExecutor, Class<?>> referencedClassMap = ThreadPoolRegistry.REFERENCED_CLASS_MAP;
Map<ThreadPoolExecutor, Class<?>> referencedClassMap = ThreadPoolExecutorRegistry.REFERENCED_CLASS_MAP;
for (Map.Entry<ThreadPoolExecutor, Class<?>> entry : referencedClassMap.entrySet()) {
ThreadPoolExecutor enhancedInstance = entry.getKey();
Class<?> declaredClass = entry.getValue();
@ -64,13 +65,12 @@ public class SpringThreadPoolRegisterSupport {
for (Map.Entry<String, Executor> entry : beansWithAnnotation.entrySet()) {
String beanName = entry.getKey();
Executor bean = entry.getValue();
ThreadPoolExecutor executor = (ThreadPoolExecutor) bean;
// TODO
// if (DynamicThreadPoolAdapterChoose.match(bean)) {
// executor = DynamicThreadPoolAdapterChoose.unwrap(bean);
// } else {
// executor = (ThreadPoolExecutor) bean;
// }
ThreadPoolExecutor executor;
if (DynamicThreadPoolAdapterChoose.match(bean)) {
executor = DynamicThreadPoolAdapterChoose.unwrap(bean);
} else {
executor = (ThreadPoolExecutor) bean;
}
if (executor == null) {
LOGGER.warn("[Hippo4j-Agent] Thread pool is null, ignore bean registration. beanName={}, beanClass={}", beanName, bean.getClass().getName());
} else {
@ -93,6 +93,6 @@ public class SpringThreadPoolRegisterSupport {
.queueCapacity(executor.getQueue().remainingCapacity())
.rejectedHandler(RejectedPolicyTypeEnum.getRejectedPolicyTypeEnumByName(executor.getRejectedExecutionHandler().getClass().getSimpleName()).getName())
.build();
ThreadPoolRegistry.putHolder(threadPoolId, executor, executorProperties);
ThreadPoolExecutorRegistry.putHolder(threadPoolId, executor, executorProperties);
}
}

@ -22,7 +22,7 @@ import cn.hippo4j.agent.core.logging.api.ILog;
import cn.hippo4j.agent.core.logging.api.LogManager;
import cn.hippo4j.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import cn.hippo4j.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
import cn.hippo4j.common.executor.ThreadPoolRegistry;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.agent.core.util.CollectionUtil;
import cn.hippo4j.agent.core.util.StringUtil;
import java.util.ArrayList;
@ -52,7 +52,7 @@ public class ThreadPoolExecutorConstructorMethodInterceptor implements InstanceC
StackTraceElement declaredClassStackTraceElement = stackTraceElements.get(0);
String declaredClassName = declaredClassStackTraceElement.getClassName();
Class<?> declaredClass = Thread.currentThread().getContextClassLoader().loadClass(declaredClassName);
ThreadPoolRegistry.REFERENCED_CLASS_MAP.put((ThreadPoolExecutor) objInst, declaredClass);
ThreadPoolExecutorRegistry.REFERENCED_CLASS_MAP.put((ThreadPoolExecutor) objInst, declaredClass);
}
private List<StackTraceElement> getStackTraceElements() {

@ -39,6 +39,10 @@ mvn clean package -Dskip.spotless.apply=true
# 进入到 docker 工程路径下
# 默认打包是打包的 tag 是 latest
docker build -t hippo4j/hippo4j-server ../docker
# 构建多平台版本
docker buildx build --platform linux/arm64 -t hippo4j/hippo4j-server ../docker
docker buildx build --platform linux/amd64 -t hippo4j/hippo4j-server ../docker
```
方式二:

@ -1,49 +1,49 @@
// @ts-check
// Note: type annotations allow type checking and IDEs autocompletion
const lightCodeTheme = require('prism-react-renderer/themes/github');
const darkCodeTheme = require('prism-react-renderer/themes/dracula');
const lightCodeTheme = require("prism-react-renderer/themes/github");
const darkCodeTheme = require("prism-react-renderer/themes/dracula");
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'Hippo4j',
tagline: '动态可观测线程池框架,为业务系统提高线上运行保障能力',
url: 'https://hippo4j.cn',
baseUrl: '/',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
favicon: 'img/hippo4j_favicon.ico',
title: "Hippo4j",
tagline: "动态可观测线程池框架,为业务系统提高线上运行保障能力",
url: "https://hippo4j.cn",
baseUrl: "/",
onBrokenLinks: "throw",
onBrokenMarkdownLinks: "warn",
favicon: "img/hippo4j_favicon.ico",
// GitHub pages deployment config.
// If you aren't using GitHub pages, you don't need these.
organizationName: 'hippo4j', // Usually your GitHub org/user name.
projectName: 'hippo4j.github.io', // Usually your repo name.
deploymentBranch: 'main',
organizationName: "hippo4j", // Usually your GitHub org/user name.
projectName: "hippo4j.github.io", // Usually your repo name.
deploymentBranch: "main",
// Even if you don't use internalization, you can use this field to set useful
// metadata like html lang. For example, if your site is Chinese, you may want
// to replace "en" with "zh-Hans".
i18n: {
defaultLocale: 'en',
locales: ['en', 'zh'],
defaultLocale: "zh",
locales: ["en", "zh"],
localeConfigs: {
en: {
label: 'English',
direction: 'ltr',
label: "English",
direction: "ltr",
},
zh: {
label: '简体中文',
direction: 'ltr',
label: "简体中文",
direction: "ltr",
},
},
},
presets: [
[
'classic',
"classic",
/** @type {import('@docusaurus/preset-classic').Options} */
({
docs: {
sidebarPath: require.resolve('./sidebars.js'),
sidebarPath: require.resolve("./sidebars.js"),
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
sidebarCollapsed: false,
@ -54,10 +54,10 @@ const config = {
// Please change this to your repo.
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/",
},
theme: {
customCss: require.resolve('./src/css/custom.css'),
customCss: require.resolve("./src/css/custom.css"),
},
}),
],
@ -65,14 +65,25 @@ const config = {
plugins: [
[
'@docusaurus/plugin-content-docs',
"@docusaurus/plugin-content-docs",
{
id: 'community',
path: 'community',
routeBasePath: 'community',
sidebarPath: require.resolve('./sidebarsCommunity.js'),
id: "community",
path: "community",
routeBasePath: "community",
sidebarPath: require.resolve("./sidebarsCommunity.js"),
},
],
async function myPlugin(context, options) {
return {
name: "docusaurus-tailwindcss",
configurePostCss(postcssOptions) {
// Appends TailwindCSS and AutoPrefixer.
postcssOptions.plugins.push(require("tailwindcss"));
postcssOptions.plugins.push(require("autoprefixer"));
return postcssOptions;
},
};
},
],
themeConfig:
@ -80,139 +91,135 @@ const config = {
({
autoCollapseCategories: true,
announcementBar: {
id: 'announcementBar-1', // Increment on change
id: "announcementBar-1", // Increment on change
// content: `⭐️ If you like hippo4j, give it a star on <a target="_blank" rel="noopener noreferrer" href="https://gitee.com/mabaiwancn/hippo4j">Gitee</a>, thanks.`,
// content: `⭐️ 如果您喜欢 hippo4j请在 <a target="_blank" rel="noopener noreferrer" href="https://gitee.com/mabaiwancn/hippo4j">Gitee</a> 和 <a target="_blank" rel="noopener noreferrer" href="https://github.com/opengoofy/hippo4j">GitHub</a> 上给它一个 star谢谢`,
content: `⭐️ 开源不易,如果 Hippo4j 对您有帮助,请在 <a target="_blank" rel="noopener noreferrer" href="https://github.com/opengoofy/hippo4j">GitHub</a> 上给它一个 Star 🌟`,
// content: `<a target="_blank" rel="noopener noreferrer" href="https://xiaomage.info/knowledge-planet/">👉 《小马哥的代码实战课》官方知识星球来啦!!!</a>`,
},
navbar: {
title: '',
title: "",
logo: {
alt: 'Hippo4j 动态可观测线程池框架',
src: 'img/hippo4j.png',
alt: "Hippo4j 动态可观测线程池框架",
src: "img/hippo4j.png",
},
items: [
{
type: 'docSidebar',
docId: 'intro',
position: 'left',
sidebarId: 'user_docs',
label: '文档',
type: "docSidebar",
docId: "intro",
position: "left",
sidebarId: "user_docs",
label: "文档",
},
{
to: '/community/contributor-guide',
label: '社区',
position: 'left',
to: "/community/contributor-guide",
label: "社区",
position: "left",
activeBaseRegex: `/community/`,
},
/*{ to: "/team", label: "团队", position: "left" },*/
{ to: '/users', label: '采用公司', position: 'left' },
{ to: '/group', label: '加群沟通', position: 'left' },
{ to: "/users", label: "采用公司", position: "left" },
{ to: "/group", label: "加群沟通", position: "left" },
/*{to: '/blog', label: '博客', position: 'left'},*/
{
href: 'http://console.hippo4j.cn/index.html',
label: '控制台样例',
position: 'left',
href: "http://console.hippo4j.cn/index.html",
label: "控制台样例",
position: "left",
},
{
href: 'https://gitee.com/opengoofy/congomall',
label: '👉 刚果商城',
position: 'left',
href: "https://magestack.cn",
label: "🚀 拿个offer",
position: "left",
},
{
type: 'docsVersionDropdown',
position: 'right',
type: "docsVersionDropdown",
position: "right",
dropdownActiveClassDisabled: true,
},
{ type: 'localeDropdown', position: 'right' },
{ type: "localeDropdown", position: "right" },
/*{
href: 'https://gitee.com/mabaiwancn/hippo4j',
label: 'Gitee',
position: 'right',
},*/
href: 'https://gitee.com/mabaiwancn/hippo4j',
label: 'Gitee',
position: 'right',
},*/
{
href: 'https://github.com/opengoofy/hippo4j',
className: 'header-github-link',
'aria-label': 'GitHub repository',
position: 'right',
href: "https://github.com/opengoofy/hippo4j",
className: "header-github-link",
"aria-label": "GitHub repository",
position: "right",
},
/*{
href: 'https://github.com/opengoofy/hippo4j',
label: 'GitHub',
position: 'right',
},*/
href: 'https://github.com/opengoofy/hippo4j',
label: 'GitHub',
position: 'right',
},*/
],
},
footer: {
style: 'dark',
style: "dark",
links: [
{
title: 'Docs',
title: "Docs",
items: [
{
label: 'Intro',
to: '/docs/user_docs/intro',
label: "Intro",
to: "/docs/user_docs/intro",
},
{
label: 'Config Mode',
to: '/docs/user_docs/getting_started/config/hippo4j-config-start',
label: "Config Mode",
to: "/docs/user_docs/getting_started/config/hippo4j-config-start",
},
{
label: 'Server Mode',
to: '/docs/user_docs/getting_started/server/hippo4j-server-start',
label: "Server Mode",
to: "/docs/user_docs/getting_started/server/hippo4j-server-start",
},
],
},
{
title: 'Community',
title: "Community",
items: [
{
label: 'Group',
href: 'https://hippo4j.cn/group',
label: "Group",
href: "https://hippo4j.cn/group",
},
{
label: 'WeChat',
href: 'https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g',
label: "WeChat",
href: "https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g",
},
],
},
{
title: 'More',
title: "More",
items: [
{
label: 'Gitee',
href: 'https://gitee.com/opengoofy/hippo4j',
label: "Gitee",
href: "https://gitee.com/opengoofy/hippo4j",
},
{
label: 'GitHub',
href: 'https://github.com/opengoofy/hippo4j',
label: "GitHub",
href: "https://github.com/opengoofy/hippo4j",
},
],
},
{
title: 'Links',
title: "Links",
items: [
{
label: '书源',
href: 'https://bookyuan.cn/',
},
{
label: '推广合作',
href: 'https://hippo4j.cn/docs/user_docs/other/operation',
label: "推广合作",
href: "https://hippo4j.cn/docs/user_docs/other/operation",
},
],
},
],
copyright: `Copyright © 2021-2022 马丁版权所有 <a href="https://beian.miit.gov.cn">京ICP备2021038095号
copyright: `Copyright © 2021-2023 马丁版权所有 <a href="https://beian.miit.gov.cn">京ICP备2021038095号
</a>`,
},
prism: {
theme: lightCodeTheme,
darkTheme: darkCodeTheme,
additionalLanguages: ['java'],
additionalLanguages: ["java"],
},
}),
};

@ -0,0 +1,297 @@
{
"homepage.titleDescription1": {
"message": "Thread Pool Framework For Java",
"description": "The homepage title description"
},
"homepage.titleDescription2": {
"message": "Enhancing the Operational Assurance Capability for Business Systems Online.",
"description": "The homepage title description"
},
"homepage.startButton": {
"message": "Quick Start",
"description": "The homepage start button text"
},
"homepage.secondTitle": {
"message": "What can Hippo4j do?",
"description": "a title for introduciton part"
},
"homepage.introduction.fristPartTitle": {
"message": "Dynamic Change",
"description": "the title for the first introduction part"
},
"homepage.introduction.fristPartDesc": {
"message": "Application runtime dynamically changes thread pool parameters, including but not limited to core size, maximum threads, blocking queue size, and rejection policy. It supports differentiated thread pool configurations for different nodes in the application cluster.",
"description": "the desc for the first introduction part"
},
"homepage.introduction.secondPartTitle": {
"message": "Custom Alarm",
"description": "the title for the second introduction part"
},
"homepage.introduction.secondPartDesc": {
"message": "Application thread pool runtime point, providing four alarm dimensions: thread pool overload, blocking queue capacity, running for too long, and rejection strategy alarm. It also supports non-repetitive alarms within a custom time period.",
"description": "the desc for the second introduction part"
},
"homepage.introduction.thirdPartTitle": {
"message": "Operation Monitoring",
"description": "the title for the third introduction part"
},
"homepage.introduction.thirdPartDesc": {
"message": "Supports custom duration thread pool for data collection and storage, while also supporting Prometheus, InfluxDB, and other monitoring systems. Provides visualized dashboard monitoring metrics through Grafana or built-in monitoring pages.",
"description": "the desc for the third introduction part"
},
"theme.ErrorPageContent.title": {
"message": "This page crashed.",
"description": "The title of the fallback page when the page crashed"
},
"theme.ErrorPageContent.tryAgain": {
"message": "Try again",
"description": "The label of the button to try again when the page crashed"
},
"theme.NotFound.title": {
"message": "Page Not Found",
"description": "The title of the 404 page"
},
"theme.NotFound.p1": {
"message": "We could not find what you were looking for.",
"description": "The first paragraph of the 404 page"
},
"theme.NotFound.p2": {
"message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.",
"description": "The 2nd paragraph of the 404 page"
},
"theme.blog.archive.title": {
"message": "Archive",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "Archive",
"description": "The page & hero description of the blog archive page"
},
"theme.blog.paginator.navAriaLabel": {
"message": "Blog list page navigation",
"description": "The ARIA label for the blog pagination"
},
"theme.blog.paginator.newerEntries": {
"message": "Newer Entries",
"description": "The label used to navigate to the newer blog posts page (previous page)"
},
"theme.blog.paginator.olderEntries": {
"message": "Older Entries",
"description": "The label used to navigate to the older blog posts page (next page)"
},
"theme.admonition.note": {
"message": "note",
"description": "The default label used for the Note admonition (:::note)"
},
"theme.admonition.tip": {
"message": "tip",
"description": "The default label used for the Tip admonition (:::tip)"
},
"theme.admonition.danger": {
"message": "danger",
"description": "The default label used for the Danger admonition (:::danger)"
},
"theme.admonition.info": {
"message": "info",
"description": "The default label used for the Info admonition (:::info)"
},
"theme.admonition.caution": {
"message": "caution",
"description": "The default label used for the Caution admonition (:::caution)"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "Scroll back to top",
"description": "The ARIA label for the back to top button"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "Blog post page navigation",
"description": "The ARIA label for the blog posts pagination"
},
"theme.blog.post.paginator.newerPost": {
"message": "Newer Post",
"description": "The blog post button label to navigate to the newer/previous post"
},
"theme.blog.post.paginator.olderPost": {
"message": "Older Post",
"description": "The blog post button label to navigate to the older/next post"
},
"theme.blog.post.plurals": {
"message": "One post|{count} posts",
"description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.tagTitle": {
"message": "{nPosts} tagged with \"{tagName}\"",
"description": "The title of the page for a blog tag"
},
"theme.tags.tagsPageLink": {
"message": "View All Tags",
"description": "The label of the link targeting the tag list page"
},
"theme.colorToggle.ariaLabel": {
"message": "Switch between dark and light mode (currently {mode})",
"description": "The ARIA label for the navbar color mode toggle"
},
"theme.colorToggle.ariaLabel.mode.dark": {
"message": "dark mode",
"description": "The name for the dark color mode"
},
"theme.colorToggle.ariaLabel.mode.light": {
"message": "light mode",
"description": "The name for the light color mode"
},
"theme.docs.breadcrumbs.home": {
"message": "Home page",
"description": "The ARIA label for the home page in the breadcrumbs"
},
"theme.docs.breadcrumbs.navAriaLabel": {
"message": "Breadcrumbs",
"description": "The ARIA label for the breadcrumbs"
},
"theme.docs.DocCard.categoryDescription": {
"message": "{count} items",
"description": "The default description for a category card in the generated index about how many items this category includes"
},
"theme.docs.paginator.navAriaLabel": {
"message": "Docs pages navigation",
"description": "The ARIA label for the docs pagination"
},
"theme.docs.paginator.previous": {
"message": "Previous",
"description": "The label used to navigate to the previous doc"
},
"theme.docs.paginator.next": {
"message": "Next",
"description": "The label used to navigate to the next doc"
},
"theme.docs.tagDocListPageTitle.nDocsTagged": {
"message": "One doc tagged|{count} docs tagged",
"description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.tagDocListPageTitle": {
"message": "{nDocsTagged} with \"{tagName}\"",
"description": "The title of the page for a docs tag"
},
"theme.docs.versionBadge.label": {
"message": "Version: {versionLabel}"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "This is unreleased documentation for {siteTitle} {versionLabel} version.",
"description": "The label used to tell the user that he's browsing an unreleased doc version"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.",
"description": "The label used to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).",
"description": "The label used to tell the user to check the latest version"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "latest version",
"description": "The label used for the latest version suggestion link label"
},
"theme.common.editThisPage": {
"message": "Edit this page",
"description": "The link label to edit the current page"
},
"theme.common.headingLinkTitle": {
"message": "Direct link to heading",
"description": "Title for link to heading"
},
"theme.lastUpdated.atDate": {
"message": " on {date}",
"description": "The words used to describe on which date a page has been last updated"
},
"theme.lastUpdated.byUser": {
"message": " by {user}",
"description": "The words used to describe by who the page has been last updated"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "Last updated{atDate}{byUser}",
"description": "The sentence used to display when a page has been last updated, and by who"
},
"theme.navbar.mobileVersionsDropdown.label": {
"message": "Versions",
"description": "The label for the navbar versions dropdown on mobile view"
},
"theme.common.skipToMainContent": {
"message": "Skip to main content",
"description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
},
"theme.tags.tagsListLabel": {
"message": "Tags:",
"description": "The label alongside a tag list"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "Close",
"description": "The ARIA label for close button of announcement bar"
},
"theme.blog.sidebar.navAriaLabel": {
"message": "Blog recent posts navigation",
"description": "The ARIA label for recent posts in the blog sidebar"
},
"theme.CodeBlock.copied": {
"message": "Copied",
"description": "The copied button label on code blocks"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "Copy code to clipboard",
"description": "The ARIA label for copy code blocks button"
},
"theme.CodeBlock.copy": {
"message": "Copy",
"description": "The copy button label on code blocks"
},
"theme.CodeBlock.wordWrapToggle": {
"message": "Toggle word wrap",
"description": "The title attribute for toggle word wrapping button of code block lines"
},
"theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": {
"message": "Toggle the collapsible sidebar category '{label}'",
"description": "The ARIA label to toggle the collapsible sidebar category"
},
"theme.navbar.mobileLanguageDropdown.label": {
"message": "Languages",
"description": "The label for the mobile language switcher dropdown"
},
"theme.TOCCollapsible.toggleButtonLabel": {
"message": "On this page",
"description": "The label used by the button on the collapsible TOC component"
},
"theme.blog.post.readMore": {
"message": "Read More",
"description": "The label used in blog post item excerpts to link to full blog posts"
},
"theme.blog.post.readMoreLabel": {
"message": "Read more about {title}",
"description": "The ARIA label for the link to full blog posts from excerpts"
},
"theme.blog.post.readingTime.plurals": {
"message": "One min read|{readingTime} min read",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "Collapse sidebar",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "Collapse sidebar",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
"message": "← Back to main menu",
"description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "Expand sidebar",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "Expand sidebar",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.tags.tagsPageTitle": {
"message": "Tags",
"description": "The title of the tag list page"
}
}

@ -0,0 +1,14 @@
{
"title": {
"message": "Blog",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Recent posts",
"description": "The label for the left sidebar"
}
}

@ -0,0 +1,10 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.community.category.贡献规约": {
"message": "贡献规约",
"description": "The label for category 贡献规约 in sidebar community"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.4.2",
"description": "The label for version 1.4.2"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.4.3",
"description": "The label for version 1.4.3"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.5.0",
"description": "The label for version 1.5.0"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,54 @@
{
"link.title.Docs": {
"message": "Docs",
"description": "The title of the footer links column with title=Docs in the footer"
},
"link.title.Community": {
"message": "Community",
"description": "The title of the footer links column with title=Community in the footer"
},
"link.title.More": {
"message": "More",
"description": "The title of the footer links column with title=More in the footer"
},
"link.title.Links": {
"message": "Links",
"description": "The title of the footer links column with title=Links in the footer"
},
"link.item.label.Intro": {
"message": "Intro",
"description": "The label of footer link with label=Intro linking to /docs/user_docs/intro"
},
"link.item.label.Config Mode": {
"message": "Config Mode",
"description": "The label of footer link with label=Config Mode linking to /docs/user_docs/getting_started/config/hippo4j-config-start"
},
"link.item.label.Server Mode": {
"message": "Server Mode",
"description": "The label of footer link with label=Server Mode linking to /docs/user_docs/getting_started/server/hippo4j-server-start"
},
"link.item.label.Group": {
"message": "Group",
"description": "The label of footer link with label=Group linking to https://hippo4j.cn/group"
},
"link.item.label.WeChat": {
"message": "WeChat",
"description": "The label of footer link with label=WeChat linking to https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g"
},
"link.item.label.Gitee": {
"message": "Gitee",
"description": "The label of footer link with label=Gitee linking to https://gitee.com/opengoofy/hippo4j"
},
"link.item.label.GitHub": {
"message": "GitHub",
"description": "The label of footer link with label=GitHub linking to https://github.com/opengoofy/hippo4j"
},
"link.item.label.推广合作": {
"message": "推广合作",
"description": "The label of footer link with label=推广合作 linking to https://hippo4j.cn/docs/user_docs/other/operation"
},
"copyright": {
"message": "Copyright © 2021-2023 马丁版权所有 <a href=\"https://beian.miit.gov.cn\">京ICP备2021038095号\n</a>",
"description": "The footer copyright"
}
}

@ -0,0 +1,26 @@
{
"item.label.文档": {
"message": "Docs",
"description": "Navbar item with label 文档"
},
"item.label.社区": {
"message": "Community",
"description": "Navbar item with label 社区"
},
"item.label.采用公司": {
"message": "Users",
"description": "Navbar item with label 采用公司"
},
"item.label.加群沟通": {
"message": "Communication",
"description": "Navbar item with label 加群沟通"
},
"item.label.控制台样例": {
"message": "Example",
"description": "Navbar item with label 控制台样例"
},
"item.label.🚀 拿个offer": {
"message": "🚀 GetOffer",
"description": "Navbar item with label 🚀 拿个offer"
}
}

@ -256,5 +256,61 @@
},
"Community": {
"message": "社区"
},
"homepage.titleDescription1": {
"message": "Java线程池框架",
"description": "The homepage title description"
},
"homepage.titleDescription2": {
"message": "动态可观测线程池框架,为业务系统提高线上运行保障能力。",
"description": "The homepage title description"
},
"homepage.startButton": {
"message": "快速开始",
"description": "The homepage start button text"
},
"homepage.secondTitle": {
"message": "Hippo4j能做什么",
"description": "a title for introduciton part"
},
"homepage.introduction.fristPartTitle": {
"message": "动态变更",
"description": "the title for the first introduction part"
},
"homepage.introduction.fristPartDesc": {
"message": "应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化",
"description": "the desc for the first introduction part"
},
"homepage.introduction.secondPartTitle": {
"message": "自定义报警",
"description": "the title for the second introduction part"
},
"homepage.introduction.secondPartDesc": {
"message": "应用线程池运行时埋点,提供四种报警维度,线程池过载、阻塞队列容量、运行超长以及拒绝策略报警,并支持自定义时间内不重复报警",
"description": "the desc for the second introduction part"
},
"homepage.introduction.thirdPartTitle": {
"message": "运行监控",
"description": "the title for the third introduction part"
},
"homepage.introduction.thirdPartDesc": {
"message": "支持自定义时长线程池运行数据采集存储,同时也支持 Prometheus、InfluxDB 等采集监控,通过 Grafana 或内置监控页面提供可视化大屏监控运行指标",
"description": "the desc for the third introduction part"
},
"companyPage.title": {
"message": "谁在使用 Hippo4j ?",
"description": "the title for the company page"
},
"companyPage.descriptionText": {
"message": "非常感谢大家对 Hippo4j 的关注和支持,这是我们前进最大的动力。",
"description": "the description for the company page"
},
"companyPage.questionText": {
"message": "正在使用Hippo4j ?",
"description": "the text for the company question"
},
"companyPage.linkText": {
"message": "点击进行登记",
"description": "the text for the company page link"
}
}

@ -39,6 +39,10 @@ mvn clean package -Dskip.spotless.apply=true
# 进入到 docker 工程路径下
# 默认打包是打包的 tag 是 latest
docker build -t hippo4j/hippo4j-server ../docker
# 构建多平台版本
docker buildx build --platform linux/arm64 -t hippo4j/hippo4j-server ../docker
docker buildx build --platform linux/amd64 -t hippo4j/hippo4j-server ../docker
```
方式二:

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.4.2",
"description": "The label for version 1.4.2"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.4.3",
"description": "The label for version 1.4.3"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -0,0 +1,82 @@
{
"version.label": {
"message": "1.5.0",
"description": "The label for version 1.5.0"
},
"sidebar.tutorialSidebar.category.user_docs": {
"message": "user_docs",
"description": "The label for category user_docs in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar tutorialSidebar"
},
"sidebar.tutorialSidebar.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar tutorialSidebar"
},
"sidebar.user_docs.category.用户指南": {
"message": "用户指南",
"description": "The label for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.用户指南.link.generated-index.description": {
"message": "帮助想要了解 Hippo4j 的用户快速掌握核心开发理念。",
"description": "The generated-index page description for category 用户指南 in sidebar user_docs"
},
"sidebar.user_docs.category.快速开始": {
"message": "快速开始",
"description": "The label for category 快速开始 in sidebar user_docs"
},
"sidebar.user_docs.category.依赖配置中心": {
"message": "依赖配置中心",
"description": "The label for category 依赖配置中心 in sidebar user_docs"
},
"sidebar.user_docs.category.无中间件依赖": {
"message": "无中间件依赖",
"description": "The label for category 无中间件依赖 in sidebar user_docs"
},
"sidebar.user_docs.category.运维指南": {
"message": "运维指南",
"description": "The label for category 运维指南 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册": {
"message": "开发者手册",
"description": "The label for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.开发者手册.link.generated-index.description": {
"message": "Hippo4j 留给使用者能够扩展的知识点。",
"description": "The generated-index page description for category 开发者手册 in sidebar user_docs"
},
"sidebar.user_docs.category.其它": {
"message": "其它",
"description": "The label for category 其它 in sidebar user_docs"
}
}

@ -1,16 +0,0 @@
---
sidebar_position: 1
title: 加群沟通
---
## 关注公众号
如果大家想要实时关注 Hippo4j 更新的文章以及分享的干货的话,可以关注我的公众号。
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20230317191041262-mini.png)
## 加群沟通
使用过程中有任何问题,或者对项目有什么建议,关注公众号回复:加群,和 1000+ 志同道合的朋友交流讨论。
![](https://images-machen.oss-cn-beijing.aliyuncs.com/image-20230411000121790.png)

@ -1,7 +0,0 @@
---
title: Markdown page example
---
# Markdown page example
You don't need React to write simple standalone pages.

@ -25,7 +25,7 @@
},
"link.item.label.Gitee": {
"message": "Gitee",
"description": "The label of footer link with label=Gitee linking to https://gitee.com/itmachen/hippo4j"
"description": "The label of footer link with label=Gitee linking to https://gitee.com/opengoofy/hippo4j"
},
"link.item.label.GitHub": {
"message": "GitHub",
@ -38,5 +38,33 @@
"copyright": {
"message": "Copyright © 2021-2022 小马哥版权所有 <a href=\"https://beian.miit.gov.cn\">京ICP备2021038095号-2\n</a>",
"description": "The footer copyright"
},
"link.title.Links": {
"message": "Links",
"description": "The title of the footer links column with title=Links in the footer"
},
"link.item.label.Intro": {
"message": "Intro",
"description": "The label of footer link with label=Intro linking to /docs/user_docs/intro"
},
"link.item.label.Config Mode": {
"message": "Config Mode",
"description": "The label of footer link with label=Config Mode linking to /docs/user_docs/getting_started/config/hippo4j-config-start"
},
"link.item.label.Server Mode": {
"message": "Server Mode",
"description": "The label of footer link with label=Server Mode linking to /docs/user_docs/getting_started/server/hippo4j-server-start"
},
"link.item.label.Group": {
"message": "Group",
"description": "The label of footer link with label=Group linking to https://hippo4j.cn/group"
},
"link.item.label.WeChat": {
"message": "WeChat",
"description": "The label of footer link with label=WeChat linking to https://mp.weixin.qq.com/s/diVHYvwiuYH9aWpZDPc27g"
},
"link.item.label.推广合作": {
"message": "推广合作",
"description": "The label of footer link with label=推广合作 linking to https://hippo4j.cn/docs/user_docs/other/operation"
}
}

@ -18,5 +18,17 @@
"item.label.🥇代码实战课": {
"message": "🥇代码实战课",
"description": "Navbar item with label 🥇代码实战课"
},
"item.label.采用公司": {
"message": "采用公司",
"description": "Navbar item with label 采用公司"
},
"item.label.加群沟通": {
"message": "加群沟通",
"description": "Navbar item with label 加群沟通"
},
"item.label.🚀 拿个offer": {
"message": "🚀 拿个offer",
"description": "Navbar item with label 🚀 拿个offer"
}
}

@ -10,11 +10,16 @@
"dependencies": {
"@docusaurus/core": "2.1.0",
"@docusaurus/preset-classic": "2.1.0",
"@iconify-icons/logos": "^1.2.31",
"@iconify/react": "^4.1.0",
"@mdx-js/react": "^1.6.22",
"autoprefixer": "^10.4.14",
"clsx": "^1.1.1",
"postcss": "^8.4.23",
"prism-react-renderer": "^1.3.3",
"react": "^17.0.2",
"react-dom": "^17.0.2"
"react-dom": "^17.0.2",
"tailwindcss": "^3.3.2"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.1.0"
@ -165,6 +170,17 @@
"@algolia/requester-common": "4.17.0"
}
},
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
@ -2534,6 +2550,33 @@
"@hapi/hoek": "^9.0.0"
}
},
"node_modules/@iconify-icons/logos": {
"version": "1.2.34",
"resolved": "https://registry.npmjs.org/@iconify-icons/logos/-/logos-1.2.34.tgz",
"integrity": "sha512-WbzJemIKsEt5/fVP7lmpsaFSXV8Wg5L8BngZpqInFWc5nxSaQvtSjHBWPQOQQ7cVr8T5di6wwJWWEdCBXP6hpw==",
"dependencies": {
"@iconify/types": "*"
}
},
"node_modules/@iconify/react": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz",
"integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==",
"dependencies": {
"@iconify/types": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/cyberalien"
},
"peerDependencies": {
"react": ">=16"
}
},
"node_modules/@iconify/types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
},
"node_modules/@jest/schemas": {
"version": "29.4.3",
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
@ -3735,6 +3778,11 @@
"node": ">=4"
}
},
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
},
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@ -5527,6 +5575,11 @@
"detect-port": "bin/detect-port.js"
}
},
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
},
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@ -5538,6 +5591,11 @@
"node": ">=8"
}
},
"node_modules/dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"node_modules/dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@ -8101,6 +8159,16 @@
"multicast-dns": "cli.js"
}
},
"node_modules/mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@ -8242,6 +8310,14 @@
"node": ">=0.10.0"
}
},
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
@ -8629,6 +8705,22 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pirates": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"engines": {
"node": ">= 6"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@ -8822,6 +8914,76 @@
"postcss": "^8.2.15"
}
},
"node_modules/postcss-import": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.4.21"
}
},
"node_modules/postcss-load-config": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
"integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
"dependencies": {
"lilconfig": "^2.0.5",
"yaml": "^2.1.1"
},
"engines": {
"node": ">= 14"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-load-config/node_modules/yaml": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
"integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==",
"engines": {
"node": ">= 14"
}
},
"node_modules/postcss-loader": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz",
@ -9023,6 +9185,24 @@
"postcss": "^8.1.0"
}
},
"node_modules/postcss-nested": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
"integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
"dependencies": {
"postcss-selector-parser": "^6.0.11"
},
"engines": {
"node": ">=12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-normalize-charset": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
@ -9826,6 +10006,14 @@
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@ -11057,6 +11245,54 @@
"postcss": "^8.2.15"
}
},
"node_modules/sucrase": {
"version": "3.34.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
"integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
"glob": "7.1.6",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
"ts-interface-checker": "^0.1.9"
},
"bin": {
"sucrase": "bin/sucrase",
"sucrase-node": "bin/sucrase-node"
},
"engines": {
"node": ">=8"
}
},
"node_modules/sucrase/node_modules/commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"engines": {
"node": ">= 6"
}
},
"node_modules/sucrase/node_modules/glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@ -11112,6 +11348,53 @@
"node": ">= 10"
}
},
"node_modules/tailwindcss": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
"integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.18.2",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.23",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
"postcss-load-config": "^4.0.1",
"postcss-nested": "^6.0.1",
"postcss-selector-parser": "^6.0.11",
"resolve": "^1.22.2",
"sucrase": "^3.32.0"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tailwindcss/node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@ -11180,6 +11463,25 @@
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
},
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"dependencies": {
"any-promise": "^1.0.0"
}
},
"node_modules/thenify-all": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@ -11267,6 +11569,11 @@
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
},
"node_modules/tslib": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
@ -12574,6 +12881,11 @@
"@algolia/requester-common": "4.17.0"
}
},
"@alloc/quick-lru": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="
},
"@ampproject/remapping": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
@ -14218,6 +14530,27 @@
"@hapi/hoek": "^9.0.0"
}
},
"@iconify-icons/logos": {
"version": "1.2.34",
"resolved": "https://registry.npmjs.org/@iconify-icons/logos/-/logos-1.2.34.tgz",
"integrity": "sha512-WbzJemIKsEt5/fVP7lmpsaFSXV8Wg5L8BngZpqInFWc5nxSaQvtSjHBWPQOQQ7cVr8T5di6wwJWWEdCBXP6hpw==",
"requires": {
"@iconify/types": "*"
}
},
"@iconify/react": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz",
"integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==",
"requires": {
"@iconify/types": "^2.0.0"
}
},
"@iconify/types": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
},
"@jest/schemas": {
"version": "29.4.3",
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
@ -15174,6 +15507,11 @@
"color-convert": "^1.9.0"
}
},
"any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
},
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@ -16419,6 +16757,11 @@
"debug": "4"
}
},
"didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
},
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@ -16427,6 +16770,11 @@
"path-type": "^4.0.0"
}
},
"dlv": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
},
"dns-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
@ -18299,6 +18647,16 @@
"thunky": "^1.0.2"
}
},
"mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"requires": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@ -18390,6 +18748,11 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
},
"object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="
},
"object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
@ -18666,6 +19029,16 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
},
"pirates": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="
},
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
@ -18785,6 +19158,40 @@
"postcss-selector-parser": "^6.0.5"
}
},
"postcss-import": {
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"requires": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
}
},
"postcss-js": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"requires": {
"camelcase-css": "^2.0.1"
}
},
"postcss-load-config": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
"integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
"requires": {
"lilconfig": "^2.0.5",
"yaml": "^2.1.1"
},
"dependencies": {
"yaml": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz",
"integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg=="
}
}
},
"postcss-loader": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz",
@ -18906,6 +19313,14 @@
"icss-utils": "^5.0.0"
}
},
"postcss-nested": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz",
"integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==",
"requires": {
"postcss-selector-parser": "^6.0.11"
}
},
"postcss-normalize-charset": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz",
@ -19469,6 +19884,14 @@
"use-latest": "^1.2.1"
}
},
"read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
"requires": {
"pify": "^2.3.0"
}
},
"readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@ -20408,6 +20831,40 @@
"postcss-selector-parser": "^6.0.4"
}
},
"sucrase": {
"version": "3.34.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
"integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
"requires": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
"glob": "7.1.6",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
"ts-interface-checker": "^0.1.9"
},
"dependencies": {
"commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
},
"glob": {
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
}
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@ -20447,6 +20904,45 @@
}
}
},
"tailwindcss": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz",
"integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==",
"requires": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.2.12",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.18.2",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.23",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
"postcss-load-config": "^4.0.1",
"postcss-nested": "^6.0.1",
"postcss-selector-parser": "^6.0.11",
"resolve": "^1.22.2",
"sucrase": "^3.32.0"
},
"dependencies": {
"glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"requires": {
"is-glob": "^4.0.3"
}
}
}
},
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@ -20487,6 +20983,22 @@
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
},
"thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"requires": {
"any-promise": "^1.0.0"
}
},
"thenify-all": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"requires": {
"thenify": ">= 3.1.0 < 4"
}
},
"thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@ -20550,6 +21062,11 @@
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
"integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
},
"ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
},
"tslib": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",

@ -20,7 +20,13 @@
"clsx": "^1.1.1",
"prism-react-renderer": "^1.3.3",
"react": "^17.0.2",
"react-dom": "^17.0.2"
"react-dom": "^17.0.2",
"autoprefixer": "^10.4.14",
"tailwindcss": "^3.3.2",
"postcss": "^8.4.23",
"@iconify-icons/logos": "^1.2.31",
"@iconify/react": "^4.1.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.1.0"

@ -0,0 +1,52 @@
import React from "react";
import useGithubInfo from "./useGithubInfo";
const GithubInfo = ({ owner, repo }) => {
const { favorites, language, forks, license } = useGithubInfo(owner, repo);
return (
<div className="github-info-container w-full md:justify-normal mb-4 justify-center gap-2 flex flex-wrap items-center">
<div className="flex items-center">
<div className="dark:bg-gray-600 bg-gray-100 px-2">
<span className="text-sm">star</span>
</div>
<div className="dark:bg-blue-600 bg-gray-200 font-medium px-2">
<span id="repo-stars-count">{favorites || 4621}</span>
</div>
</div>
<div className="flex items-center">
<div className="px-2 bg-gray-100 dark:bg-gray-600">
<span className="text-sm">language</span>
</div>
<div className="px-2 dark:bg-blue-600 bg-gray-200 font-medium">
<span id="repo-languages-count font-medium">
{language || "java"}
</span>
</div>
</div>
<div className="flex items-center">
<div className="dark:bg-gray-600 bg-gray-100 px-2">
<span className="text-sm">forks</span>
</div>
<div className="dark:bg-blue-600 bg-gray-200 px-2 font-medium">
<span id="repo-forks-count">{forks || 1020}</span>
</div>
</div>
<div className="flex items-center">
<div className="px-2 bg-gray-100 dark:bg-gray-600">
<span className="text-sm">license</span>
</div>
<div className="px-2 dark:bg-blue-600 bg-gray-200">
<span className="text-sm font-medium" id="repo-license-name">
Apache 2
</span>
</div>
</div>
</div>
);
};
export default GithubInfo;

@ -0,0 +1,85 @@
import React from "react";
import { Icon } from "@iconify/react";
import useBaseUrl from "@docusaurus/useBaseUrl";
import GithubInfo from "./GithubInfo";
import Translate, { translate } from "@docusaurus/Translate";
import Link from "@docusaurus/Link";
const Hero = () => {
return (
<div className="hero-container text-black dark:text-white">
<div className="py-10 mb-10">
<div className="container px-20 lg:px-20 md:px-10 mx-auto flex flex-wrap flex-col md:flex-row items-center">
{/* <!--Left Col--> */}
<div className="flex flex-col w-full md:w-3/5 justify-center items-start text-center md:text-left">
{/* title and desc */}
<div>
<h1 className="my-4 lg:my-8 md:my-6 text-5xl font-bold leading-tight text-transparent bg-gradient-to-r from-orange-400 via-orange-400 to-orange-500 bg-clip-text">
Hippo4j
</h1>
<p className="leading-normal dark:text-white font-bold text-gray-800 md:pr-20 text-3xl md:text-3xl">
<Translate
id="homepage.titleDescription1"
description="The homepage title description"
>
Thread Pool Framework For Java
</Translate>
</p>
<p className="leading-normal font-medium md:pr-20 text-gray-600 dark:text-gray-100 text-2xl mb-2">
<Translate
id="homepage.titleDescription2"
description="The homepage title description"
>
Enhancing the Operational Assurance Capability for Business
Systems Online.
</Translate>
</p>
</div>
{/* button group */}
<div className="flex my-4 lg:my-8 md:my-6 w-full justify-center md:justify-start">
<Link to="/docs/user_docs/intro" className="">
<button className="mr-2 lg:mr-4 text-base lg:text-lg w-32 lg:w-40 hover:bg-orange-500 bg-orange-400 font-medium py-2 px-4 rounded-md focus:outline-none shadow-none border-none cursor-pointer transition-all duration-300 ease-in-out">
<Translate
className="cursor-pointer"
id="homepage.startButton"
description="The homepage start button text"
>
Quick Start
</Translate>
</button>
</Link>
<a href="https://github.com/opengoofy/hippo4j">
<button className="ml-2 lg:mx-0 w-32 lg:w-40 border border-solid dark:border-gray-100 border-gray-200 bg-transparent hover:bg-gray-300 hover:bg-opacity-50 font-medium py-2 px-4 rounded-md focus:outline-none shadow-none cursor-pointer transition-all duration-300 ease-in-out">
<div className="flex cursor-pointer items-center justify-center">
<Icon
className="w-6 h-6 mr-2 rounded-full flex-shrink-0 dark:bg-white"
icon="devicon:github"
/>
<span className="text-base lg:text-lg">GitHub</span>
</div>
</button>
</a>
</div>
{/* github info */}
<div className="github-info w-full">
<GithubInfo owner="opengoofy" repo="hippo4j" />
</div>
</div>
{/* <!--Right image--> */}
<div className="w-full md:w-2/5 text-center">
<img
className="w-full h-auto object-cover md:shadow-sm lg:h-80 md:h-96 dark:rounded-lg dark:shadow-lg dark:filter-brightness-75"
src={useBaseUrl("/img/hero.svg")}
alt="Hippo4j System"
/>
</div>
</div>
</div>
</div>
);
};
export default Hero;

@ -0,0 +1,106 @@
import React from "react";
import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate";
const Introduction = () => {
return (
<section className=" border-b mb-28">
<div className="container px-20 lg:px-20 md:px-10 ">
<h2 className="w-full my-2 text-5xl dark:text-white font-medium leading-tight text-gray-800">
{/* Hippo4j能做什么 */}
<Translate
id="homepage.secondTitle"
description="a title for introduciton part"
>
What can Hippo4j do?
</Translate>
</h2>
<div className="w-1/2 mb-6">
<div className=" h-1 w-64 my-0 py-0 rounded-t bg-gradient-to-r from-orange-400 to-blue-500 mb-4"></div>
</div>
<div className="third-part-desc grid md:grid-cols-2 grid-cols-1 gap-4">
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg">
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3">
{/* 动态变更 */}
<Translate
id="homepage.introduction.fristPartTitle"
description="the title for the first introduction part"
>
Dynamic Change
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white ">
{/* 应用运行时动态变更线程池参数,包括不限于核心、最大线程、阻塞队列大小和拒绝策略等,支持应用集群下不同节点线程池配置差异化 */}
<Translate
id="homepage.introduction.fristPartDesc"
description="the desc for the first introduction part"
>
Application runtime dynamically changes thread pool parameters,
including but not limited to core size, maximum threads,
blocking queue size, and rejection policy. It supports
differentiated thread pool configurations for different nodes in
the application cluster.
</Translate>
<br />
<br />
</p>
</div>
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg">
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3">
{/* 自定义报警 */}
<Translate
id="homepage.introduction.secondPartTitle"
description="the title for the second introduction part"
>
Custom Alarm
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white">
{/* 应用线程池运行时埋点,提供四种报警维度,线程池过载、阻塞队列容量、运行超长以及拒绝策略报警,并支持自定义时间内不重复报警 */}
<Translate
id="homepage.introduction.secondPartDesc"
description="the desc for the second introduction part"
>
Application thread pool runtime point, providing four alarm
dimensions: thread pool overload, blocking queue capacity,
running for too long, and rejection strategy alarm. It also
supports non-repetitive alarms within a custom time period.
</Translate>
<br />
<br />
</p>
</div>
<div className="p-4 md:p-6 bg-gray-100 dark:bg-[#252525] rounded-lg">
<h3 className="text-3xl text-gray-800 dark:text-white font-medium leading-none mb-3">
{/* 运行监控 */}
<Translate
id="homepage.introduction.thirdPartTitle"
description="the title for the third introduction part"
>
Operation Monitoring
</Translate>
</h3>
<p className="text-gray-600 text-xl dark:text-white">
{/* 线
PrometheusInfluxDB 等采集监控通过 Grafana
或内置监控页面提供可视化大屏监控运行指标 */}
<Translate
id="homepage.introduction.thirdPartDesc"
description="the desc for the third introduction part"
>
Supports custom duration thread pool for data collection and
storage, while also supporting Prometheus, InfluxDB, and other
monitoring systems. Provides visualized dashboard monitoring
metrics through Grafana or built-in monitoring pages.
</Translate>
<br />
<br />
</p>
</div>
</div>
</div>
</section>
);
};
export default Introduction;

@ -0,0 +1,16 @@
import React from "react";
import Hero from "./Hero";
import Introduction from "./Introduction";
function LandingLayout(props) {
return (
<div className="leading-normal tracking-normal text-white">
{/* <!--Hero part--> */}
<Hero />
{/* <!-- Introduction part --> */}
<Introduction />
</div>
);
}
export default LandingLayout;

@ -0,0 +1,30 @@
import { useState, useEffect } from "react";
const useGithubInfo = (owner, repo) => {
const [favorites, setFavorites] = useState(0);
const [language, setLanguage] = useState("");
const [forks, setForks] = useState(0);
const [license, setLicense] = useState("");
useEffect(() => {
fetch(`https://api.github.com/repos/${owner}/${repo}`)
.then((response) => response.json())
.then((data) => {
setFavorites(data.stargazers_count);
setLanguage(data.language);
setForks(data.forks_count);
setLicense(data.license?.name ?? "");
})
.catch((error) => {
console.error("Error fetching API data:", error);
});
}, [owner, repo]);
return {
favorites,
language,
forks,
license,
};
};
export default useGithubInfo;

@ -5,207 +5,217 @@
* LICENSE file in the root directory of this source tree.
*/
/* load tailwind css */
@tailwind base;
@tailwind components;
@tailwind utilities;
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap");
:root {
/*
/*
See css var + hsl color palette technique:
https://blog.maximeheckel.com/posts/the-power-of-composition-with-css-variables/
*/
--site-primary-hue-saturation: 167 68%;
--site-primary-hue-saturation-light: 167 56%; /* do we really need this extra one? */
--site-color-favorite-background: #f6fdfd;
--site-color-tooltip: #fff;
--site-color-tooltip-background: #353738;
--site-color-svg-icon-favorite: #e9669e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%);
--site-color-feedback-background: #fff;
}
html[data-theme='dark'] {
--site-color-feedback-background: #f0f8ff;
--site-color-favorite-background: #1d1e1e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%);
}
[data-theme='light'] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 30%);
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%);
--ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 39%);
--ifm-color-primary-lighter: hsl(
var(--site-primary-hue-saturation-light) 47%
);
--ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 58%
);
}
[data-theme='dark'] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 45%);
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%);
--ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 54%);
--ifm-color-primary-lighter: hsl(
var(--site-primary-hue-saturation-light) 62%
);
--ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 73%
);
--site-primary-hue-saturation: 167 68%;
--site-primary-hue-saturation-light: 167 56%; /* do we really need this extra one? */
--site-color-favorite-background: #f6fdfd;
--site-color-tooltip: #fff;
--site-color-tooltip-background: #353738;
--site-color-svg-icon-favorite: #e9669e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 25%);
--site-color-feedback-background: #fff;
--ifm-font-family-base: "Poppins";
}
html[data-theme="dark"] {
--site-color-feedback-background: #f0f8ff;
--site-color-favorite-background: #1d1e1e;
--site-color-checkbox-checked-bg: hsl(167deg 56% 73% / 10%);
}
[data-theme="light"] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 30%);
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 26%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 23%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 17%);
--ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 39%);
--ifm-color-primary-lighter: hsl(
var(--site-primary-hue-saturation-light) 47%
);
--ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 58%
);
}
[data-theme="dark"] {
--ifm-color-primary: hsl(var(--site-primary-hue-saturation) 45%);
--ifm-color-primary-dark: hsl(var(--site-primary-hue-saturation) 41%);
--ifm-color-primary-darker: hsl(var(--site-primary-hue-saturation) 38%);
--ifm-color-primary-darkest: hsl(var(--site-primary-hue-saturation) 32%);
--ifm-color-primary-light: hsl(var(--site-primary-hue-saturation-light) 54%);
--ifm-color-primary-lighter: hsl(
var(--site-primary-hue-saturation-light) 62%
);
--ifm-color-primary-lightest: hsl(
var(--site-primary-hue-saturation-light) 73%
);
}
.docusaurus-highlight-code-line {
background-color: rgb(0 0 0 / 10%);
display: block;
margin: 0 calc(-1 * var(--ifm-pre-padding));
padding: 0 var(--ifm-pre-padding);
background-color: rgb(0 0 0 / 10%);
display: block;
margin: 0 calc(-1 * var(--ifm-pre-padding));
padding: 0 var(--ifm-pre-padding);
}
[data-theme='dark'] .docusaurus-highlight-code-line {
background-color: rgb(66 66 66 / 30%);
[data-theme="dark"] .docusaurus-highlight-code-line {
background-color: rgb(66 66 66 / 30%);
}
.header-github-link:hover {
opacity: 0.6;
opacity: 0.6;
}
.header-github-link::before {
content: '';
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;
content: "";
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}
[data-theme='dark'] .header-github-link::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat;
[data-theme="dark"] .header-github-link::before {
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")
no-repeat;
}
.footer--dark {
--ifm-footer-background-color: #2b3137;
--ifm-footer-background-color: #2b3137;
}
.unique-tabs .tabs__item {
line-height: 16px;
margin-right: 8px;
line-height: 16px;
margin-right: 8px;
}
.unique-tabs .tabs__item--active {
border: 0;
color: #fff;
border-radius: var(--ifm-global-radius);
background-color: var(--ifm-tabs-color-active);
}
[data-theme='light'] .themedDocusaurus [fill='#FFFF50'] {
fill: greenyellow;
}
[data-theme='dark'] .themedDocusaurus [fill='#FFFF50'] {
fill: seagreen;
}
[data-theme='light'] .DocSearch {
/* --docsearch-primary-color: var(--ifm-color-primary); */
/* --docsearch-text-color: var(--ifm-font-color-base); */
--docsearch-muted-color: var(--ifm-color-emphasis-700);
--docsearch-container-background: rgb(94 100 112 / 70%);
/* Modal */
--docsearch-modal-background: var(--ifm-color-secondary-lighter);
/* Search box */
--docsearch-searchbox-background: var(--ifm-color-secondary);
--docsearch-searchbox-focus-background: var(--ifm-color-white);
/* Hit */
--docsearch-hit-color: var(--ifm-font-color-base);
--docsearch-hit-active-color: var(--ifm-color-white);
--docsearch-hit-background: var(--ifm-color-white);
/* Footer */
--docsearch-footer-background: var(--ifm-color-white);
}
[data-theme='dark'] .DocSearch {
--docsearch-text-color: var(--ifm-font-color-base);
--docsearch-muted-color: var(--ifm-color-secondary-darkest);
--docsearch-container-background: rgb(47 55 69 / 70%);
/* Modal */
--docsearch-modal-background: var(--ifm-background-color);
/* Search box */
--docsearch-searchbox-background: var(--ifm-background-color);
--docsearch-searchbox-focus-background: var(--ifm-color-black);
/* Hit */
--docsearch-hit-color: var(--ifm-font-color-base);
--docsearch-hit-active-color: var(--ifm-color-white);
--docsearch-hit-background: var(--ifm-color-emphasis-100);
/* Footer */
--docsearch-footer-background: var(--ifm-background-surface-color);
--docsearch-key-gradient: linear-gradient(
-26.5deg,
var(--ifm-color-emphasis-200) 0%,
var(--ifm-color-emphasis-100) 100%
);
}
div[class^='announcementBar_'] {
--site-announcement-bar-stripe-color1: hsl(
var(--site-primary-hue-saturation) 85%
);
--site-announcement-bar-stripe-color2: hsl(
var(--site-primary-hue-saturation) 95%
);
background: repeating-linear-gradient(
35deg,
var(--site-announcement-bar-stripe-color1),
var(--site-announcement-bar-stripe-color1) 20px,
var(--site-announcement-bar-stripe-color2) 10px,
var(--site-announcement-bar-stripe-color2) 40px
);
font-weight: bold;
border: 0;
color: #fff;
border-radius: var(--ifm-global-radius);
background-color: var(--ifm-tabs-color-active);
}
[data-theme="light"] .themedDocusaurus [fill="#FFFF50"] {
fill: greenyellow;
}
[data-theme="dark"] .themedDocusaurus [fill="#FFFF50"] {
fill: seagreen;
}
[data-theme="light"] .DocSearch {
/* --docsearch-primary-color: var(--ifm-color-primary); */
/* --docsearch-text-color: var(--ifm-font-color-base); */
--docsearch-muted-color: var(--ifm-color-emphasis-700);
--docsearch-container-background: rgb(94 100 112 / 70%);
/* Modal */
--docsearch-modal-background: var(--ifm-color-secondary-lighter);
/* Search box */
--docsearch-searchbox-background: var(--ifm-color-secondary);
--docsearch-searchbox-focus-background: var(--ifm-color-white);
/* Hit */
--docsearch-hit-color: var(--ifm-font-color-base);
--docsearch-hit-active-color: var(--ifm-color-white);
--docsearch-hit-background: var(--ifm-color-white);
/* Footer */
--docsearch-footer-background: var(--ifm-color-white);
}
[data-theme="dark"] .DocSearch {
--docsearch-text-color: var(--ifm-font-color-base);
--docsearch-muted-color: var(--ifm-color-secondary-darkest);
--docsearch-container-background: rgb(47 55 69 / 70%);
/* Modal */
--docsearch-modal-background: var(--ifm-background-color);
/* Search box */
--docsearch-searchbox-background: var(--ifm-background-color);
--docsearch-searchbox-focus-background: var(--ifm-color-black);
/* Hit */
--docsearch-hit-color: var(--ifm-font-color-base);
--docsearch-hit-active-color: var(--ifm-color-white);
--docsearch-hit-background: var(--ifm-color-emphasis-100);
/* Footer */
--docsearch-footer-background: var(--ifm-background-surface-color);
--docsearch-key-gradient: linear-gradient(
-26.5deg,
var(--ifm-color-emphasis-200) 0%,
var(--ifm-color-emphasis-100) 100%
);
}
div[class^="announcementBar_"] {
--site-announcement-bar-stripe-color1: hsl(
var(--site-primary-hue-saturation) 85%
);
--site-announcement-bar-stripe-color2: hsl(
var(--site-primary-hue-saturation) 95%
);
background: repeating-linear-gradient(
35deg,
var(--site-announcement-bar-stripe-color1),
var(--site-announcement-bar-stripe-color1) 20px,
var(--site-announcement-bar-stripe-color2) 10px,
var(--site-announcement-bar-stripe-color2) 40px
);
font-weight: bold;
}
.red > a {
color: red;
color: red;
}
.screen-reader-only {
border: 0;
clip: rect(0 0 0 0);
clip-path: polygon(0 0, 0 0, 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
white-space: nowrap;
border: 0;
clip: rect(0 0 0 0);
clip-path: polygon(0 0, 0 0, 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
white-space: nowrap;
}
[data-theme='light'] img[src$='#gh-dark-mode-only'],
[data-theme='dark'] img[src$='#gh-light-mode-only'] {
display: none;
[data-theme="light"] img[src$="#gh-dark-mode-only"],
[data-theme="dark"] img[src$="#gh-light-mode-only"] {
display: none;
}
/* Used to test CSS insertion order */
.test-marker-site-custom-css-unique-rule {
content: 'site-custom-css-unique-rule';
content: "site-custom-css-unique-rule";
}
@media only screen and (max-width: 996px) {
.video-container {
position: relative;
overflow: hidden;
width: 100%;
max-width: 560px;
margin: 0 auto;
padding-top: 56.25%;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.video-container {
position: relative;
overflow: hidden;
width: 100%;
max-width: 560px;
margin: 0 auto;
padding-top: 56.25%;
}
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
}

@ -1,20 +1,22 @@
import React from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import Translate from '@docusaurus/Translate';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
import HomepageFeatures from '@site/src/components/HomepageFeatures';
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
import React from "react";
import clsx from "clsx";
import Link from "@docusaurus/Link";
// import Translate from "@docusaurus/Translate";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
import Layout from "@theme/Layout";
// import HomepageFeatures from "@site/src/components/HomepageFeatures";
import ExecutionEnvironment from "@docusaurus/ExecutionEnvironment";
import styles from './index.module.css';
import LandingLayout from "@site/src/components/LandingPage";
import styles from "./index.module.css";
if (ExecutionEnvironment.canUseDOM) {
var _hmt = _hmt || [];
(function () {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58';
var s = document.getElementsByTagName('script')[0];
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?473eaadc06f3d63771f303df1fc29b58";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
}
@ -22,12 +24,15 @@ if (ExecutionEnvironment.canUseDOM) {
function HomepageHeader() {
const { siteConfig } = useDocusaurusContext();
return (
<header className={clsx('hero hero--primary', styles.heroBanner)}>
<header className={clsx("hero hero--primary", styles.heroBanner)}>
<div className="container">
<h1 className="hero__title">{siteConfig.title}</h1>
<p className="hero__subtitle">{siteConfig.tagline}</p>
<div className={styles.buttons}>
<Link className="button button--secondary button--lg" to="/docs/user_docs/intro">
<Link
className="button button--secondary button--lg"
to="/docs/user_docs/intro"
>
快速开始 - 5min
</Link>
</div>
@ -43,9 +48,10 @@ export default function Home() {
title={`${siteConfig.title}`}
description="Description will go into a meta tag in <head />"
>
<HomepageHeader />
{/* <HomepageHeader /> */}
<main>
<HomepageFeatures />
{/* <HomepageFeatures /> */}
<LandingLayout />
</main>
</Layout>
);

@ -5,7 +5,7 @@ title: 采用公司
## 谁在使用 Hippo4j
共计 38+ 家公司生产接入 Hippo4j按照公司登记时间排序。
共计 45+ 家公司生产接入 Hippo4j按照公司登记时间排序。
- [身边云](https://serviceshare.com)
- [思派健康科技](https://www.medbanks.cn)
@ -45,6 +45,13 @@ title: 采用公司
- [神州数码(西安)](https://www.digitalchina.com)
- [广联达科技股份有限公司](https://www.glodon.com)
- [天健联创控股集团有限公司](https://www.tjlc.com.cn)
- [知乎](https://www.zhihu.com/)
- [广东谷通科技有限公司](https://www.duofriend.com)
- [成都全域智旅科技有限公司](http://qyzl.com)
- [深圳市华云中盛科技股份有限公司](http://www.hua-cloud.cn)
- [智慧芽信息科技(苏州)有限公司](https://www.zhihuiya.com)
- [滴滴出行](https://www.didiglobal.com)
- [杭州源诚科技有限公司](http://www.yckjdata.com)
## 登记

@ -0,0 +1,101 @@
import React from "react";
import Layout from "@theme/Layout";
import companyData from "@site/static/json/company_logo.json";
import useBaseUrl from "@docusaurus/useBaseUrl";
import Translate from "@docusaurus/Translate";
function CompanyCards({ companies }) {
return (
<div className="grid sm:grid-cols-2 grid-cols-1 md:px-16 md:grid-cols-3 lg:grid-cols-5 gap-4 mb-16 lg:px-2 px-10">
{companies.map((company) => (
<div
onClick={() => window.open(company.url)}
key={company.url}
className="bg-white rounded-lg overflow-hidden shadow-sm transform cursor-pointer transition-all duration-500 hover:scale-110"
style={{ border: "1px solid #E5E7EB" }}
>
<div className="flex dark:text-black items-center justify-center h-28">
<div
className="h-24 w-24 object-contain"
style={{ position: "relative" }}
>
<img
src={useBaseUrl(company.logo)}
alt={`${company.name}`}
className="h-24 w-24 object-contain"
onError={(e) => {
e.target.style.display = "none"; // Hide the image if it fails to load
e.target.nextSibling.style.display = "flex"; // Show the alt text
}}
/>
<div
className="flex items-center justify-center absolute inset-0 text-center"
style={{
display: "none", // Hide the alt text by default
}}
>
{company.name}
</div>
</div>
</div>
</div>
))}
</div>
);
}
export default function OurUsers() {
return (
<Layout title="OurUsers" description="companies using our product">
<div className="max-w-screen-lg mx-auto dark:text-white">
{/* text description*/}
<div className="max-w-screen-sm sm:mx-auto mx-10 text-center my-8 ">
<div className="text-center mt-8">
<h2 className="text-3xl font-bold mb-4">
<Translate
id="companyPage.title"
description="the title for the company page"
>
Who is using Hippo4j?
</Translate>
</h2>
<div
className="mx-auto h-1 bg-gradient-to-r from-green-400 to-blue-500 mb-4"
style={{ width: "30%" }}
></div>
</div>
<div className="flex flex-col items-center mx-auto">
<p className="text-lg mb-2 max-w-1/2" style={{ lineHeight: "1.5" }}>
<Translate
id="companyPage.descriptionText"
description="the description for the company page"
>
Thank you very much for your attention and support to Hippo4j.
This is our greatest motivation to move forward.
</Translate>{" "}
</p>
<p className="text-lg mb-4 max-w-1/2" style={{ lineHeight: "1.5" }}>
<Translate
id="companyPage.questionText"
description="the text for the company question"
>
Are you using Hippo4j?
</Translate>{" "}
<a
href="https://github.com/opengoofy/hippo4j/issues/13"
className="text-blue-500 hover:text-blue-700 font-bold"
>
<Translate
id="companyPage.linkText"
description="the text for the company page link"
>
Click to register
</Translate>
</a>
</p>
</div>
</div>
{/* company logo display */}
<CompanyCards companies={companyData} className="ml-0" />
</div>
</Layout>
);
}

@ -1,53 +0,0 @@
---
sidebar_position: 1
title: 采用公司
---
## 谁在使用 Hippo4j
共计 38+ 家公司生产接入 Hippo4j按照公司登记时间排序。
- [身边云](https://serviceshare.com)
- [思派健康科技](https://www.medbanks.cn)
- [北京智合联创科技有限公司](http://www.zhlc.com.cn)
- [神州数码(北京)](http://www.digitalchina.com)
- [PayerMax](https://www.payermax.com/)
- [轻松到家](http://www.uyess.com/index.html)
- [某商业银行股份有限公司](https://github.com/opengoofy/hippo4j/issues/13)
- [某国际物流信息股份有限公司](https://github.com/opengoofy/hippo4j/issues/13)
- [萨科(深圳)科技有限公司](https://www.lbdj.com/)
- [广东天枢新能源科技有限公司](https://gd-tianshu.com/)
- [FitTime](http://fittime.com/)
- [百强国际物流](https://github.com/opengoofy/hippo4j/issues/13)
- [海南某深圳分公司](https://github.com/opengoofy/hippo4j/issues/13)
- [众合云科51社保](https://home.101hr.com/)
- [好货云店](https://pc.haohuoyundian.com/)
- [斗象科技](https://www.tophant.com/)
- [深圳航天信息有限公司](http://sz.aisino.com/)
- [新东方教育科技集团](https://www.xdf.cn/)
- [远眺网络科技有限公司](https://www.yuantiaokj.com/)
- [浙江吉利控股集团有限公司](https://www.geely.com/)
- [三立人(深圳)科技有限公司-焦内](https://www.bananain.com/)
- [上海天猫好房添玑网络服务有限公司](http://www.eju.com/)
- [郑州力通水务](http://www.zzltsw.com/)
- [北京自如信息科技有限公司](https://www.ziroom.com/)
- [北京易车信息科技有限公司](https://www.yiche.com/)
- [中新软件(上海)有限公司](http://www.5000m.com)
- [深圳市上马网络技术有限公司](https://www.shangmanet.com)
- [兰亭集势(成都)科技有限公司](https://www.lightinthebox.com/)
- [杭州数理大数据有限公司](https://www.data4truth.com/#/)
- [九四智能](https://94ai.com)
- [新华智云科技有限公司](https://www.xinhuazhiyun.com)
- [银丰新融](https://www.ist.com.cn)
- [深圳市帮客帮科技有限公司](https://www.bangkebang.com)
- [重庆威爱云科技有限公司](https://51vive.com)
- [网易有道信息技术(北京)有限公司](https://www.youdao.com)
- [神州数码(西安)](https://www.digitalchina.com)
- [广联达科技股份有限公司](https://www.glodon.com)
- [天健联创控股集团有限公司](https://www.tjlc.com.cn)
## 登记
欢迎采用了 Hippo4j 的公司在此登记,非常感谢大家对 Hippo4j 的关注和支持,这是我们前进最大的动力。
请按公司名 + 首页的格式在 [此处](https://github.com/opengoofy/hippo4j/issues/13) 登记。

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="99" height="38" viewBox="0 0 99 38">
<desc>Created with Sketch.</desc>
<defs>
</defs>
<g transform="matrix(1 0 0 1 46.5 19)" >
<g style="" >
<g transform="matrix(1 0 0 1 1.81 6.25)" id="Fill-1" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.31, -25.25)" d="M 48.7217 20.9722 C 47.9585333 22.9672 46.5372278 26.6806444 45.64845 28.6851444 L 45.5497556 28.9083944 L 47.8160333 29.7296167 L 47.9020611 29.53645 C 49.0352 26.9994222 50.0443111 24.4639778 50.98745 21.78445 L 51.0629222 21.5707 L 48.8013944 20.7647833 L 48.7217 20.9722 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 1.81 -7.31)" id="Fill-3" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.31, -11.69)" d="M 47.1649139 12.3122639 C 47.8679139 12.8548194 48.6648583 13.4702083 49.1651917 13.900875 L 49.3451639 14.0560417 L 50.8377194 12.1660694 L 50.6756917 12.0235694 C 49.988525 11.4197917 48.896025 10.556875 47.4272194 9.459625 L 47.2467194 9.32451389 L 45.7889972 11.2324306 L 45.9610528 11.3717639 C 46.2756083 11.625625 46.7068028 11.9586528 47.1649139 12.3122639" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 1.57 -2.15)" id="Fill-5" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-48.07, -16.85)" d="M 49.3460611 19.4095556 L 50.8391444 17.5185278 L 50.6734222 17.3765556 C 49.4901444 16.36375 48.1627833 15.3161111 46.9346444 14.4262778 L 46.7546722 14.2953889 L 45.29695 16.2122778 L 45.4848389 16.3495 C 46.6823667 17.2224444 47.9891444 18.2547778 49.1660889 19.2565 L 49.3460611 19.4095556 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 12.72 -0.08)" id="Fill-7" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-59.22, -18.92)" d="M 61.7289417 12.4118028 L 61.1299139 14.4353028 L 57.313025 14.4353028 L 56.7139972 12.4118028 L 61.7289417 12.4118028 Z M 61.1631639 23.673525 L 61.1631639 24.8393861 C 61.1631639 25.0135528 61.0211917 25.1549972 60.8475528 25.1549972 L 57.279775 25.1549972 L 57.279775 23.673525 L 61.1631639 23.673525 Z M 60.5324694 7.83069167 L 57.9109972 7.83069167 L 57.9109972 10.2194139 L 50.8561917 10.2194139 L 50.8561917 12.4118028 L 54.1136361 12.4144417 L 54.8256083 14.4379417 L 51.456275 14.434775 L 51.456275 30.0158306 L 53.8661083 30.0158306 L 53.8661083 16.6276917 L 58.0165528 16.6276917 L 58.0165528 17.9587472 L 54.5020806 17.9587472 L 54.5020806 20.1511361 L 58.0165528 20.1511361 L 58.0165528 21.4811361 L 55.0879139 21.4811361 L 55.0879139 27.3473861 L 61.7706361 27.3473861 C 62.6441083 27.3473861 63.355025 26.6364694 63.355025 25.7619417 L 63.355025 21.4811361 L 60.4263861 21.4811361 L 60.4263861 20.1511361 L 63.7170806 20.1511361 L 63.7170806 17.9587472 L 60.4263861 17.9587472 L 60.4263861 16.6276917 L 64.5773583 16.6276917 L 64.5773583 26.965275 C 64.5773583 27.4381639 64.1920806 27.8229139 63.7186639 27.8229139 L 61.1003583 27.8229139 L 61.7431917 30.0158306 L 64.0448306 30.0158306 C 65.6666917 30.0158306 66.9866639 28.6958583 66.9866639 27.0734694 L 66.9866639 14.4353028 L 63.6168028 14.4353028 L 64.3282472 12.4118028 L 67.5862194 12.4118028 L 67.5862194 10.2194139 L 60.5324694 10.2194139 L 60.5324694 7.83069167 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 27.17 6.25)" id="Fill-9" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.67, -25.25)" d="M 74.0896028 20.9722 C 73.324325 22.9703667 71.9003806 26.6906722 71.0163528 28.6851444 L 70.9181861 28.9083944 L 73.1839361 29.7296167 L 73.2699639 29.53645 C 74.4009917 27.0025889 75.4101028 24.4666167 76.354825 21.78445 L 76.4302972 21.5707 L 74.1692972 20.7647833 L 74.0896028 20.9722 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 27.18 -7.31)" id="Fill-11" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.68, -11.69)" d="M 72.5371972 12.3159583 C 73.2386139 12.8574583 74.033975 13.4712639 74.5332528 13.900875 L 74.713225 14.0560417 L 76.2052528 12.1660694 L 76.043225 12.0235694 C 75.3581694 11.421375 74.2651417 10.5584583 72.7952806 9.459625 L 72.6147806 9.32451389 L 71.1570583 11.2324306 L 71.3291139 11.3717639 C 71.6441972 11.6266806 72.0775028 11.9607639 72.5371972 12.3159583" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 26.94 -2.15)" id="Fill-13" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-73.44, -16.85)" d="M 74.7140167 19.4095556 L 76.2071 17.5185278 L 76.0413778 17.3765556 C 74.8581 16.36375 73.5307389 15.3161111 72.3026 14.4262778 L 72.1226278 14.2953889 L 70.6654333 16.2122778 L 70.8527944 16.3495 C 72.0524333 17.2240278 73.3597389 18.2568889 74.5340444 19.2565 L 74.7140167 19.4095556 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 38.09 -0.08)" id="Fill-15" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-84.59, -18.92)" d="M 87.0968972 12.4118028 L 86.4973417 14.4353028 L 82.6809806 14.4353028 L 82.0819528 12.4118028 L 87.0968972 12.4118028 Z M 86.5305917 23.673525 L 86.5305917 24.8393861 C 86.5305917 25.0135528 86.3886194 25.1549972 86.2155083 25.1549972 L 82.6477306 25.1549972 L 82.6477306 23.673525 L 86.5305917 23.673525 Z M 85.8998972 7.83069167 L 83.278425 7.83069167 L 83.278425 10.2194139 L 76.224675 10.2194139 L 76.224675 12.4118028 L 79.4815917 12.4144417 L 80.1930361 14.4379417 L 76.8242306 14.434775 L 76.8242306 30.0158306 L 79.2335361 30.0158306 L 79.2335361 16.6276917 L 83.3839806 16.6276917 L 83.3839806 17.9587472 L 79.8700361 17.9587472 L 79.8700361 20.1511361 L 83.3839806 20.1511361 L 83.3839806 21.4811361 L 80.4558694 21.4811361 L 80.4558694 27.3473861 L 87.1380639 27.3473861 C 88.0120639 27.3473861 88.7224528 26.6364694 88.7224528 25.7619417 L 88.7224528 21.4811361 L 85.7943417 21.4811361 L 85.7943417 20.1511361 L 89.0845083 20.1511361 L 89.0845083 17.9587472 L 85.7943417 17.9587472 L 85.7943417 16.6276917 L 89.9447861 16.6276917 L 89.9447861 26.965275 C 89.9447861 27.4381639 89.5595083 27.8229139 89.0866194 27.8229139 L 86.4677861 27.8229139 L 87.1106194 30.0158306 L 89.4122583 30.0158306 C 91.0346472 30.0158306 92.3546194 28.6958583 92.3546194 27.0734694 L 92.3546194 14.4353028 L 88.9852861 14.4353028 L 89.6967306 12.4118028 L 92.9536472 12.4118028 L 92.9536472 10.2194139 L 85.8998972 10.2194139 L 85.8998972 7.83069167 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -27.57 -0.07)" id="Fill-17" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: evenodd; opacity: 1;" transform=" translate(-18.93, -18.93)" d="M 30.0177306 37.7670389 L 7.83839722 37.7670389 C 3.55811944 37.7670389 0.0890361111 34.2974278 0.0890361111 30.0176778 L 0.0890361111 7.83834444 C 0.0890361111 3.55806667 3.55811944 0.0889833333 7.83839722 0.0889833333 L 30.0177306 0.0889833333 C 34.2974806 0.0889833333 37.7670917 3.55806667 37.7670917 7.83834444 L 37.7670917 30.0176778 C 37.7670917 34.2974278 34.2974806 37.7670389 30.0177306 37.7670389" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -27.57 -0.07)" id="Stroke-19" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: none; fill-rule: evenodd; opacity: 1;" transform=" translate(-18.93, -18.93)" d="M 30.0177306 37.7670389 L 7.83839722 37.7670389 C 3.55811944 37.7670389 0.0890361111 34.2974278 0.0890361111 30.0176778 L 0.0890361111 7.83834444 C 0.0890361111 3.55806667 3.55811944 0.0889833333 7.83839722 0.0889833333 L 30.0177306 0.0889833333 C 34.2974806 0.0889833333 37.7670917 3.55806667 37.7670917 7.83834444 L 37.7670917 30.0176778 C 37.7670917 34.2974278 34.2974806 37.7670389 30.0177306 37.7670389 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -27.16 0.77)" id="Fill-21" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,100,0); fill-rule: evenodd; opacity: 1;" transform=" translate(-19.34, -19.77)" d="M 19.419425 25.8178333 C 23.9799528 25.6753333 27.5957583 22.0463333 27.6490639 17.5401667 L 27.6490639 13.6662778 L 32.6666472 13.6662778 L 32.6666472 17.9497222 C 32.5690083 24.9169167 26.5122306 30.41425 19.419425 30.5720556 L 19.419425 30.571 C 12.2105083 30.5261389 6.10675833 24.9902778 6.00736001 17.9486667 L 6.00736001 10.2483889 C 5.99645278 9.46094444 6.50945278 8.95005556 7.28423056 8.96113889 L 27.6469528 8.96008333 L 27.6469528 13.6641667 L 11.6790361 13.6683889 C 11.2694806 13.6683889 11.0230083 13.9180278 11.0230083 14.3238889 L 11.0230083 17.4620556 C 11.0773694 22.0278611 14.7554528 25.7708611 19.4183694 25.8178333 L 19.419425 25.8178333 Z" stroke-linecap="round" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -0,0 +1 @@
<svg width="123" height="22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><path id="a" d="M0 17.456h80.048V0H0z"/></defs><g fill="none" fill-rule="evenodd"><g fill="#EE404A" fill-rule="nonzero"><path d="M14.28 8.196c-.431.609-3.383 5.455-5.141 7.594-.988 1.202-4.05 4.871-7.254 1.215-2.86-3.263-2.04-8.799-.344-11.26.736-1.07 1.7-1.943 3.12-1.872 1.172.058 2.122.61 2.993 2.126 1.92 3.339 4.957 3.323 6.626 2.197M12.45 13.383s4.524-7.774 7.484-10.867c3.426-3.578 8.292-3.232 10.406.35 1.307 2.214 2.02 4.927 2.03 7.77.009 2.81-1.003 8.834-4.636 10.445-2.181.967-5.084.677-7.516-2.204-4.39-5.204-5.93-5.97-7.768-5.494"/></g><g transform="translate(42 2)"><path d="M56.54 10.865v3.885c0 .66-.567 1.198-1.265 1.198H44.407V14.16h10.862v-1.506H44.407v-1.788H56.54zm-13.724 6.59h12.459c1.575 0 2.856-1.213 2.856-2.705V9.359H42.816v8.095z" fill="#131415"/><mask id="b" fill="#fff"><use xlink:href="#a"/></mask><path d="M52.605 6.634h5.043V2.136h-5.043v4.498zm-1.59 1.506h8.223V.63h-8.222v7.51zM41.71 7.05l.501 1.41c.139-.045 2.476-.677 3.861-2.554a16.13 16.13 0 012.406 2.493l1.283-.89c-.628-.84-1.344-1.55-1.968-2.134h1.904V3.87h-3.003V2.136h3.003V.63H43.5V0h-1.59v2.136h3.192v1.733h-3.188v1.506h2.615c-.833.852-2.148 1.468-2.82 1.675M64.779 2.136h13.185V.63H64.779zM62.695 8.14h17.353V6.634H62.695zM78.89 13.455h-1.64l.342 1.288a.923.923 0 01-.185.832 1.036 1.036 0 01-.807.373H65.96l1.688-6.353h-1.64l-2.087 7.86H76.6a2.65 2.65 0 002.06-.953c.499-.606.671-1.38.473-2.126l-.245-.92zM24.352 9.872h1.59V2.353C26.975 1.311 27.624.417 27.902 0h-1.945a17.414 17.414 0 01-5.059 4.271V5.99a18.76 18.76 0 003.454-2.205v6.087zM30.37 10.178h-1.59V11.7h-7.882v1.506h7.882v4.25h1.59v-4.25h7.882V11.7H30.37zM38.252 1.347c-.679.381-2.613 1.419-4.815 2.187v1.597c1.945-.624 3.723-1.476 4.815-2.047V1.347z" fill="#131415" mask="url(#b)"/><path d="M33.624 8.306c-.698 0-1.265-.537-1.265-1.198V0h-1.59v7.108c0 1.492 1.28 2.705 2.855 2.705h4.628V8.306h-4.628zM17.354 5.299h-6.407V2.282c1.175-.085 3.552-.3 5.919-.741V.003c-3.242.633-6.722.822-6.758.824l-.751.039v10.268c0 2.883-.07 4.515-.695 6.321h1.69c.48-1.484.595-3.567.595-6.32v-4.33h3.51v10.65h1.59V6.805h1.307V5.299zM7.932 13.533c0 1.692.222 2.63.27 2.813H6.84c-.5-1.115-.499-2.21-.499-3.575v-.904h1.59v1.666zM.27 13.533c0 1.692-.221 2.63-.27 2.813h1.363c.499-1.115.498-2.21.498-3.575v-.904H.271v1.666zM1.918 3.083H.288c.092.412.404 1.423.84 2.154h1.466a18.555 18.555 0 01-.676-2.154M6.327 3.083h1.63c-.091.412-.403 1.423-.839 2.154H5.652c.339-.887.555-1.66.675-2.154M4.47 0H2.697l.55 1.051H0v1.507h8.24V1.051H5.02z" fill="#131415" mask="url(#b)"/><path d="M0 7.243h3.324v1.734H0v1.506h3.324v4.761c0 .372-.247.812-.742 1.086v1.125c1.079 0 2.333-.966 2.333-2.21v-4.762h3.324V8.977H4.915V7.243h3.324V5.737H0v1.506z" fill="#131415" mask="url(#b)"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 128 KiB

@ -0,0 +1,227 @@
[
{
"name": "身边云",
"logo": "/img/company_logos/serviceshare.png",
"url": "https://serviceshare.com"
},
{
"name": "思派健康科技",
"logo": "/img/company_logos/medbanks.png",
"url": "https://www.medbanks.cn"
},
{
"name": "北京智合联创科技有限公司",
"logo": "/img/company_logos/zhlc.png",
"url": "http://www.zhlc.com.cn"
},
{
"name": "神州数码(北京)",
"logo": "/img/company_logos/digitalchina.png",
"url": "http://www.digitalchina.com"
},
{
"name": "PayerMax",
"logo": "/img/company_logos/payermax.png",
"url": "https://www.payermax.com/"
},
{
"name": "轻松到家",
"logo": "",
"url": "http://www.uyess.com/index.html"
},
{
"name": "某商业银行股份有限公司",
"logo": "",
"url": "https://github.com/opengoofy/hippo4j/issues/13"
},
{
"name": "某国际物流信息股份有限公司",
"logo": "",
"url": "https://github.com/opengoofy/hippo4j/issues/13"
},
{
"name": "萨科(深圳)科技有限公司",
"logo": "/img/company_logos/lbdj.png",
"url": "https://www.lbdj.com/"
},
{
"name": "广东天枢新能源科技有限公司",
"logo": "/img/company_logos/tianshu.png",
"url": "https://gd-tianshu.com/"
},
{
"name": "FitTime",
"logo": "/img/company_logos/fittime.png",
"url": "http://fittime.com/"
},
{
"name": "百强国际物流",
"logo": "",
"url": "https://github.com/opengoofy/hippo4j/issues/13"
},
{
"name": "海南某深圳分公司",
"logo": "",
"url": "https://github.com/opengoofy/hippo4j/issues/13"
},
{
"name": "众合云科51社保",
"logo": "",
"url": "https://home.101hr.com/"
},
{
"name": "好货云店",
"logo": "/img/company_logos/haohuoyundian.png",
"url": "https://pc.haohuoyundian.com/"
},
{
"name": "斗象科技",
"logo": "/img/company_logos/tophant.png",
"url": "https://www.tophant.com/"
},
{
"name": "深圳航天信息有限公司",
"logo": "/img/company_logos/aisino.png",
"url": "http://sz.aisino.com/"
},
{
"name": "新东方教育科技集团",
"logo": "/img/company_logos/xdf.png",
"url": "https://www.xdf.cn/"
},
{
"name": "远眺网络科技有限公司",
"logo": "/img/company_logos/yuantiaokj.png",
"url": "https://www.yuantiaokj.com/"
},
{
"name": "浙江吉利控股集团有限公司",
"logo": "/img/company_logos/geely.png",
"url": "https://www.geely.com/"
},
{
"name": "三立人(深圳)科技有限公司-焦内",
"logo": "/img/company_logos/bananain.png",
"url": "https://www.bananain.com/"
},
{
"name": "上海天猫好房添玑网络服务有限公司",
"logo": "/img/company_logos/eju.png",
"url": "http://www.eju.com/"
},
{
"name": "郑州力通水务",
"logo": "/img/company_logos/zzltsw.png",
"url": "http://www.zzltsw.com/"
},
{
"name": "北京自如信息科技有限公司",
"logo": "/img/company_logos/ziroom.png",
"url": "https://www.ziroom.com/"
},
{
"name": "北京易车信息科技有限公司",
"logo": "/img/company_logos/yiche.png",
"url": "https://www.yiche.com/"
},
{
"name": "中新软件(上海)有限公司",
"logo": "",
"url": "http://www.5000m.com"
},
{
"name": "深圳市上马网络技术有限公司",
"logo": "/img/company_logos/shangmanet.png",
"url": "https://www.shangmanet.com"
},
{
"name": "兰亭集势(成都)科技有限公司",
"logo": "/img/company_logos/lightinthebox.png",
"url": "https://www.lightinthebox.com/"
},
{
"name": "杭州数理大数据有限公司",
"logo": "",
"url": "https://www.data4truth.com/#/"
},
{
"name": "九四智能",
"logo": "/img/company_logos/94ai.png",
"url": "https://94ai.com"
},
{
"name": "新华智云科技有限公司",
"logo": "/img/company_logos/xinhuazhiyun.png",
"url": "https://www.xinhuazhiyun.com"
},
{
"name": "银丰新融",
"logo": "/img/company_logos/ist.png",
"url": "https://www.ist.com.cn"
},
{
"name": "深圳市帮客帮科技有限公司",
"logo": "/img/company_logos/bangkebang.png",
"url": "https://www.bangkebang.com"
},
{
"name": "重庆威爱云科技有限公司",
"logo": "",
"url": "https://51vive.com"
},
{
"name": "网易有道信息技术(北京)有限公司",
"logo": "/img/company_logos/youdao.png",
"url": "https://www.youdao.com"
},
{
"name": "神州数码(西安)",
"logo": "/img/company_logos/digitalchina.png",
"url": "https://www.digitalchina.com"
},
{
"name": "广联达科技股份有限公司",
"logo": "/img/company_logos/glodon.png",
"url": "https://www.glodon.com"
},
{
"name": "天健联创控股集团有限公司",
"logo": "/img/company_logos/tjlc.png",
"url": "https://www.tjlc.com.cn"
},
{
"name": "知乎",
"logo": "/img/company_logos/zhihu.png",
"url": "https://www.zhihu.com/"
},
{
"name": "广东谷通科技有限公司",
"logo": "/img/company_logos/duofriend.png",
"url": "https://www.duofriend.com"
},
{
"name": "成都全域智旅科技有限公司",
"logo": "/img/company_logos/qyzl.png",
"url": "http://qyzl.com"
},
{
"name": "深圳市华云中盛科技股份有限公司",
"logo": "/img/company_logos/hua-cloud.png",
"url": "http://www.hua-cloud.cn"
},
{
"name": "智慧芽信息科技(苏州)有限公司",
"logo": "/img/company_logos/zhihuiya.png",
"url": "https://www.zhihuiya.com"
},
{
"name": "滴滴出行",
"logo": "/img/company_logos/didiglobal.svg",
"url": "https://www.didiglobal.com"
},
{
"name": "杭州源诚科技有限公司",
"logo": "/img/company_logos/yckjdata.png",
"url": "http://www.yckjdata.com"
}
]

@ -0,0 +1,10 @@
module.exports = {
content: ["./src/**/*.{js,jsx,ts,tsx}"],
theme: {
extend: {},
},
plugins: [],
corePlugins: { preflight: false },
// set dark mode. example <h1 className="text-black dark:text-white">Hello, World!</h1>
darkMode: ["class", '[data-theme="dark"]'],
};

@ -25,11 +25,11 @@ spring.dynamic.thread-pool.monitor.initial-delay=10000
spring.dynamic.thread-pool.monitor.collect-interval=5000
spring.dynamic.thread-pool.notify-platforms[0].platform=WECHAT
spring.dynamic.thread-pool.notify-platforms[0].token=ac0426a5-c712-474c-9bff-72b8b8f5caff
spring.dynamic.thread-pool.notify-platforms[1].platform=DING
spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55
spring.dynamic.thread-pool.notify-platforms[2].platform=LARK
spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e
spring.dynamic.thread-pool.notify-platforms[0].token=ec3be378-6c99-45d2-a147-b400c7e94a08
# spring.dynamic.thread-pool.notify-platforms[1].platform=DING
# spring.dynamic.thread-pool.notify-platforms[1].token=56417ebba6a27ca352f0de77a2ae9da66d01f39610b5ee8a6033c60ef9071c55
# spring.dynamic.thread-pool.notify-platforms[2].platform=LARK
# spring.dynamic.thread-pool.notify-platforms[2].token=2cbf2808-3839-4c26-a04d-fd201dd51f9e
spring.dynamic.thread-pool.nacos.data-id=hippo4j-nacos.yaml
spring.dynamic.thread-pool.nacos.group=DEFAULT_GROUP

@ -18,7 +18,7 @@
package cn.hippo4j.example.core.handler;
import cn.hippo4j.common.toolkit.StringUtil;
import cn.hippo4j.core.toolkit.ExecutorTraceContextUtil;
import cn.hippo4j.threadpool.alarm.toolkit.ExecutorTraceContextUtil;
import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;

@ -17,9 +17,9 @@
package cn.hippo4j.example.core.inittest;
import cn.hippo4j.common.executor.ThreadPoolExecutorHolder;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.example.core.constant.GlobalTestConstant;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -47,8 +47,8 @@ public class AlarmSendMessageTest {
public void alarmSendMessageTest() {
ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor();
scheduledThreadPool.scheduleWithFixedDelay(() -> {
DynamicThreadPoolWrapper poolWrapper = GlobalThreadPoolManage.getExecutorService(GlobalTestConstant.MESSAGE_PRODUCE);
ThreadPoolExecutor poolExecutor = poolWrapper.getExecutor();
ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(GlobalTestConstant.MESSAGE_PRODUCE);
ThreadPoolExecutor poolExecutor = executorHolder.getExecutor();
try {
poolExecutor.execute(() -> {
try {

@ -24,7 +24,7 @@ import cn.hippo4j.common.model.register.DynamicThreadPoolRegisterWrapper;
import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterCoreNotifyParameter;
import cn.hippo4j.common.model.register.notify.DynamicThreadPoolRegisterServerNotifyParameter;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.message.enums.NotifyPlatformEnum;
import cn.hippo4j.threadpool.message.api.NotifyPlatformEnum;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ThreadPoolExecutor;

@ -17,9 +17,9 @@
package cn.hippo4j.example.core.inittest;
import cn.hippo4j.common.executor.ThreadPoolExecutorHolder;
import cn.hippo4j.common.executor.ThreadPoolExecutorRegistry;
import cn.hippo4j.example.core.constant.GlobalTestConstant;
import cn.hippo4j.core.executor.manage.GlobalThreadPoolManage;
import cn.hippo4j.core.executor.DynamicThreadPoolWrapper;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;
@ -63,8 +63,8 @@ public class TaskDecoratorTest {
MDC.put(PLACEHOLDER, "View the official website: https://www.hippo4j.cn");
try {
Thread.sleep(SLEEP_TIME);
DynamicThreadPoolWrapper poolWrapper = GlobalThreadPoolManage.getExecutorService(GlobalTestConstant.MESSAGE_PRODUCE);
ThreadPoolExecutor threadPoolExecutor = poolWrapper.getExecutor();
ThreadPoolExecutorHolder executorHolder = ThreadPoolExecutorRegistry.getHolder(GlobalTestConstant.MESSAGE_PRODUCE);
ThreadPoolExecutor threadPoolExecutor = executorHolder.getExecutor();
threadPoolExecutor.execute(() -> log.info("Pass context via taskDecorator MDC: {}", MDC.get(PLACEHOLDER)));
} catch (InterruptedException e) {
throw new RuntimeException(e);

@ -33,7 +33,7 @@
</dependency>
<dependency>
<groupId>cn.hippo4j</groupId>
<artifactId>hippo4j-threadpool-server-spring-boot-starter</artifactId>
<artifactId>hippo4j-threadpool-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>

@ -33,7 +33,7 @@
</dependency>
<dependency>
<groupId>cn.hippo4j</groupId>
<artifactId>hippo4j-threadpool-server-spring-boot-starter</artifactId>
<artifactId>hippo4j-threadpool-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>

@ -33,7 +33,7 @@
</dependency>
<dependency>
<groupId>cn.hippo4j</groupId>
<artifactId>hippo4j-threadpool-server-spring-boot-starter</artifactId>
<artifactId>hippo4j-threadpool-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save