Compare commits
22 Commits
dubbo-3.3.
...
3.2
| Author | SHA1 | Date |
|---|---|---|
|
|
11d5bd9ffa | |
|
|
30bf8c4de8 | |
|
|
865e8b05cf | |
|
|
2dc0f9a374 | |
|
|
d98b1e821f | |
|
|
04c16fa944 | |
|
|
7d5fa50783 | |
|
|
99601a6198 | |
|
|
0a48e9d8dc | |
|
|
4be8594bde | |
|
|
9d333ba906 | |
|
|
c61cc9f719 | |
|
|
cd89d192b6 | |
|
|
8200f3ed2e | |
|
|
b76e0597f5 | |
|
|
87ab5a6964 | |
|
|
61effff7e8 | |
|
|
086cdd942c | |
|
|
dc2465fff7 | |
|
|
0ccd5a1953 | |
|
|
293711e591 | |
|
|
5ad25875b9 |
42
.artifacts
42
.artifacts
|
|
@ -19,8 +19,8 @@
|
|||
dubbo
|
||||
dubbo-auth
|
||||
dubbo-apache-release
|
||||
dubbo-all-shaded
|
||||
dubbo-bom
|
||||
dubbo-build-tools
|
||||
dubbo-cluster
|
||||
dubbo-common
|
||||
dubbo-compatible
|
||||
|
|
@ -28,18 +28,21 @@ dubbo-compiler
|
|||
dubbo-config
|
||||
dubbo-config-api
|
||||
dubbo-config-spring
|
||||
dubbo-config-spring6
|
||||
dubbo-configcenter
|
||||
dubbo-configcenter-file
|
||||
dubbo-configcenter-apollo
|
||||
dubbo-configcenter-nacos
|
||||
dubbo-configcenter-zookeeper
|
||||
dubbo-container
|
||||
dubbo-container-api
|
||||
dubbo-container-spring
|
||||
dubbo-core-spi
|
||||
dubbo-dependencies
|
||||
dubbo-dependencies-all
|
||||
dubbo-dependencies-bom
|
||||
dubbo-dependencies-zookeeper
|
||||
dubbo-dependencies-zookeeper-curator5
|
||||
dubbo-distribution
|
||||
dubbo-filter
|
||||
dubbo-filter-cache
|
||||
dubbo-filter-validation
|
||||
dubbo-kubernetes
|
||||
|
|
@ -58,9 +61,11 @@ dubbo-metrics-metadata
|
|||
dubbo-metrics-prometheus
|
||||
dubbo-metrics-registry
|
||||
dubbo-metrics-config-center
|
||||
dubbo-metrics-netty
|
||||
dubbo-metrics-event
|
||||
dubbo-monitor
|
||||
dubbo-monitor-api
|
||||
dubbo-monitor-default
|
||||
dubbo-native
|
||||
dubbo-native-plugin
|
||||
dubbo-parent
|
||||
dubbo-plugin
|
||||
dubbo-qos
|
||||
|
|
@ -74,15 +79,16 @@ dubbo-registry-nacos
|
|||
dubbo-registry-zookeeper
|
||||
dubbo-remoting
|
||||
dubbo-remoting-api
|
||||
dubbo-remoting-http12
|
||||
dubbo-remoting-http3
|
||||
dubbo-remoting-http
|
||||
dubbo-remoting-netty
|
||||
dubbo-remoting-netty4
|
||||
dubbo-remoting-zookeeper
|
||||
dubbo-remoting-zookeeper-curator5
|
||||
dubbo-rpc
|
||||
dubbo-rpc-api
|
||||
dubbo-rpc-dubbo
|
||||
dubbo-rpc-injvm
|
||||
dubbo-rpc-rest
|
||||
dubbo-rpc-triple
|
||||
dubbo-security
|
||||
dubbo-serialization
|
||||
|
|
@ -94,28 +100,18 @@ dubbo-spring-boot
|
|||
dubbo-spring-boot-actuator
|
||||
dubbo-spring-boot-actuator-compatible
|
||||
dubbo-spring-boot-autoconfigure
|
||||
dubbo-spring-boot-3-autoconfigure
|
||||
dubbo-spring-boot-autoconfigure-compatible
|
||||
dubbo-spring-boot-compatible
|
||||
dubbo-observability-spring-boot-starters
|
||||
dubbo-observability-spring-boot-autoconfigure
|
||||
dubbo-tracing-brave-zipkin-spring-boot-starter
|
||||
dubbo-tracing-otel-zipkin-spring-boot-starter
|
||||
dubbo-tracing-otel-otlp-spring-boot-starter
|
||||
dubbo-observability-spring-boot-starter
|
||||
dubbo-spring-boot-observability-starters
|
||||
dubbo-spring-boot-observability-autoconfigure
|
||||
dubbo-spring-boot-tracing-brave-zipkin-starter
|
||||
dubbo-spring-boot-tracing-otel-zipkin-starter
|
||||
dubbo-spring-boot-tracing-otel-otlp-starter
|
||||
dubbo-spring-boot-observability-starter
|
||||
dubbo-spring-boot-starter
|
||||
dubbo-spring-boot-starters
|
||||
dubbo-spring-boot-interceptor
|
||||
dubbo-nacos-spring-boot-starter
|
||||
dubbo-zookeeper-spring-boot-starter
|
||||
dubbo-zookeeper-curator5-spring-boot-starter
|
||||
dubbo-sentinel-spring-boot-starter
|
||||
dubbo-seata-spring-boot-starter
|
||||
dubbo-spring-security
|
||||
dubbo-tracing
|
||||
dubbo-xds
|
||||
dubbo-plugin-loom
|
||||
dubbo-rest-jaxrs
|
||||
dubbo-rest-servlet
|
||||
dubbo-rest-spring
|
||||
dubbo-triple-servlet
|
||||
|
|
|
|||
|
|
@ -1,8 +1,21 @@
|
|||
## What is the purpose of the change?
|
||||
## What is the purpose of the change
|
||||
|
||||
|
||||
|
||||
## Brief changelog
|
||||
|
||||
|
||||
## Verifying this change
|
||||
|
||||
|
||||
<!-- Follow this checklist to help us incorporate your contribution quickly and easily: -->
|
||||
|
||||
## Checklist
|
||||
- [x] Make sure there is a [GitHub_issue](https://github.com/apache/dubbo/issues) field for the change.
|
||||
- [x] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
|
||||
- [x] Write necessary unit-test to verify your logic correction. If the new feature or significant change is committed, please remember to add sample in [dubbo samples](https://github.com/apache/dubbo-samples) project.
|
||||
- [x] Make sure gitHub actions can pass. [Why the workflow is failing and how to fix it?](./CONTRIBUTING.md)
|
||||
- [x] Make sure there is a [GitHub_issue](https://github.com/apache/dubbo/issues) field for the change (usually before you start working on it). Trivial changes like typos do not require a GitHub issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
|
||||
- [ ] Each commit in the pull request should have a meaningful subject line and body.
|
||||
- [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
|
||||
- [ ] Check if is necessary to patch to Dubbo 3 if you are work on Dubbo 2.7
|
||||
- [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add sample in [dubbo samples](https://github.com/apache/dubbo-samples) project.
|
||||
- [ ] Add some description to [dubbo-website](https://github.com/apache/dubbo-website) project if you are requesting to add a feature.
|
||||
- [ ] GitHub Actions works fine on your own branch.
|
||||
- [ ] If this contribution is large, please follow the [Software Donation Guide](https://github.com/apache/dubbo/wiki/Software-donation-guide).
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ jobs:
|
|||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: 21
|
||||
java-version: 8
|
||||
- uses: actions/cache@v3
|
||||
name: "Cache local Maven repository"
|
||||
with:
|
||||
|
|
@ -199,6 +199,7 @@ jobs:
|
|||
env:
|
||||
DISABLE_FILE_SYSTEM_TEST: true
|
||||
CURRENT_ROLE: ${{ matrix.case-role }}
|
||||
DUBBO_DEFAULT_SERIALIZATION: fastjson2
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
|
|
@ -237,7 +238,7 @@ jobs:
|
|||
openssl rsautl -decrypt -in ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace }}/.tmp/rsa/rsa_private.pem
|
||||
- name: "Test with Maven with SonarCloud Scan"
|
||||
if: ${{ github.repository == 'apache/dubbo' }}
|
||||
timeout-minutes: 90
|
||||
timeout-minutes: 70
|
||||
env:
|
||||
# Needed to get some information about the pull request, if any
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -246,7 +247,7 @@ jobs:
|
|||
./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache -Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper -Dsonar.coverage.jacoco.xmlReportPaths=dubbo-test/dubbo-dependencies-all/target/site/jacoco-aggregate/jacoco.xml -Dsonar.login=${SONAR_TOKEN}
|
||||
- name: "Test with Maven without SonarCloud Scan"
|
||||
if: ${{ github.repository != 'apache/dubbo' }}
|
||||
timeout-minutes: 90
|
||||
timeout-minutes: 70
|
||||
run: |
|
||||
./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress --fail-fast clean test verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false -Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true -DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
|
||||
- name: "Upload coverage result"
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: 8
|
||||
java-version: 21
|
||||
- uses: actions/cache@v3
|
||||
name: "Cache local Maven repository"
|
||||
with:
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ jobs:
|
|||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: 21
|
||||
java-version: 8
|
||||
- uses: actions/cache@v3
|
||||
name: "Cache local Maven repository"
|
||||
with:
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@ header:
|
|||
- 'dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/EmbeddedZooKeeper.java'
|
||||
- 'dubbo-test/dubbo-test-common/src/main/java/org/apache/dubbo/test/common/utils/TestSocketUtils.java'
|
||||
- 'dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriHttp2RemoteFlowController.java'
|
||||
- 'dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/cors/CorsHeaderFilter.java'
|
||||
- 'dubbo-common/src/main/java/org/apache/dubbo/common/threadpool/serial/SerializingExecutor.java'
|
||||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/AbstractAotMojo.java'
|
||||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/AbstractDependencyFilterMojo.java'
|
||||
|
|
@ -96,15 +95,11 @@ header:
|
|||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/MatchingGroupIdFilter.java'
|
||||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunArguments.java'
|
||||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/aot/RunProcess.java'
|
||||
- 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/generate/BasicJsonWriter.java'
|
||||
- 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/api/ExecutableMode.java'
|
||||
- 'dubbo-plugin/dubbo-native/src/main/java/org/apache/dubbo/aot/api/MemberCategory.java'
|
||||
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/BasicJsonWriter.java'
|
||||
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/ExecutableMode.java'
|
||||
- 'dubbo-native/src/main/java/org/apache/dubbo/aot/generate/MemberCategory.java'
|
||||
- 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboMergingDigest.java'
|
||||
- 'dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/DubboAbstractTDigest.java'
|
||||
- 'dubbo-common/src/main/java/org/apache/dubbo/common/logger/helpers/FormattingTuple.java'
|
||||
- 'dubbo-common/src/main/java/org/apache/dubbo/common/logger/helpers/MessageFormatter.java'
|
||||
- 'dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/protoc/DubboProtocCompilerMojo.java'
|
||||
- 'dubbo-plugin/dubbo-compiler/src/main/java/org/apache/dubbo/gen/utils/ProtoTypeMap.java'
|
||||
|
||||
comment: on-failure
|
||||
|
||||
|
|
@ -203,26 +198,10 @@ dependency:
|
|||
license: Apache-2.0
|
||||
- name: org.sonatype.plexus:plexus-cipher
|
||||
license: Apache-2.0
|
||||
- name: com.alibaba.csp:sentinel-apache-dubbo3-adapter
|
||||
license: Apache-2.0
|
||||
- name: com.alibaba.csp:sentinel-transport-simple-http
|
||||
license: Apache-2.0
|
||||
- name: com.alibaba.csp:sentinel-transport-common
|
||||
license: Apache-2.0
|
||||
- name: com.alibaba.csp:sentinel-datasource-extension
|
||||
license: Apache-2.0
|
||||
- name: com.alibaba.csp:sentinel-core
|
||||
license: Apache-2.0
|
||||
- name: com.google.protobuf:protobuf-java
|
||||
license: BSD 3-clause
|
||||
- name: com.google.protobuf:protobuf-java-util
|
||||
license: BSD 3-clause
|
||||
- name: org.antlr:antlr4
|
||||
license: BSD 3-clause
|
||||
- name: org.antlr:antlr-runtime
|
||||
license: BSD 3-clause
|
||||
- name: org.antlr:ST4
|
||||
license: BSD 3-clause
|
||||
# multi license
|
||||
- name: org.javassist:javassist
|
||||
license: Apache-2.0
|
||||
|
|
|
|||
20
NOTICE
20
NOTICE
|
|
@ -16,23 +16,3 @@ Copyright 2014 The Netty Project
|
|||
This product contains code form the t-digest Project:
|
||||
The code for the t-digest was originally authored by Ted Dunning
|
||||
Adrien Grand contributed the heart of the AVLTreeDigest (https://github.com/jpountz)
|
||||
|
||||
This product contains the following code copied from Maven Protocol Buffers Plugin:
|
||||
dubbo-maven-plugin/src/main/java/org/apache/dubbo/maven/plugin/protoc/DubboProtocCompilerMojo.java
|
||||
|
||||
Maven Protocol Buffers Plugin
|
||||
=============================
|
||||
Copyright (c) 2016 Maven Protocol Buffers Plugin Authors. All rights reserved.
|
||||
|
||||
This product contains the following code copied from grpc-java-contrib:
|
||||
dubbo-plugin/dubbo-compiler/src/main/java/org/apache/dubbo/gen/utils/ProtoTypeMap.java
|
||||
Some portions of this file Copyright (c) 2019, Salesforce.com, Inc. and licensed under the BSD 3-Clause License
|
||||
|
||||
grpc-java-contrib
|
||||
====================
|
||||
Copyright (c) 2019, Salesforce.com, Inc.
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
236
README.md
236
README.md
|
|
@ -1,68 +1,187 @@
|
|||
# Apache Dubbo Project
|
||||
|
||||
[](https://github.com/apache/dubbo/actions/workflows/build-and-test-pr.yml)
|
||||
[](https://codecov.io/gh/apache/dubbo)
|
||||
[](https://codecov.io/gh/apache/dubbo)
|
||||

|
||||

|
||||
[](http://isitmaintained.com/project/apache/dubbo "Average time to resolve an issue")
|
||||
[](http://isitmaintained.com/project/apache/dubbo "Percentage of issues still open")
|
||||
|
||||
Apache Dubbo is an easy-to-use Web and RPC framework that provides multiple
|
||||
language implementations(Java, [Go](https://github.com/apache/dubbo-go), [Rust](https://github.com/apache/dubbo-rust), [Node.js](https://github.com/apache/dubbo-js), [Web](https://github.com/apache/dubbo-js)) for communication, service discovery, traffic management,
|
||||
observability, security, tools, and best practices for building enterprise-ready microservices.
|
||||
Apache Dubbo is a high-performance, Java-based open-source RPC framework. Please visit the [official site](http://dubbo.apache.org) for the quick start guide and documentation, as well as the [wiki](https://github.com/apache/dubbo/wiki) for news, FAQ, and release notes.
|
||||
|
||||
We are now collecting Dubbo user info to help us to improve Dubbo further. Kindly support us by providing your usage information on [Wanted: who's using dubbo](https://github.com/apache/dubbo/discussions/13842), thanks :)
|
||||
|
||||
## Architecture
|
||||
|
||||

|
||||
|
||||
* Consumer and provider communicate with each other using RPC protocol like triple, tcp, rest, etc.
|
||||
* Consumers automatically trace provider instances registered in registries(Zookeeper, Nacos) and distribute traffic among them by following traffic strategies.
|
||||
* Rich features for monitoring and managing the cluster with dynamic configuration, metrics, tracing, security, and visualized console.
|
||||
## Features
|
||||
|
||||
* Transparent interface based RPC
|
||||
* Intelligent load balancing
|
||||
* Automatic service registration and discovery
|
||||
* High extensibility
|
||||
* Runtime traffic routing
|
||||
* Visualized service governance
|
||||
|
||||
## Getting started
|
||||
Follow the instructions below to learn how to:
|
||||
|
||||
### Programming with lightweight RPC API
|
||||
[5 minutes step-by-step guide](https://dubbo.apache.org/zh-cn/overview/quickstart/rpc/java)
|
||||
The following code snippet comes from [Dubbo Samples](https://github.com/apache/dubbo-samples.git). You may clone the sample project and step into the `dubbo-samples-api` subdirectory before proceeding.
|
||||
|
||||
Dubbo supports building RPC services with only a few lines of code while depending only on a lightweight SDK (<10MB). The protocol on the wire can be [Triple](https://dubbo.apache.org/zh-cn/overview/reference/protocols/triple/)(fully gRPC compatible and HTTP-friendly), Dubbo2(TCP), REST, or any protocol of your choice.
|
||||
```bash
|
||||
git clone https://github.com/apache/dubbo-samples.git
|
||||
cd dubbo-samples/1-basic/dubbo-samples-api
|
||||
```
|
||||
|
||||
There's a [README](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/README.md) file under `dubbo-samples-api` directory. We recommend referencing the samples in that directory by following the below-mentioned instructions:
|
||||
|
||||
### Maven dependency
|
||||
|
||||
```xml
|
||||
<properties>
|
||||
<dubbo.version>3.2.13-SNAPSHOT</dubbo.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.dubbo</groupId>
|
||||
<artifactId>dubbo</artifactId>
|
||||
<version>${dubbo.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dubbo</groupId>
|
||||
<artifactId>dubbo-dependencies-zookeeper</artifactId>
|
||||
<version>${dubbo.version}</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
### Define service interfaces
|
||||
|
||||
```java
|
||||
package org.apache.dubbo.samples.api;
|
||||
|
||||
public interface GreetingsService {
|
||||
String sayHi(String name);
|
||||
}
|
||||
```
|
||||
|
||||
*See [api/GreetingsService.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.java) on GitHub.*
|
||||
|
||||
### Implement service interface for the provider
|
||||
|
||||
```java
|
||||
package org.apache.dubbo.samples.provider;
|
||||
|
||||
import org.apache.dubbo.samples.api.GreetingsService;
|
||||
|
||||
public class GreetingsServiceImpl implements GreetingsService {
|
||||
@Override
|
||||
public String sayHi(String name) {
|
||||
return "hi, " + name;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
*See [provider/GreetingsServiceImpl.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java) on GitHub.*
|
||||
|
||||
### Start service provider
|
||||
|
||||
```java
|
||||
package org.apache.dubbo.samples.provider;
|
||||
|
||||
|
||||
### Building a microservice application with Spring Boot
|
||||
[5 minutes step-by-step guide](https://dubbo.apache.org/zh-cn/overview/quickstart/microservice)
|
||||
import org.apache.dubbo.config.ApplicationConfig;
|
||||
import org.apache.dubbo.config.RegistryConfig;
|
||||
import org.apache.dubbo.config.ServiceConfig;
|
||||
import org.apache.dubbo.samples.api.GreetingsService;
|
||||
|
||||
It's highly recommended to start your microservice application with the Spring Boot Starter `dubbo-spring-boot-starter` provided by Dubbo. With only a single dependency and yaml file, and optionally a bunch of other useful spring boot starters, you can enable all of the Dubo features like service discovery, observability, tracing, etc.
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
Next, learn how to [deploy](https://dubbo.apache.org/zh-cn/overview/tasks/deploy/), [monitor](https://dubbo.apache.org/zh-cn/overview/tasks/observability/), and [manage the traffic](https://dubbo.apache.org/zh-cn/overview/tasks/traffic-management/) of your Dubbo application and cluster.
|
||||
public class Application {
|
||||
private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
|
||||
|
||||
## More Features
|
||||
Get more details by visiting the links below to get your hands dirty with some well-designed tasks on our website.
|
||||
public static void main(String[] args) throws Exception {
|
||||
ServiceConfig<GreetingsService> service = new ServiceConfig<>();
|
||||
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
|
||||
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
|
||||
service.setInterface(GreetingsService.class);
|
||||
service.setRef(new GreetingsServiceImpl());
|
||||
service.export();
|
||||
|
||||
* [Launch a Dubbo project](https://dubbo.apache.org/zh-cn/overview/tasks/develop/template/)
|
||||
* [RPC protocols](https://dubbo.apache.org/zh-cn/overview/core-features/protocols/)
|
||||
* [Traffic management](https://dubbo.apache.org/zh-cn/overview/core-features/traffic/)
|
||||
* [Service discovery](https://dubbo.apache.org/zh-cn/overview/core-features/service-discovery/)
|
||||
* [Observability](https://dubbo.apache.org/zh-cn/overview/core-features/observability/)
|
||||
* [Extensibility](https://dubbo.apache.org/zh-cn/overview/core-features/extensibility/)
|
||||
* [Security](https://dubbo.apache.org/zh-cn/overview/core-features/security/)
|
||||
* [Visualized console and control plane](https://dubbo.apache.org/zh-cn/overview/reference/admin/)
|
||||
* [Kubernetes and Service mesh](https://dubbo.apache.org/zh-cn/overview/core-features/service-mesh/)
|
||||
System.out.println("dubbo service started");
|
||||
new CountDownLatch(1).await();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Which Dubbo version should I use?
|
||||
| **Dubbo3** | **JDK** | **Dependencies** | **Description** |
|
||||
| --- | --- | --- | --- |
|
||||
| 3.3.0-beta| 1.8 ~ 17 | [dependency list](https://github.com/apache/dubbo/blob/3.3/dubbo-dependencies-bom/pom.xml#L94) | **- Unstable version** <br/> **- Features** <br/> - Triple - gRPC and cURL compatible.<br/> - Rest-style programming support.<br/> - Spring Boot Starters. |
|
||||
| 3.2.5 | 1.8 ~ 17 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-3.2.5/dubbo-dependencies-bom/pom.xml#L94) | **- Stable version (active)** <br/> **- Features** <br/> - Out-of-box metrics and tracing support.<br/> - Threadpool Isolation<br/> - 30% performance<br/> - Native Image|
|
||||
| 3.1.11 | 1.8 ~ 11 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-3.2.11/dubbo-dependencies-bom/pom.xml#L94) | **Stable version (not active)** |
|
||||
*See [provider/Application.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-spring-xml/src/main/java/org/apache/dubbo/samples/provider/Application.java) on GitHub.*
|
||||
|
||||
| **Dubbo2** | **JDK** | **Dependencies** | **Description** |
|
||||
| --- | --- | --- | --- |
|
||||
| 2.7.23 | 1.8 | [dependency list](https://github.com/apache/dubbo/blob/dubbo-2.7.23/dubbo-dependencies-bom/pom.xml#L92) | EOL |
|
||||
| 2.6.x, 2.5.x | 1.6 ~ 1.7 | | EOL |
|
||||
### Build and run the provider
|
||||
|
||||
## Contributing
|
||||
See [CONTRIBUTING](https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
|
||||
```bash
|
||||
mvn clean package
|
||||
mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.provider.Application exec:java
|
||||
```
|
||||
|
||||
### Call remote service in the consumer
|
||||
|
||||
```java
|
||||
package org.apache.dubbo.samples.client;
|
||||
|
||||
|
||||
import org.apache.dubbo.config.ApplicationConfig;
|
||||
import org.apache.dubbo.config.ReferenceConfig;
|
||||
import org.apache.dubbo.config.RegistryConfig;
|
||||
import org.apache.dubbo.samples.api.GreetingsService;
|
||||
|
||||
public class Application {
|
||||
private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
|
||||
|
||||
public static void main(String[] args) {
|
||||
ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
|
||||
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
|
||||
reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
|
||||
reference.setInterface(GreetingsService.class);
|
||||
GreetingsService service = reference.get();
|
||||
String message = service.sayHi("dubbo");
|
||||
System.out.println(message);
|
||||
}
|
||||
}
|
||||
```
|
||||
*See [client/Application.java](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee6e575005b32f195c442c35a2/1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java) on GitHub.*
|
||||
|
||||
### Build and run the consumer
|
||||
|
||||
```bash
|
||||
mvn clean package
|
||||
mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.client.Application exec:java
|
||||
```
|
||||
|
||||
The consumer will print out `hi, dubbo` on the screen.
|
||||
|
||||
|
||||
### Next steps
|
||||
|
||||
* [Your first Dubbo application](https://dubbo.apache.org/en/blog/2018/08/07/dubbo-101/) - A 101 tutorial to reveal more details, with the same code above.
|
||||
* [Dubbo user manual](https://dubbo.apache.org/en/overview/what/) - How to use Dubbo and all its features.
|
||||
* [Dubbo developer guide](https://dubbo.apache.org/en/docs3-v2/java-sdk/) - How to involve in Dubbo development.
|
||||
* [Dubbo admin manual](https://dubbo.apache.org/en/docs/v2.7/admin/ops/) - How to admin and manage Dubbo services.
|
||||
|
||||
## Building
|
||||
|
||||
If you want to try out the cutting-edge features, you can build with the following commands. (Java 1.8 is needed to build the master branch)
|
||||
|
||||
```
|
||||
mvn clean install
|
||||
```
|
||||
|
||||
## Recommended Test Environment
|
||||
To avoid intermittent test failures (i.e., flaky tests), it is recommended to have a machine or virtual machine with the following specifications:
|
||||
|
||||
* Minimum of 2CPUs.
|
||||
* Minimum of 2Gb of RAM.
|
||||
|
||||
### How does the Dubbo Community collaborate?
|
||||
|
||||
|
|
@ -123,39 +242,13 @@ Please follow the [template](https://github.com/apache/dubbo/issues/new?template
|
|||
Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org) privately.
|
||||
|
||||
## Contact
|
||||
* WeChat: apachedubbo
|
||||
* DingTalk group: 37290003945
|
||||
* Mailing list: [guide](https://dubbo.apache.org/zh-cn/contact/)
|
||||
|
||||
* Mailing list:
|
||||
* dev list: for dev/user discussion. [subscribe](mailto:dev-subscribe@dubbo.apache.org), [unsubscribe](mailto:dev-unsubscribe@dubbo.apache.org), [archive](https://lists.apache.org/list.html?dev@dubbo.apache.org), [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide)
|
||||
|
||||
* Bugs: [Issues](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md)
|
||||
* Gitter: [Gitter channel](https://gitter.im/alibaba/dubbo)
|
||||
* Twitter: [@ApacheDubbo](https://twitter.com/ApacheDubbo)
|
||||
* Security issues: please mail to [us](mailto:security@dubbo.apache.org) privately.
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING](https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
|
||||
|
||||
### How can I contribute?
|
||||
|
||||
* Take a look at issues with tags marked [`Good first issue`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) or [`Help wanted`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22).
|
||||
* Join the discussion on the mailing list, subscription [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide).
|
||||
* Answer questions on [issues](https://github.com/apache/dubbo/issues).
|
||||
* Fix bugs reported on [issues](https://github.com/apache/dubbo/issues), and send us a pull request.
|
||||
* Review the existing [pull request](https://github.com/apache/dubbo/pulls).
|
||||
* Improve the [website](https://github.com/apache/dubbo-website), typically we need
|
||||
* blog post
|
||||
* translation on documentation
|
||||
* use cases around the integration of Dubbo in enterprise systems.
|
||||
* Improve the [dubbo-admin/dubbo-monitor](https://github.com/apache/dubbo-admin).
|
||||
* Contribute to the projects listed in [ecosystem](https://github.com/dubbo).
|
||||
* Other forms of contribution not explicitly enumerated above.
|
||||
* If you would like to contribute, please send an email to dev@dubbo.apache.org to let us know!
|
||||
|
||||
## Reporting bugs
|
||||
|
||||
Please follow the [template](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md) for reporting any issues.
|
||||
|
||||
## Reporting a security vulnerability
|
||||
|
||||
Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org) privately.
|
||||
|
||||
## Dubbo ecosystem
|
||||
|
||||
|
|
@ -175,4 +268,5 @@ Please report security vulnerabilities to [us](mailto:security@dubbo.apache.org)
|
|||
* [Erlang](https://github.com/apache/dubbo-erlang)
|
||||
|
||||
## License
|
||||
Apache Dubbo is licensed under the Apache License Version 2.0. See the [LICENSE](https://github.com/apache/dubbo/blob/master/LICENSE) file for details.
|
||||
|
||||
Apache Dubbo software is licensed under the Apache License Version 2.0. See the [LICENSE](https://github.com/apache/dubbo/blob/master/LICENSE) file for details.
|
||||
|
|
|
|||
|
|
@ -29,5 +29,6 @@ ignore:
|
|||
- "**/dubbo-test/**"
|
||||
- "**/dubbo-compatible/**"
|
||||
- "**/dubbo-native/**"
|
||||
- "**/dubbo-native-plugin/**"
|
||||
- "**/dubbo-common/src/main/java/org/apache/dubbo/common/json/*.java" # internal JSON impl is deprecate, ignore test coverage for them
|
||||
- "**/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java" # Deprecated
|
||||
|
|
|
|||
|
|
@ -0,0 +1,89 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.apache.dubbo</groupId>
|
||||
<artifactId>dubbo-build-tools</artifactId>
|
||||
<version>1.0.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<maven.deploy.skip>true</maven.deploy.skip>
|
||||
<spotless-maven-plugin.version>2.43.0</spotless-maven-plugin.version>
|
||||
<spotless.action>check</spotless.action>
|
||||
<dubbo-shared-resources.version>1.0.0</dubbo-shared-resources.version>
|
||||
<palantirJavaFormat.version>2.38.0</palantirJavaFormat.version>
|
||||
</properties>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>java11+</id>
|
||||
<activation>
|
||||
<jdk>[11,)</jdk>
|
||||
</activation>
|
||||
<build>
|
||||
<!--- newer versions of plugins requires JDK 11 -->
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>com.diffplug.spotless</groupId>
|
||||
<artifactId>spotless-maven-plugin</artifactId>
|
||||
<version>${spotless-maven-plugin.version}</version>
|
||||
<configuration>
|
||||
<java>
|
||||
<palantirJavaFormat>
|
||||
<version>${palantirJavaFormat.version}</version>
|
||||
</palantirJavaFormat>
|
||||
<removeUnusedImports />
|
||||
<importOrder>
|
||||
<file>dubbo-importorder.txt</file>
|
||||
</importOrder>
|
||||
<licenseHeader>
|
||||
<file>checkstyle-header.txt</file>
|
||||
</licenseHeader>
|
||||
</java>
|
||||
<pom>
|
||||
<sortPom>
|
||||
<expandEmptyElements>false</expandEmptyElements>
|
||||
<spaceBeforeCloseEmptyElement>true</spaceBeforeCloseEmptyElement>
|
||||
</sortPom>
|
||||
</pom>
|
||||
<upToDateChecking>
|
||||
<enabled>true</enabled>
|
||||
</upToDateChecking>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>dubbo-shared-resources</artifactId>
|
||||
<version>${dubbo-shared-resources.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>${spotless.action}</goal>
|
||||
</goals>
|
||||
<phase>process-sources</phase>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
||||
|
|
@ -13,9 +13,4 @@
|
|||
* 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 org.apache.dubbo.common.utils.json;
|
||||
|
||||
public interface Printer {
|
||||
String print();
|
||||
}
|
||||
*/
|
||||
|
|
@ -92,11 +92,6 @@
|
|||
<artifactId>micrometer-tracing-integration-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
|
|
|
|||
|
|
@ -17,7 +17,10 @@
|
|||
package org.apache.dubbo.rpc.cluster;
|
||||
|
||||
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
|
||||
import org.apache.dubbo.rpc.AdaptiveMetrics;
|
||||
import org.apache.dubbo.rpc.cluster.merger.MergerFactory;
|
||||
import org.apache.dubbo.rpc.cluster.router.RouterSnapshotSwitcher;
|
||||
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
|
||||
import org.apache.dubbo.rpc.cluster.support.ClusterUtils;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
|
|
@ -34,9 +37,14 @@ public class ClusterScopeModelInitializer implements ScopeModelInitializer {
|
|||
@Override
|
||||
public void initializeApplicationModel(ApplicationModel applicationModel) {
|
||||
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
|
||||
beanFactory.registerBean(MergerFactory.class);
|
||||
beanFactory.registerBean(ClusterUtils.class);
|
||||
beanFactory.registerBean(AdaptiveMetrics.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initializeModuleModel(ModuleModel moduleModel) {}
|
||||
public void initializeModuleModel(ModuleModel moduleModel) {
|
||||
ScopeBeanFactory beanFactory = moduleModel.getBeanFactory();
|
||||
beanFactory.registerBean(MeshRuleManager.class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.rpc.cluster;
|
||||
|
||||
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
|
||||
import org.apache.dubbo.rpc.cluster.merger.MergerFactory;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
import org.apache.dubbo.rpc.model.ModuleModel;
|
||||
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
|
||||
|
||||
public class MergeableClusterScopeModelInitializer implements ScopeModelInitializer {
|
||||
@Override
|
||||
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
|
||||
|
||||
@Override
|
||||
public void initializeApplicationModel(ApplicationModel applicationModel) {
|
||||
ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
|
||||
beanFactory.registerBean(MergerFactory.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initializeModuleModel(ModuleModel moduleModel) {}
|
||||
}
|
||||
|
|
@ -14,9 +14,13 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dubbo.tracing.filter;
|
||||
package org.apache.dubbo.rpc.cluster.filter.support;
|
||||
|
||||
import org.apache.dubbo.common.extension.Activate;
|
||||
import org.apache.dubbo.metrics.observation.DefaultDubboClientObservationConvention;
|
||||
import org.apache.dubbo.metrics.observation.DubboClientContext;
|
||||
import org.apache.dubbo.metrics.observation.DubboClientObservationConvention;
|
||||
import org.apache.dubbo.metrics.observation.DubboObservationDocumentation;
|
||||
import org.apache.dubbo.rpc.BaseFilter;
|
||||
import org.apache.dubbo.rpc.Filter;
|
||||
import org.apache.dubbo.rpc.Invocation;
|
||||
|
|
@ -26,10 +30,6 @@ import org.apache.dubbo.rpc.RpcException;
|
|||
import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
import org.apache.dubbo.rpc.model.ScopeModelAware;
|
||||
import org.apache.dubbo.tracing.DefaultDubboClientObservationConvention;
|
||||
import org.apache.dubbo.tracing.DubboClientObservationConvention;
|
||||
import org.apache.dubbo.tracing.DubboObservationDocumentation;
|
||||
import org.apache.dubbo.tracing.context.DubboClientContext;
|
||||
|
||||
import io.micrometer.observation.Observation;
|
||||
import io.micrometer.observation.ObservationRegistry;
|
||||
|
|
@ -39,19 +39,21 @@ import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
|
|||
/**
|
||||
* A {@link Filter} that creates an {@link Observation} around the outgoing message.
|
||||
*/
|
||||
@Activate(
|
||||
group = CONSUMER,
|
||||
order = Integer.MIN_VALUE + 50,
|
||||
onClass = "io.micrometer.observation.NoopObservationRegistry")
|
||||
@Activate(group = CONSUMER, order = -1, onClass = "io.micrometer.observation.NoopObservationRegistry")
|
||||
public class ObservationSenderFilter implements ClusterFilter, BaseFilter.Listener, ScopeModelAware {
|
||||
|
||||
private final ObservationRegistry observationRegistry;
|
||||
private ObservationRegistry observationRegistry;
|
||||
|
||||
private final DubboClientObservationConvention clientObservationConvention;
|
||||
private DubboClientObservationConvention clientObservationConvention;
|
||||
|
||||
public ObservationSenderFilter(ApplicationModel applicationModel) {
|
||||
observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
|
||||
clientObservationConvention = applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
|
||||
applicationModel.getApplicationConfigManager().getTracing().ifPresent(cfg -> {
|
||||
if (Boolean.TRUE.equals(cfg.getEnabled())) {
|
||||
observationRegistry = applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
|
||||
clientObservationConvention =
|
||||
applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -75,9 +77,6 @@ public class ObservationSenderFilter implements ClusterFilter, BaseFilter.Listen
|
|||
if (observation == null) {
|
||||
return;
|
||||
}
|
||||
if (appResponse != null && appResponse.hasException()) {
|
||||
observation.error(appResponse.getException());
|
||||
}
|
||||
observation.stop();
|
||||
}
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.rpc.cluster.router.mesh;
|
||||
|
||||
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
|
||||
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
import org.apache.dubbo.rpc.model.ModuleModel;
|
||||
import org.apache.dubbo.rpc.model.ScopeModelInitializer;
|
||||
|
||||
public class MeshScopeModelInitializer implements ScopeModelInitializer {
|
||||
@Override
|
||||
public void initializeFrameworkModel(FrameworkModel frameworkModel) {}
|
||||
|
||||
@Override
|
||||
public void initializeApplicationModel(ApplicationModel applicationModel) {}
|
||||
|
||||
public void initializeModuleModel(ModuleModel moduleModel) {
|
||||
ScopeBeanFactory beanFactory = moduleModel.getBeanFactory();
|
||||
beanFactory.registerBean(MeshRuleManager.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -36,7 +36,6 @@ import org.apache.dubbo.rpc.cluster.router.state.BitList;
|
|||
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
|
||||
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRuleParser;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
|
|
@ -53,7 +52,6 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
|
|||
public static final String NAME = "TAG_ROUTER";
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(TagStateRouter.class);
|
||||
private static final String RULE_SUFFIX = ".tag-router";
|
||||
public static final char TAG_SEPERATOR = '|';
|
||||
|
||||
private volatile TagRouterRule tagRouterRule;
|
||||
private String application;
|
||||
|
|
@ -121,8 +119,7 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
|
|||
|
||||
// if we are requesting for a Provider with a specific tag
|
||||
if (StringUtils.isNotEmpty(tag)) {
|
||||
Map<String, Set<String>> tagnameToAddresses = tagRouterRuleCopy.getTagnameToAddresses();
|
||||
Set<String> addresses = selectAddressByTagLevel(tagnameToAddresses, tag, isForceUseTag(invocation));
|
||||
Set<String> addresses = tagRouterRuleCopy.getTagnameToAddresses().get(tag);
|
||||
// filter by dynamic tag group first
|
||||
if (addresses != null) { // null means tag not set
|
||||
result = filterInvoker(invokers, invoker -> addressMatches(invoker.getUrl(), addresses));
|
||||
|
|
@ -339,34 +336,4 @@ public class TagStateRouter<T> extends AbstractStateRouter<T> implements Configu
|
|||
public void setTagRouterRule(TagRouterRule tagRouterRule) {
|
||||
this.tagRouterRule = tagRouterRule;
|
||||
}
|
||||
|
||||
/**
|
||||
* select addresses by tag with level
|
||||
* <p>
|
||||
* example:
|
||||
* selector=beta|team1|partner1
|
||||
* step1.select tagAddresses with selector=beta|team1|partner1, if result is empty, then run step2
|
||||
* step2.select tagAddresses with selector=beta|team1, if result is empty, then run step3
|
||||
* step3.select tagAddresses with selector=beta, if result is empty, result is null
|
||||
* </p>
|
||||
*
|
||||
* @param tagAddresses
|
||||
* @param tagSelector eg: beta|team1|partner1
|
||||
* @return
|
||||
*/
|
||||
public static Set<String> selectAddressByTagLevel(
|
||||
Map<String, Set<String>> tagAddresses, String tagSelector, boolean isForce) {
|
||||
if (isForce || StringUtils.isNotContains(tagSelector, TAG_SEPERATOR)) {
|
||||
return tagAddresses.get(tagSelector);
|
||||
}
|
||||
String[] selectors = StringUtils.split(tagSelector, TAG_SEPERATOR);
|
||||
for (int i = selectors.length; i > 0; i--) {
|
||||
String selectorTmp = StringUtils.join(selectors, TAG_SEPERATOR, 0, i);
|
||||
Set<String> addresses = tagAddresses.get(selectorTmp);
|
||||
if (CollectionUtils.isNotEmpty(addresses)) {
|
||||
return addresses;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
|||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.ConfigUtils;
|
||||
import org.apache.dubbo.rpc.AsyncRpcResult;
|
||||
import org.apache.dubbo.rpc.Constants;
|
||||
import org.apache.dubbo.rpc.Invocation;
|
||||
import org.apache.dubbo.rpc.Invoker;
|
||||
import org.apache.dubbo.rpc.Result;
|
||||
|
|
@ -43,6 +42,8 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.CLUSTER_FAILED_GROUP_MERGE;
|
||||
import static org.apache.dubbo.rpc.Constants.ASYNC_KEY;
|
||||
import static org.apache.dubbo.rpc.Constants.MERGER_KEY;
|
||||
|
||||
/**
|
||||
|
|
@ -94,7 +95,7 @@ public class MergeableClusterInvoker<T> extends AbstractClusterInvoker<T> {
|
|||
Map<String, Result> results = new HashMap<>();
|
||||
for (final Invoker<T> invoker : invokers) {
|
||||
RpcInvocation subInvocation = new RpcInvocation(invocation, invoker);
|
||||
subInvocation.setAttachment(Constants.ASYNC_KEY, "true");
|
||||
subInvocation.setAttachment(ASYNC_KEY, "true");
|
||||
try {
|
||||
results.put(invoker.getUrl().getServiceKey(), invokeWithContext(invoker, subInvocation));
|
||||
} catch (RpcException e) {
|
||||
|
|
@ -122,7 +123,7 @@ public class MergeableClusterInvoker<T> extends AbstractClusterInvoker<T> {
|
|||
Result r = asyncResult.get(Integer.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
if (r.hasException()) {
|
||||
log.error(
|
||||
LoggerCodeConstants.CLUSTER_FAILED_GROUP_MERGE,
|
||||
CLUSTER_FAILED_GROUP_MERGE,
|
||||
"Invoke " + getGroupDescFromServiceKey(entry.getKey()) + " failed: "
|
||||
+ r.getException().getMessage(),
|
||||
"",
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ import org.apache.dubbo.common.logger.LoggerFactory;
|
|||
import org.apache.dubbo.common.utils.CollectionUtils;
|
||||
import org.apache.dubbo.common.utils.ConfigUtils;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
import org.apache.dubbo.rpc.AsyncRpcResult;
|
||||
import org.apache.dubbo.rpc.Invocation;
|
||||
import org.apache.dubbo.rpc.InvokeMode;
|
||||
|
|
@ -48,8 +47,8 @@ import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
|
|||
public class MockClusterInvoker<T> implements ClusterInvoker<T> {
|
||||
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(MockClusterInvoker.class);
|
||||
private static final boolean setFutureWhenSync = Boolean.parseBoolean(SystemPropertyConfigUtils.getSystemProperty(
|
||||
CommonConstants.ThirdPartyProperty.SET_FUTURE_IN_SYNC_MODE, "true"));
|
||||
private static final boolean setFutureWhenSync =
|
||||
Boolean.parseBoolean(System.getProperty(CommonConstants.SET_FUTURE_IN_SYNC_MODE, "true"));
|
||||
|
||||
private final Directory<T> directory;
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
callback-consumer-context=org.apache.dubbo.rpc.cluster.filter.support.CallbackConsumerContextFilter
|
||||
|
|
@ -8,4 +8,4 @@ forking=org.apache.dubbo.rpc.cluster.support.ForkingCluster
|
|||
available=org.apache.dubbo.rpc.cluster.support.AvailableCluster
|
||||
mergeable=org.apache.dubbo.rpc.cluster.support.MergeableCluster
|
||||
broadcast=org.apache.dubbo.rpc.cluster.support.BroadcastCluster
|
||||
zone-aware=org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster
|
||||
zone-aware=org.apache.dubbo.rpc.cluster.support.registry.ZoneAwareCluster
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
consumercontext=org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter
|
||||
consumer-classloader=org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter
|
||||
router-snapshot=org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter
|
||||
observationsender=org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter
|
||||
metricsClusterFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter
|
||||
metricsConsumerFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsConsumerFilter
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
attachment=org.apache.dubbo.rpc.cluster.router.condition.matcher.attachment.AttachmentConditionMatcherFactory
|
||||
argument=org.apache.dubbo.rpc.cluster.router.condition.matcher.argument.ArgumentConditionMatcherFactory
|
||||
param=org.apache.dubbo.rpc.cluster.router.condition.matcher.param.UrlParamConditionMatcherFactory
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
mock=org.apache.dubbo.rpc.cluster.router.mock.MockStateRouterFactory
|
||||
tag=org.apache.dubbo.rpc.cluster.router.tag.TagStateRouterFactory
|
||||
condition=org.apache.dubbo.rpc.cluster.router.condition.ConditionStateRouterFactory
|
||||
service=org.apache.dubbo.rpc.cluster.router.condition.config.ServiceStateRouterFactory
|
||||
app=org.apache.dubbo.rpc.cluster.router.condition.config.AppStateRouterFactory
|
||||
provider-app=org.apache.dubbo.rpc.cluster.router.condition.config.ProviderAppStateRouterFactory
|
||||
standard-mesh-rule=org.apache.dubbo.rpc.cluster.router.mesh.route.StandardMeshRuleRouterFactory
|
||||
script-app=org.apache.dubbo.rpc.cluster.router.script.config.AppScriptRouterFactory
|
||||
tag=org.apache.dubbo.rpc.cluster.router.tag.TagStateRouterFactory
|
||||
mock=org.apache.dubbo.rpc.cluster.router.mock.MockStateRouterFactory
|
||||
standard-mesh-rule=org.apache.dubbo.rpc.cluster.router.mesh.route.StandardMeshRuleRouterFactory
|
||||
|
|
|
|||
|
|
@ -1,3 +1 @@
|
|||
dubbo-cluster=org.apache.dubbo.rpc.cluster.ClusterScopeModelInitializer
|
||||
dubbo-cluster-mergeable=org.apache.dubbo.rpc.cluster.MergeableClusterScopeModelInitializer
|
||||
mesh=org.apache.dubbo.rpc.cluster.router.mesh.MeshScopeModelInitializer
|
||||
|
|
|
|||
|
|
@ -0,0 +1,264 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.rpc.cluster;
|
||||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
|
||||
import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
|
||||
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
|
||||
import org.apache.dubbo.common.url.component.ServiceConfigURL;
|
||||
import org.apache.dubbo.common.utils.CollectionUtils;
|
||||
import org.apache.dubbo.rpc.Invoker;
|
||||
import org.apache.dubbo.rpc.RpcContext;
|
||||
import org.apache.dubbo.rpc.RpcInvocation;
|
||||
import org.apache.dubbo.rpc.cluster.filter.DemoService;
|
||||
import org.apache.dubbo.rpc.cluster.router.RouterSnapshotSwitcher;
|
||||
import org.apache.dubbo.rpc.cluster.router.condition.config.AppStateRouter;
|
||||
import org.apache.dubbo.rpc.cluster.router.condition.config.ListenableStateRouter;
|
||||
import org.apache.dubbo.rpc.cluster.router.condition.config.ServiceStateRouter;
|
||||
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshAppRuleListener;
|
||||
import org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleManager;
|
||||
import org.apache.dubbo.rpc.cluster.router.state.BitList;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.TAG_KEY;
|
||||
import static org.apache.dubbo.rpc.cluster.router.mesh.route.MeshRuleConstants.MESH_RULE_DATA_ID_SUFFIX;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class RouterChainTest {
|
||||
|
||||
/**
|
||||
* verify the router and state router loaded by default
|
||||
*/
|
||||
@Test
|
||||
void testBuildRouterChain() {
|
||||
RouterChain<DemoService> routerChain = createRouterChanin();
|
||||
Assertions.assertEquals(0, routerChain.getRouters().size());
|
||||
Assertions.assertEquals(7, routerChain.getStateRouters().size());
|
||||
}
|
||||
|
||||
private RouterChain<DemoService> createRouterChanin() {
|
||||
Map<String, String> parameters = new HashMap<>();
|
||||
parameters.put(INTERFACE_KEY, DemoService.class.getName());
|
||||
parameters.put("registry", "zookeeper");
|
||||
URL url = new ServiceConfigURL("dubbo", "127.0.0.1", 20881, DemoService.class.getName(), parameters);
|
||||
|
||||
RouterChain<DemoService> routerChain = RouterChain.buildChain(DemoService.class, url);
|
||||
return routerChain;
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRoute() {
|
||||
RouterChain<DemoService> routerChain = createRouterChanin();
|
||||
|
||||
// mockInvoker will be filtered out by MockInvokersSelector
|
||||
Invoker<DemoService> mockInvoker = createMockInvoker();
|
||||
|
||||
// invoker1 will be filtered out by MeshStateRouter
|
||||
Map<String, String> map1 = new HashMap<>();
|
||||
map1.put("env-sign", "yyyyyyy");
|
||||
Invoker<DemoService> invoker1 = createNormalInvoker(map1);
|
||||
|
||||
// invoker2 will be filtered out by TagStateRouter
|
||||
Map<String, String> map2 = new HashMap<>();
|
||||
map2.put("env-sign", "xxx");
|
||||
map2.put("tag1", "hello");
|
||||
Invoker<DemoService> invoker2 = createNormalInvoker(map2);
|
||||
|
||||
// invoker3 will be filtered out by AppStateRouter
|
||||
Map<String, String> map3 = new HashMap<>();
|
||||
map3.put("env-sign", "xxx");
|
||||
map3.put("tag1", "hello");
|
||||
map3.put(TAG_KEY, "TAG_");
|
||||
Invoker<DemoService> invoker3 = createNormalInvoker(map3);
|
||||
|
||||
// invoker4 will be filtered out by ServiceStateRouter
|
||||
Map<String, String> map4 = new HashMap<>();
|
||||
map4.put("env-sign", "xxx");
|
||||
map4.put("tag1", "hello");
|
||||
map4.put(TAG_KEY, "TAG_");
|
||||
map4.put("timeout", "5000");
|
||||
Invoker<DemoService> invoker4 = createNormalInvoker(map4);
|
||||
|
||||
// invoker5 is the only one returned at the end that is not filtered out
|
||||
Map<String, String> map5 = new HashMap<>();
|
||||
map5.put("env-sign", "xxx");
|
||||
map5.put("tag1", "hello");
|
||||
map5.put(TAG_KEY, "TAG_");
|
||||
map5.put("timeout", "5000");
|
||||
map5.put("serialization", "hessian2");
|
||||
Invoker<DemoService> invoker5 = createNormalInvoker(map5);
|
||||
|
||||
BitList<Invoker<DemoService>> invokers =
|
||||
new BitList<>(Arrays.asList(mockInvoker, invoker1, invoker2, invoker3, invoker4, invoker5));
|
||||
routerChain.setInvokers(invokers, () -> {});
|
||||
|
||||
// mesh rule for MeshStateRouter
|
||||
MeshRuleManager meshRuleManager =
|
||||
mockInvoker.getUrl().getOrDefaultModuleModel().getBeanFactory().getBean(MeshRuleManager.class);
|
||||
ConcurrentHashMap<String, MeshAppRuleListener> appRuleListeners = meshRuleManager.getAppRuleListeners();
|
||||
MeshAppRuleListener meshAppRuleListener =
|
||||
appRuleListeners.get(invoker1.getUrl().getRemoteApplication());
|
||||
ConfigChangedEvent configChangedEvent = new ConfigChangedEvent(
|
||||
"demo-route" + MESH_RULE_DATA_ID_SUFFIX,
|
||||
DynamicConfiguration.DEFAULT_GROUP,
|
||||
MESH_RULE1 + "---\n" + MESH_RULE2,
|
||||
ConfigChangeType.ADDED);
|
||||
meshAppRuleListener.process(configChangedEvent);
|
||||
|
||||
// condition rule for AppStateRouter&ServiceStateRouter
|
||||
ListenableStateRouter serviceRouter = routerChain.getStateRouters().stream()
|
||||
.filter(s -> s instanceof ServiceStateRouter)
|
||||
.map(s -> (ListenableStateRouter) s)
|
||||
.findAny()
|
||||
.orElse(null);
|
||||
ConfigChangedEvent serviceConditionEvent = new ConfigChangedEvent(
|
||||
DynamicConfiguration.getRuleKey(mockInvoker.getUrl()) + ".condition-router",
|
||||
DynamicConfiguration.DEFAULT_GROUP,
|
||||
SERVICE_CONDITION_RULE,
|
||||
ConfigChangeType.ADDED);
|
||||
serviceRouter.process(serviceConditionEvent);
|
||||
|
||||
ListenableStateRouter appRouter = routerChain.getStateRouters().stream()
|
||||
.filter(s -> s instanceof AppStateRouter)
|
||||
.map(s -> (ListenableStateRouter) s)
|
||||
.findAny()
|
||||
.orElse(null);
|
||||
ConfigChangedEvent appConditionEvent = new ConfigChangedEvent(
|
||||
"app.condition-router", DynamicConfiguration.DEFAULT_GROUP, APP_CONDITION_RULE, ConfigChangeType.ADDED);
|
||||
appRouter.process(appConditionEvent);
|
||||
|
||||
// prepare consumerUrl and RpcInvocation
|
||||
URL consumerUrl = URL.valueOf("consumer://localhost/DemoInterface?remote.application=app1");
|
||||
RpcInvocation rpcInvocation = new RpcInvocation();
|
||||
rpcInvocation.setServiceName("DemoService");
|
||||
rpcInvocation.setObjectAttachment("trafficLabel", "xxx");
|
||||
rpcInvocation.setObjectAttachment(TAG_KEY, "TAG_");
|
||||
|
||||
RpcContext.getServiceContext().setNeedPrintRouterSnapshot(true);
|
||||
RouterSnapshotSwitcher routerSnapshotSwitcher =
|
||||
FrameworkModel.defaultModel().getBeanFactory().getBean(RouterSnapshotSwitcher.class);
|
||||
routerSnapshotSwitcher.addEnabledService("org.apache.dubbo.demo.DemoService");
|
||||
// route
|
||||
List<Invoker<DemoService>> result = routerChain
|
||||
.getSingleChain(consumerUrl, invokers, rpcInvocation)
|
||||
.route(consumerUrl, invokers, rpcInvocation);
|
||||
Assertions.assertEquals(result.size(), 1);
|
||||
Assertions.assertTrue(result.contains(invoker5));
|
||||
|
||||
String snapshotLog =
|
||||
"[ Parent (Input: 6) (Current Node Output: 6) (Chain Node Output: 1) ] Input: localhost:9103,localhost:9103,localhost:9103,localhost:9103,localhost:9103 -> Chain Node Output: localhost:9103...\n"
|
||||
+ " [ MockInvokersSelector (Input: 6) (Current Node Output: 5) (Chain Node Output: 1) Router message: invocation.need.mock not set. Return normal Invokers. ] Current Node Output: localhost:9103,localhost:9103,localhost:9103,localhost:9103,localhost:9103\n"
|
||||
+ " [ StandardMeshRuleRouter (Input: 5) (Current Node Output: 4) (Chain Node Output: 1) Router message: Match App: app Subset: isolation ] Current Node Output: localhost:9103,localhost:9103,localhost:9103,localhost:9103\n"
|
||||
+ " [ TagStateRouter (Input: 4) (Current Node Output: 3) (Chain Node Output: 1) Router message: Disable Tag Router. Reason: tagRouterRule is invalid or disabled ] Current Node Output: localhost:9103,localhost:9103,localhost:9103\n"
|
||||
+ " [ ServiceStateRouter (Input: 3) (Current Node Output: 3) (Chain Node Output: 1) Router message: null ] Current Node Output: localhost:9103,localhost:9103,localhost:9103\n"
|
||||
+ " [ ConditionStateRouter (Input: 3) (Current Node Output: 2) (Chain Node Output: 2) Router message: Match return. ] Current Node Output: localhost:9103,localhost:9103\n"
|
||||
+ " [ ProviderAppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 1) Router message: Directly return. Reason: Invokers from previous router is empty or conditionRouters is empty. ] Current Node Output: localhost:9103,localhost:9103\n"
|
||||
+ " [ AppStateRouter (Input: 2) (Current Node Output: 2) (Chain Node Output: 1) Router message: null ] Current Node Output: localhost:9103,localhost:9103\n"
|
||||
+ " [ ConditionStateRouter (Input: 2) (Current Node Output: 1) (Chain Node Output: 1) Router message: Match return. ] Current Node Output: localhost:9103\n"
|
||||
+ " [ AppScriptStateRouter (Input: 1) (Current Node Output: 1) (Chain Node Output: 1) Router message: Directly return from script router. Reason: Invokers from previous router is empty or script is not enabled. Script rule is: null ] Current Node Output: localhost:9103";
|
||||
String[] snapshot = routerSnapshotSwitcher.cloneSnapshot();
|
||||
Assertions.assertTrue(snapshot[0].contains(snapshotLog));
|
||||
|
||||
RpcContext.getServiceContext().setNeedPrintRouterSnapshot(false);
|
||||
result = routerChain
|
||||
.getSingleChain(consumerUrl, invokers, rpcInvocation)
|
||||
.route(consumerUrl, invokers, rpcInvocation);
|
||||
Assertions.assertEquals(result.size(), 1);
|
||||
Assertions.assertTrue(result.contains(invoker5));
|
||||
|
||||
routerChain.destroy();
|
||||
Assertions.assertEquals(routerChain.getRouters().size(), 0);
|
||||
Assertions.assertEquals(routerChain.getStateRouters().size(), 0);
|
||||
}
|
||||
|
||||
private Invoker<DemoService> createMockInvoker() {
|
||||
URL url = URL.valueOf("mock://localhost:9103/DemoInterface?remote.application=app");
|
||||
Invoker<DemoService> invoker = Mockito.mock(Invoker.class);
|
||||
when(invoker.getUrl()).thenReturn(url);
|
||||
return invoker;
|
||||
}
|
||||
|
||||
private Invoker<DemoService> createNormalInvoker(Map<String, String> parameters) {
|
||||
URL url = URL.valueOf("dubbo://localhost:9103/DemoInterface?remote.application=app");
|
||||
if (CollectionUtils.isNotEmptyMap(parameters)) {
|
||||
url = url.addParameters(parameters);
|
||||
}
|
||||
Invoker<DemoService> invoker = Mockito.mock(Invoker.class);
|
||||
when(invoker.getUrl()).thenReturn(url);
|
||||
return invoker;
|
||||
}
|
||||
|
||||
private static final String MESH_RULE1 =
|
||||
"apiVersion: service.dubbo.apache.org/v1alpha1\n" + "kind: DestinationRule\n"
|
||||
+ "metadata: { name: demo-route }\n"
|
||||
+ "spec:\n"
|
||||
+ " host: demo\n"
|
||||
+ " subsets:\n"
|
||||
+ " - labels: { env-sign: xxx, tag1: hello }\n"
|
||||
+ " name: isolation\n"
|
||||
+ " - labels: { env-sign: yyy }\n"
|
||||
+ " name: testing-trunk\n"
|
||||
+ " - labels: { env-sign: zzz }\n"
|
||||
+ " name: testing\n"
|
||||
+ " trafficPolicy:\n"
|
||||
+ " loadBalancer: { simple: ROUND_ROBIN }\n"
|
||||
+ "\n";
|
||||
|
||||
private static final String MESH_RULE2 =
|
||||
"apiVersion: service.dubbo.apache.org/v1alpha1\n" + "kind: VirtualService\n"
|
||||
+ "metadata: { name: demo-route }\n"
|
||||
+ "spec:\n"
|
||||
+ " dubbo:\n"
|
||||
+ " - routedetail:\n"
|
||||
+ " - match:\n"
|
||||
+ " - attachments: \n"
|
||||
+ " dubboContext: {trafficLabel: {regex: xxx}}\n"
|
||||
+ " name: xxx-project\n"
|
||||
+ " route:\n"
|
||||
+ " - destination: {host: demo, subset: isolation}\n"
|
||||
+ " services:\n"
|
||||
+ " - {regex: DemoService}\n"
|
||||
+ " hosts: [demo]\n";
|
||||
|
||||
private static final String APP_CONDITION_RULE = "scope: application\n" + "force: true\n"
|
||||
+ "runtime: false\n"
|
||||
+ "enabled: true\n"
|
||||
+ "priority: 1\n"
|
||||
+ "key: demo-consumer\n"
|
||||
+ "conditions:\n"
|
||||
+ "- => serialization=hessian2";
|
||||
|
||||
private static final String SERVICE_CONDITION_RULE = "scope: service\n" + "force: true\n"
|
||||
+ "runtime: false\n"
|
||||
+ "enabled: true\n"
|
||||
+ "priority: 1\n"
|
||||
+ "key: org.apache.dubbo.demo.DemoService\n"
|
||||
+ "conditions:\n"
|
||||
+ "- => timeout=5000";
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dubbo.tracing.filter;
|
||||
package org.apache.dubbo.rpc.cluster.filter;
|
||||
|
||||
import org.apache.dubbo.config.ApplicationConfig;
|
||||
import org.apache.dubbo.config.TracingConfig;
|
||||
|
|
@ -23,7 +23,6 @@ import org.apache.dubbo.rpc.BaseFilter;
|
|||
import org.apache.dubbo.rpc.Invoker;
|
||||
import org.apache.dubbo.rpc.RpcInvocation;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
import org.apache.dubbo.tracing.MockInvocation;
|
||||
|
||||
import io.micrometer.tracing.test.SampleTestRunner;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
|
|
@ -14,22 +14,23 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dubbo.tracing.filter;
|
||||
package org.apache.dubbo.rpc.cluster.filter;
|
||||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.rpc.RpcContext;
|
||||
import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
|
||||
import org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
|
||||
import io.micrometer.common.KeyValues;
|
||||
import io.micrometer.core.tck.MeterRegistryAssert;
|
||||
import io.micrometer.tracing.test.SampleTestRunner;
|
||||
import io.micrometer.tracing.test.simple.SpansAssert;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
|
||||
class ObservationSenderFilterTest extends AbstractObservationFilterTest {
|
||||
|
||||
@Override
|
||||
public SampleTestRunnerConsumer yourCode() {
|
||||
public SampleTestRunner.SampleTestRunnerConsumer yourCode() {
|
||||
return (buildingBlocks, meterRegistry) -> {
|
||||
setupConfig();
|
||||
setupAttachments();
|
||||
|
|
@ -18,10 +18,12 @@ package org.apache.dubbo.rpc.cluster.router.tag;
|
|||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
|
||||
import org.apache.dubbo.common.extension.ExtensionLoader;
|
||||
import org.apache.dubbo.common.utils.Holder;
|
||||
import org.apache.dubbo.rpc.Invoker;
|
||||
import org.apache.dubbo.rpc.RpcInvocation;
|
||||
import org.apache.dubbo.rpc.cluster.router.MockInvoker;
|
||||
import org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider;
|
||||
import org.apache.dubbo.rpc.cluster.router.state.BitList;
|
||||
import org.apache.dubbo.rpc.cluster.router.state.StateRouter;
|
||||
import org.apache.dubbo.rpc.cluster.router.tag.model.TagRouterRule;
|
||||
|
|
@ -30,12 +32,10 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
|
|||
import org.apache.dubbo.rpc.model.ModuleModel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
@ -48,6 +48,7 @@ class TagStateRouterTest {
|
|||
private URL url;
|
||||
private ModuleModel originModel;
|
||||
private ModuleModel moduleModel;
|
||||
private Set<TracingContextProvider> tracingContextProviders;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
|
|
@ -58,6 +59,11 @@ class TagStateRouterTest {
|
|||
ScopeBeanFactory beanFactory = Mockito.spy(originBeanFactory);
|
||||
when(moduleModel.getBeanFactory()).thenReturn(beanFactory);
|
||||
|
||||
ExtensionLoader<TracingContextProvider> extensionLoader = Mockito.mock(ExtensionLoader.class);
|
||||
tracingContextProviders = new HashSet<>();
|
||||
when(extensionLoader.getSupportedExtensionInstances()).thenReturn(tracingContextProviders);
|
||||
when(moduleModel.getExtensionLoader(TracingContextProvider.class)).thenReturn(extensionLoader);
|
||||
|
||||
url = URL.valueOf("test://localhost/DemoInterface").setScopeModel(moduleModel);
|
||||
}
|
||||
|
||||
|
|
@ -258,44 +264,4 @@ class TagStateRouterTest {
|
|||
TagRouterRule tagRouterRule = TagRuleParser.parse(tagRouterRuleConfig);
|
||||
return tagRouterRule;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tagMultiLevelTest() {
|
||||
String tagSelector = "beta|team1|partner1";
|
||||
Set<String> address1 = Sets.newHashSet("192.168.5.1:20880");
|
||||
Map<String, Set<String>> tagAddresses = new HashMap<>();
|
||||
tagAddresses.put("beta", address1);
|
||||
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
|
||||
Set<String> address2 = Sets.newHashSet("192.168.5.2:20880");
|
||||
tagAddresses.put("beta|team1", address2);
|
||||
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
|
||||
Set<String> address3 = Sets.newHashSet("192.168.5.3:20880");
|
||||
tagAddresses.put("beta|team1|partner1", address3);
|
||||
Assertions.assertEquals(address3, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
|
||||
tagSelector = "beta";
|
||||
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
tagSelector = "beta|team1";
|
||||
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
tagSelector = "beta|team1|partner1";
|
||||
Assertions.assertEquals(address3, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
|
||||
tagSelector = "beta2";
|
||||
Assertions.assertNull(TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
tagSelector = "beta|team2";
|
||||
Assertions.assertEquals(address1, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
tagSelector = "beta|team1|partner2";
|
||||
Assertions.assertEquals(address2, TagStateRouter.selectAddressByTagLevel(tagAddresses, tagSelector, false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tagLevelForceTest() {
|
||||
Set<String> addresses = Sets.newHashSet("192.168.1.223:20880");
|
||||
Map<String, Set<String>> tagAddresses = new HashMap<>();
|
||||
tagAddresses.put("beta", addresses);
|
||||
Set<String> selectedAddresses = TagStateRouter.selectAddressByTagLevel(tagAddresses, "beta", true);
|
||||
Assertions.assertEquals(addresses, selectedAddresses);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;
|
|||
import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_AVAILABLE_CHECK_KEY;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.ArgumentMatchers.same;
|
||||
|
|
@ -579,5 +580,25 @@ class AbstractClusterInvokerTest {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test mock invoker selector works as expected
|
||||
*/
|
||||
@Test
|
||||
void testMockedInvokerSelect() {
|
||||
initlistsize5();
|
||||
invokers.add(mockedInvoker1);
|
||||
|
||||
initDic();
|
||||
|
||||
RpcInvocation mockedInvocation = new RpcInvocation();
|
||||
mockedInvocation.setMethodName("sayHello");
|
||||
mockedInvocation.setAttachment(INVOCATION_NEED_MOCK, "true");
|
||||
List<Invoker<IHelloService>> mockedInvokers = dic.list(mockedInvocation);
|
||||
Assertions.assertEquals(1, mockedInvokers.size());
|
||||
|
||||
List<Invoker<IHelloService>> invokers = dic.list(invocation);
|
||||
Assertions.assertEquals(5, invokers.size());
|
||||
}
|
||||
|
||||
public static interface IHelloService {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ package org.apache.dubbo.rpc.cluster.support;
|
|||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.logger.Level;
|
||||
import org.apache.dubbo.common.utils.DubboAppender;
|
||||
import org.apache.dubbo.common.utils.LogUtil;
|
||||
import org.apache.dubbo.rpc.AppResponse;
|
||||
|
|
@ -35,6 +34,7 @@ import java.util.List;
|
|||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.apache.log4j.Level;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
|
|
|
|||
|
|
@ -1,190 +0,0 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.rpc.cluster.support;
|
||||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.metrics.event.MetricsDispatcher;
|
||||
import org.apache.dubbo.rpc.Invocation;
|
||||
import org.apache.dubbo.rpc.Invoker;
|
||||
import org.apache.dubbo.rpc.Result;
|
||||
import org.apache.dubbo.rpc.RpcContext;
|
||||
import org.apache.dubbo.rpc.RpcException;
|
||||
import org.apache.dubbo.rpc.RpcInvocation;
|
||||
import org.apache.dubbo.rpc.cluster.LoadBalance;
|
||||
import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.ENABLE_CONNECTIVITY_VALIDATION;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_AVAILABLE_CHECK_KEY;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.INVOCATION_NEED_MOCK;
|
||||
import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
/**
|
||||
* AbstractClusterInvokerTest
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
class MockAbstractClusterInvokerTest {
|
||||
List<Invoker<IHelloService>> invokers = new ArrayList<Invoker<IHelloService>>();
|
||||
List<Invoker<IHelloService>> selectedInvokers = new ArrayList<Invoker<IHelloService>>();
|
||||
AbstractClusterInvoker<IHelloService> cluster;
|
||||
AbstractClusterInvoker<IHelloService> cluster_nocheck;
|
||||
StaticDirectory<IHelloService> dic;
|
||||
RpcInvocation invocation = new RpcInvocation();
|
||||
URL url = URL.valueOf(
|
||||
"registry://localhost:9090/org.apache.dubbo.rpc.cluster.support.AbstractClusterInvokerTest.IHelloService?refer="
|
||||
+ URL.encode("application=abstractClusterInvokerTest"));
|
||||
URL consumerUrl = URL.valueOf(
|
||||
"dubbo://localhost?application=abstractClusterInvokerTest&refer=application%3DabstractClusterInvokerTest");
|
||||
|
||||
Invoker<IHelloService> invoker1;
|
||||
Invoker<IHelloService> invoker2;
|
||||
Invoker<IHelloService> invoker3;
|
||||
Invoker<IHelloService> invoker4;
|
||||
Invoker<IHelloService> invoker5;
|
||||
Invoker<IHelloService> mockedInvoker1;
|
||||
|
||||
@BeforeAll
|
||||
public static void setUpBeforeClass() throws Exception {
|
||||
System.setProperty(ENABLE_CONNECTIVITY_VALIDATION, "false");
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void teardown() throws Exception {
|
||||
RpcContext.removeContext();
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void afterClass() {
|
||||
System.clearProperty(ENABLE_CONNECTIVITY_VALIDATION);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked"})
|
||||
@BeforeEach
|
||||
public void setUp() throws Exception {
|
||||
ApplicationModel.defaultModel().getBeanFactory().registerBean(MetricsDispatcher.class);
|
||||
Map<String, Object> attributes = new HashMap<>();
|
||||
attributes.put("application", "abstractClusterInvokerTest");
|
||||
url = url.putAttribute(REFER_KEY, attributes);
|
||||
|
||||
invocation.setMethodName("sayHello");
|
||||
|
||||
invoker1 = mock(Invoker.class);
|
||||
invoker2 = mock(Invoker.class);
|
||||
invoker3 = mock(Invoker.class);
|
||||
invoker4 = mock(Invoker.class);
|
||||
invoker5 = mock(Invoker.class);
|
||||
mockedInvoker1 = mock(Invoker.class);
|
||||
|
||||
URL turl = URL.valueOf("test://test:11/test");
|
||||
|
||||
given(invoker1.isAvailable()).willReturn(false);
|
||||
given(invoker1.getInterface()).willReturn(IHelloService.class);
|
||||
given(invoker1.getUrl()).willReturn(turl.setPort(1).addParameter("name", "invoker1"));
|
||||
|
||||
given(invoker2.isAvailable()).willReturn(true);
|
||||
given(invoker2.getInterface()).willReturn(IHelloService.class);
|
||||
given(invoker2.getUrl()).willReturn(turl.setPort(2).addParameter("name", "invoker2"));
|
||||
|
||||
given(invoker3.isAvailable()).willReturn(false);
|
||||
given(invoker3.getInterface()).willReturn(IHelloService.class);
|
||||
given(invoker3.getUrl()).willReturn(turl.setPort(3).addParameter("name", "invoker3"));
|
||||
|
||||
given(invoker4.isAvailable()).willReturn(true);
|
||||
given(invoker4.getInterface()).willReturn(IHelloService.class);
|
||||
given(invoker4.getUrl()).willReturn(turl.setPort(4).addParameter("name", "invoker4"));
|
||||
|
||||
given(invoker5.isAvailable()).willReturn(false);
|
||||
given(invoker5.getInterface()).willReturn(IHelloService.class);
|
||||
given(invoker5.getUrl()).willReturn(turl.setPort(5).addParameter("name", "invoker5"));
|
||||
|
||||
given(mockedInvoker1.isAvailable()).willReturn(false);
|
||||
given(mockedInvoker1.getInterface()).willReturn(IHelloService.class);
|
||||
given(mockedInvoker1.getUrl()).willReturn(turl.setPort(999).setProtocol("mock"));
|
||||
|
||||
invokers.add(invoker1);
|
||||
dic = new StaticDirectory<IHelloService>(url, invokers, null);
|
||||
cluster = new AbstractClusterInvoker(dic) {
|
||||
@Override
|
||||
protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
|
||||
throws RpcException {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
cluster_nocheck =
|
||||
new AbstractClusterInvoker(
|
||||
dic, url.addParameterIfAbsent(CLUSTER_AVAILABLE_CHECK_KEY, Boolean.FALSE.toString())) {
|
||||
@Override
|
||||
protected Result doInvoke(Invocation invocation, List invokers, LoadBalance loadbalance)
|
||||
throws RpcException {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void initlistsize5() {
|
||||
invokers.clear();
|
||||
selectedInvokers
|
||||
.clear(); // Clear first, previous test case will make sure that the right invoker2 will be used.
|
||||
invokers.add(invoker1);
|
||||
invokers.add(invoker2);
|
||||
invokers.add(invoker3);
|
||||
invokers.add(invoker4);
|
||||
invokers.add(invoker5);
|
||||
}
|
||||
|
||||
private void initDic() {
|
||||
dic.notify(invokers);
|
||||
dic.buildRouterChain();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test mock invoker selector works as expected
|
||||
*/
|
||||
@Test
|
||||
void testMockedInvokerSelect() {
|
||||
initlistsize5();
|
||||
invokers.add(mockedInvoker1);
|
||||
|
||||
initDic();
|
||||
|
||||
RpcInvocation mockedInvocation = new RpcInvocation();
|
||||
mockedInvocation.setMethodName("sayHello");
|
||||
mockedInvocation.setAttachment(INVOCATION_NEED_MOCK, "true");
|
||||
List<Invoker<IHelloService>> mockedInvokers = dic.list(mockedInvocation);
|
||||
Assertions.assertEquals(1, mockedInvokers.size());
|
||||
|
||||
List<Invoker<IHelloService>> invokers = dic.list(invocation);
|
||||
Assertions.assertEquals(5, invokers.size());
|
||||
}
|
||||
|
||||
public static interface IHelloService {}
|
||||
}
|
||||
|
|
@ -62,7 +62,7 @@ class MockProviderRpcExceptionTest {
|
|||
.addParameter("invoke_return_error", "true")
|
||||
.addParameter(
|
||||
REFER_KEY,
|
||||
URL.encode(PATH_KEY + "=" + IHelloRpcService.class.getName()
|
||||
URL.encode(PATH_KEY + "=" + MockProviderRpcExceptionTest.IHelloRpcService.class.getName()
|
||||
+ "&" + "mock=true"
|
||||
+ "&" + "proxy=jdk"));
|
||||
Invoker<IHelloRpcService> cluster = getClusterInvoker(url);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
|
||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
|
||||
<appender name="DUBBO" class="org.apache.dubbo.common.utils.DubboAppender">
|
||||
<param name="File" value="../dubbo.log"/>
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<root>
|
||||
<level value="INFO"/>
|
||||
<appender-ref ref="DUBBO"/>
|
||||
<appender-ref ref="CONSOLE"/>
|
||||
</root>
|
||||
</log4j:configuration>
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ 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.
|
||||
-->
|
||||
<Configuration status="WARN">
|
||||
<Appenders>
|
||||
<Dubbo name="Dubbo" fileName="../dubbo.log">
|
||||
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] %5p %t %c{2}: %m%n%ex" charset="UTF-8"/>
|
||||
</Dubbo>
|
||||
<Console name="Console" target="SYSTEM_OUT" follow="true">
|
||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} |-%highlight{%-5p} [%t] %40.40c:%-3L -| %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect,org.junit,org.mockito)}" charset="UTF-8"/>
|
||||
</Console>
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="info">
|
||||
<AppenderRef ref="Dubbo"/>
|
||||
<AppenderRef ref="Console"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
||||
|
|
@ -99,17 +99,6 @@
|
|||
<groupId>javax.annotation</groupId>
|
||||
<artifactId>javax.annotation-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib-nodep</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
|
|||
import org.apache.dubbo.common.config.ConfigurationCache;
|
||||
import org.apache.dubbo.common.convert.ConverterUtil;
|
||||
import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
|
||||
import org.apache.dubbo.common.serialization.ClassHolder;
|
||||
import org.apache.dubbo.common.ssl.CertManager;
|
||||
import org.apache.dubbo.common.status.reporter.FrameworkStatusReportService;
|
||||
import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
|
||||
|
|
@ -41,7 +40,6 @@ public class CommonScopeModelInitializer implements ScopeModelInitializer {
|
|||
beanFactory.registerBean(SerializeSecurityManager.class);
|
||||
beanFactory.registerBean(DefaultSerializeClassChecker.class);
|
||||
beanFactory.registerBean(CertManager.class);
|
||||
beanFactory.registerBean(ClassHolder.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.common.aot;
|
||||
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.ThirdPartyProperty.GRAALVM_NATIVEIMAGE_IMAGECODE;
|
||||
|
||||
public abstract class NativeDetector {
|
||||
|
||||
/**
|
||||
* See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java
|
||||
*/
|
||||
private static final boolean IMAGE_CODE =
|
||||
(SystemPropertyConfigUtils.getSystemProperty(GRAALVM_NATIVEIMAGE_IMAGECODE) != null);
|
||||
|
||||
/**
|
||||
* Returns {@code true} if invoked in the context of image building or during image runtime, else {@code false}.
|
||||
*/
|
||||
public static boolean inNativeImage() {
|
||||
return IMAGE_CODE;
|
||||
}
|
||||
}
|
||||
|
|
@ -162,6 +162,14 @@ public class FileCacheStore {
|
|||
FileCacheStoreFactory.removeCache(cacheFilePath);
|
||||
}
|
||||
|
||||
/**
|
||||
* for unit test only
|
||||
*/
|
||||
@Deprecated
|
||||
protected String getCacheFilePath() {
|
||||
return cacheFilePath;
|
||||
}
|
||||
|
||||
public static Builder newBuilder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ package org.apache.dubbo.common.cache;
|
|||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
|
@ -31,11 +30,11 @@ import java.nio.file.Files;
|
|||
import java.nio.file.Path;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.USER_HOME;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_CACHE_PATH_INACCESSIBLE;
|
||||
|
||||
/**
|
||||
|
|
@ -83,7 +82,7 @@ public final class FileCacheStoreFactory {
|
|||
public static FileCacheStore getInstance(String basePath, String cacheName, boolean enableFileCache) {
|
||||
if (basePath == null) {
|
||||
// default case: ~/.dubbo
|
||||
basePath = SystemPropertyConfigUtils.getSystemProperty(USER_HOME) + File.separator + ".dubbo";
|
||||
basePath = System.getProperty("user.home") + File.separator + ".dubbo";
|
||||
}
|
||||
if (basePath.endsWith(File.separator)) {
|
||||
basePath = basePath.substring(0, basePath.length() - 1);
|
||||
|
|
@ -208,6 +207,14 @@ public final class FileCacheStoreFactory {
|
|||
cacheMap.remove(cacheFileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* for unit test only
|
||||
*/
|
||||
@Deprecated
|
||||
static Map<String, FileCacheStore> getCacheMap() {
|
||||
return cacheMap;
|
||||
}
|
||||
|
||||
private static class PathNotExclusiveException extends Exception {
|
||||
public PathNotExclusiveException(String msg) {
|
||||
super(msg);
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ package org.apache.dubbo.common.compact;
|
|||
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
|
||||
|
|
@ -39,18 +38,17 @@ public class Dubbo2CompactUtils {
|
|||
|
||||
private static void initEnabled() {
|
||||
try {
|
||||
String fromProp =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE);
|
||||
String fromProp = System.getProperty(CommonConstants.DUBBO2_COMPACT_ENABLE);
|
||||
if (StringUtils.isNotEmpty(fromProp)) {
|
||||
enabled = Boolean.parseBoolean(fromProp);
|
||||
return;
|
||||
}
|
||||
String fromEnv = System.getenv(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE);
|
||||
String fromEnv = System.getenv(CommonConstants.DUBBO2_COMPACT_ENABLE);
|
||||
if (StringUtils.isNotEmpty(fromEnv)) {
|
||||
enabled = Boolean.parseBoolean(fromEnv);
|
||||
return;
|
||||
}
|
||||
fromEnv = System.getenv(StringUtils.toOSStyleKey(CommonConstants.DubboProperty.DUBBO2_COMPACT_ENABLE));
|
||||
fromEnv = System.getenv(StringUtils.toOSStyleKey(CommonConstants.DUBBO2_COMPACT_ENABLE));
|
||||
enabled = !StringUtils.isNotEmpty(fromEnv) || Boolean.parseBoolean(fromEnv);
|
||||
} catch (Throwable t) {
|
||||
enabled = true;
|
||||
|
|
|
|||
|
|
@ -286,8 +286,7 @@ public final class ConfigurationUtils {
|
|||
for (Map.Entry<String, V> entry : copy.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
V val = entry.getValue();
|
||||
if ((StringUtils.startsWithIgnoreCase(key, prefix)
|
||||
|| StringUtils.startsWithIgnoreCase(key, StringUtils.toOSStyleKey(prefix)))
|
||||
if (StringUtils.startsWithIgnoreCase(key, prefix)
|
||||
&& key.length() > prefix.length()
|
||||
&& !ConfigurationUtils.isEmptyValue(val)) {
|
||||
|
||||
|
|
@ -327,8 +326,7 @@ public final class ConfigurationUtils {
|
|||
}
|
||||
for (Map.Entry<String, V> entry : copy.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
if ((StringUtils.startsWithIgnoreCase(key, prefix)
|
||||
|| StringUtils.startsWithIgnoreCase(key, StringUtils.toOSStyleKey(prefix)))
|
||||
if (StringUtils.startsWithIgnoreCase(key, prefix)
|
||||
&& key.length() > prefix.length()
|
||||
&& !ConfigurationUtils.isEmptyValue(entry.getValue())) {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
|||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.ConfigUtils;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
import org.apache.dubbo.config.AbstractConfig;
|
||||
import org.apache.dubbo.config.context.ConfigConfigurationAdapter;
|
||||
import org.apache.dubbo.rpc.model.ScopeModel;
|
||||
|
|
@ -97,12 +96,10 @@ public class Environment extends LifecycleAdapter implements ApplicationExt {
|
|||
*/
|
||||
@Deprecated
|
||||
private void loadMigrationRule() {
|
||||
if (Boolean.parseBoolean(SystemPropertyConfigUtils.getSystemProperty(
|
||||
CommonConstants.DubboProperty.DUBBO_MIGRATION_FILE_ENABLE, "false"))) {
|
||||
String path =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_MIGRATION_KEY);
|
||||
if (Boolean.parseBoolean(System.getProperty(CommonConstants.DUBBO_MIGRATION_FILE_ENABLE, "false"))) {
|
||||
String path = System.getProperty(CommonConstants.DUBBO_MIGRATION_KEY);
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
path = System.getenv(CommonConstants.DubboProperty.DUBBO_MIGRATION_KEY);
|
||||
path = System.getenv(CommonConstants.DUBBO_MIGRATION_KEY);
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
path = CommonConstants.DEFAULT_DUBBO_MIGRATION_FILE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package org.apache.dubbo.common.config.configcenter;
|
||||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
|
|
@ -29,7 +30,7 @@ import static org.apache.dubbo.common.utils.PathUtils.normalize;
|
|||
/**
|
||||
* An abstract implementation of {@link DynamicConfiguration} is like "tree-structure" path :
|
||||
* <ul>
|
||||
* <li>{@link org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration "file"}</li>
|
||||
* <li>{@link FileSystemDynamicConfiguration "file"}</li>
|
||||
* <li>{@link org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration "zookeeper"}</li>
|
||||
* </ul>
|
||||
*
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;
|
|||
import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
|
||||
import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
|
||||
import org.apache.dubbo.common.config.configcenter.TreePathDynamicConfiguration;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.function.ThrowableConsumer;
|
||||
import org.apache.dubbo.common.function.ThrowableFunction;
|
||||
import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
|
||||
|
|
@ -30,7 +29,6 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
|||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.NamedThreadFactory;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
import org.apache.dubbo.rpc.model.ScopeModel;
|
||||
import org.apache.dubbo.rpc.model.ScopeModelUtil;
|
||||
|
||||
|
|
@ -86,8 +84,7 @@ public class FileSystemDynamicConfiguration extends TreePathDynamicConfiguration
|
|||
public static final String CONFIG_CENTER_ENCODING_PARAM_NAME = PARAM_NAME_PREFIX + "encoding";
|
||||
|
||||
public static final String DEFAULT_CONFIG_CENTER_DIR_PATH =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.SystemProperty.USER_HOME) + File.separator
|
||||
+ ".dubbo" + File.separator + "config-center";
|
||||
System.getProperty("user.home") + File.separator + ".dubbo" + File.separator + "config-center";
|
||||
|
||||
public static final int DEFAULT_THREAD_POOL_SIZE = 1;
|
||||
|
||||
|
|
@ -61,8 +61,14 @@ public interface CommonConstants {
|
|||
|
||||
String DISABLED_KEY = "disabled";
|
||||
|
||||
String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
|
||||
|
||||
String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties";
|
||||
|
||||
String DUBBO_MIGRATION_KEY = "dubbo.migration.file";
|
||||
|
||||
String DUBBO_MIGRATION_FILE_ENABLE = "dubbo.migration-file.enable";
|
||||
|
||||
String DEFAULT_DUBBO_MIGRATION_FILE = "dubbo-migration.yaml";
|
||||
|
||||
String ANY_VALUE = "*";
|
||||
|
|
@ -122,8 +128,6 @@ public interface CommonConstants {
|
|||
|
||||
String THREAD_POOL_EXHAUSTED_LISTENERS_KEY = "thread-pool-exhausted-listeners";
|
||||
|
||||
String JSON_CHECK_LEVEL_KEY = "jsonCheckLevel";
|
||||
|
||||
String THREADS_KEY = "threads";
|
||||
|
||||
String QUEUES_KEY = "queues";
|
||||
|
|
@ -287,8 +291,6 @@ public interface CommonConstants {
|
|||
|
||||
String CLUSTER_KEY = "cluster";
|
||||
|
||||
String MERGEABLE_CLUSTER_NAME = "mergeable";
|
||||
|
||||
String USERNAME_KEY = "username";
|
||||
|
||||
String PASSWORD_KEY = "password";
|
||||
|
|
@ -304,6 +306,14 @@ public interface CommonConstants {
|
|||
*/
|
||||
String BROADCAST_CLUSTER = "broadcast";
|
||||
|
||||
/**
|
||||
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
|
||||
* the Dubbo application prefers
|
||||
*
|
||||
* @since 2.7.6
|
||||
*/
|
||||
String DUBBO_PREFERRED_NETWORK_INTERFACE = "dubbo.network.interface.preferred";
|
||||
|
||||
@Deprecated
|
||||
String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
|
||||
|
||||
|
|
@ -444,6 +454,12 @@ public interface CommonConstants {
|
|||
*/
|
||||
String DEFAULT_SERVICE_NAME_MAPPING_PROPERTIES_PATH = "META-INF/dubbo/service-name-mapping.properties";
|
||||
|
||||
String CLASS_DESERIALIZE_BLOCK_ALL = "dubbo.security.serialize.blockAllClassExceptAllow";
|
||||
|
||||
String CLASS_DESERIALIZE_ALLOWED_LIST = "dubbo.security.serialize.allowedClassList";
|
||||
|
||||
String CLASS_DESERIALIZE_BLOCKED_LIST = "dubbo.security.serialize.blockedClassList";
|
||||
|
||||
String ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE = "dubbo.security.serialize.generic.native-java-enable";
|
||||
|
||||
String SERIALIZE_BLOCKED_LIST_FILE_PATH = "security/serialize.blockedlist";
|
||||
|
|
@ -475,6 +491,8 @@ public interface CommonConstants {
|
|||
|
||||
String DEFAULT_VERSION = "0.0.0";
|
||||
|
||||
String CLASS_DESERIALIZE_OPEN_CHECK = "dubbo.security.serialize.openCheckClass";
|
||||
|
||||
String ROUTER_KEY = "router";
|
||||
|
||||
String EXPORT_ASYNC_KEY = "export-async";
|
||||
|
|
@ -502,6 +520,11 @@ public interface CommonConstants {
|
|||
*/
|
||||
String URL_MERGE_PROCESSOR_KEY = "url-merge-processor";
|
||||
|
||||
/**
|
||||
* use native image to compile dubbo's identifier
|
||||
*/
|
||||
String NATIVE = "native";
|
||||
|
||||
String DUBBO_MONITOR_ADDRESS = "dubbo.monitor.address";
|
||||
|
||||
String SERVICE_NAME_MAPPING_KEY = "service-name-mapping";
|
||||
|
|
@ -510,6 +533,16 @@ public interface CommonConstants {
|
|||
|
||||
String SERVICE_MODEL = "serviceModel";
|
||||
|
||||
/**
|
||||
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
|
||||
* the Dubbo application will be ignored
|
||||
*
|
||||
* @since 2.7.6
|
||||
*/
|
||||
String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
|
||||
|
||||
String OS_NAME_KEY = "os.name";
|
||||
|
||||
String OS_LINUX_PREFIX = "linux";
|
||||
|
||||
String OS_WIN_PREFIX = "win";
|
||||
|
|
@ -554,6 +587,10 @@ public interface CommonConstants {
|
|||
|
||||
String INJVM_IGNORE_SAME_MODULE_KEY = "injvm.ignore.same-module";
|
||||
|
||||
String SET_FUTURE_IN_SYNC_MODE = "future.sync.set";
|
||||
|
||||
String CLEAR_FUTURE_AFTER_GET = "future.clear.once";
|
||||
|
||||
String NATIVE_STUB = "nativestub";
|
||||
|
||||
String METADATA = "metadata";
|
||||
|
|
@ -562,6 +599,8 @@ public interface CommonConstants {
|
|||
|
||||
String OPTIMIZER_KEY = "optimizer";
|
||||
|
||||
String PREFER_JSON_FRAMEWORK_NAME = "dubbo.json-framework.prefer";
|
||||
|
||||
/**
|
||||
* @since 3.1.0
|
||||
*/
|
||||
|
|
@ -609,6 +648,11 @@ public interface CommonConstants {
|
|||
|
||||
boolean DEFAULT_ENCODE_IN_IO_THREAD = false;
|
||||
|
||||
/**
|
||||
* @since 3.2.0
|
||||
*/
|
||||
String BYTE_ACCESSOR_KEY = "byte.accessor";
|
||||
|
||||
String PAYLOAD = "payload";
|
||||
|
||||
String DUBBO_METRICS_CONFIGCENTER_ENABLE = "dubbo.metrics.configcenter.enable";
|
||||
|
|
@ -619,165 +663,11 @@ public interface CommonConstants {
|
|||
|
||||
String DUBBO_PACKABLE_METHOD_FACTORY = "dubbo.application.parameters." + PACKABLE_METHOD_FACTORY_KEY;
|
||||
|
||||
String DUBBO_TAG_HEADER = "dubbo-tag";
|
||||
String DUBBO_MANUAL_REGISTER_KEY = "dubbo.application.manual-register";
|
||||
|
||||
String REST_SERVICE_DEPLOYER_URL_ATTRIBUTE_KEY = "restServiceDeployerAttributeKey";
|
||||
|
||||
String POD_NAMESPACE = "POD_NAMESPACE";
|
||||
|
||||
String CLUSTER_DOMAIN = "CLUSTER_DOMAIN";
|
||||
|
||||
String EXT_PROTOCOL = "ext.protocol";
|
||||
|
||||
String IS_EXTRA = "isExtra";
|
||||
String DUBBO2_COMPACT_ENABLE = "dubbo.compact.enable";
|
||||
|
||||
String ZOOKEEPER_ENSEMBLE_TRACKER_KEY = "zookeeper.ensemble.tracker";
|
||||
|
||||
String DUBBO_VERSIONS_KEY = "META-INF/dubbo-versions";
|
||||
|
||||
/**
|
||||
* System-related VM properties
|
||||
*/
|
||||
interface SystemProperty {
|
||||
|
||||
String USER_HOME = "user.home";
|
||||
|
||||
String SYSTEM_JAVA_VERSION = "java.version";
|
||||
|
||||
String SYSTEM_JAVA_IO_TMPDIR = "java.io.tmpdir";
|
||||
|
||||
String SYSTEM_LINE_SEPARATOR = "line.separator";
|
||||
|
||||
String SERIALIZATION_SECURITY_CHECK_KEY = "serialization.security.check";
|
||||
|
||||
String SYSTEM_BYTE_ACCESSOR_KEY = "byte.accessor";
|
||||
|
||||
String SYSTEM_OS_NAME = "os.name";
|
||||
|
||||
String SYSTEM_OS_VERSION = "os.version";
|
||||
|
||||
String JAVA_RUNTIME_NAME = "java.runtime.name";
|
||||
|
||||
String JAVA_RUNTIME_VERSION = "java.runtime.version";
|
||||
|
||||
String JAVA_VM_NAME = "java.vm.name";
|
||||
|
||||
String JAVA_VM_VERSION = "java.vm.version";
|
||||
|
||||
String JAVA_VM_INFO = "java.vm.info";
|
||||
|
||||
String JAVA_HOME = "java.home";
|
||||
|
||||
String OS_ARCH = "os.arch";
|
||||
|
||||
String SYSTEM_FILE_ENCODING = "file.encoding";
|
||||
|
||||
String SYSTEM_TCP_RESPONSE_TIMEOUT = "sun.rmi.transport.tcp.responseTimeout";
|
||||
}
|
||||
|
||||
/**
|
||||
* Third-party-related VM properties
|
||||
*/
|
||||
interface ThirdPartyProperty {
|
||||
String NETTY_EPOLL_ENABLE_KEY = "netty.epoll.enable";
|
||||
|
||||
String SET_FUTURE_IN_SYNC_MODE = "future.sync.set";
|
||||
|
||||
String CLEAR_FUTURE_AFTER_GET = "future.clear.once";
|
||||
|
||||
String APOLLO_ADDR_KEY = "apollo.meta";
|
||||
|
||||
String APOLLO_CLUSTER_KEY = "apollo.cluster";
|
||||
|
||||
String APOLLO_ENV_KEY = "env";
|
||||
|
||||
String APOLLO_APPID_KEY = "app.id";
|
||||
|
||||
String NACOS_SERVICE_NAME_SEPARATOR = "nacos.service.name.separator";
|
||||
|
||||
String GRAALVM_NATIVEIMAGE_IMAGECODE = "org.graalvm.nativeimage.imagecode";
|
||||
|
||||
/**
|
||||
* The JVM arguments to set if it can use embedded zookeeper, the default value is {@code true}.
|
||||
*/
|
||||
String ZOOKEEPER_CONFIG_ENABLE_EMBEDDED = "enableEmbeddedZookeeper";
|
||||
}
|
||||
|
||||
/**
|
||||
* Dubbo custom VM properties
|
||||
*/
|
||||
interface DubboProperty {
|
||||
String DUBBO_MIGRATION_FILE_ENABLE = "dubbo.migration-file.enable";
|
||||
String DUBBO_MIGRATION_KEY = "dubbo.migration.file";
|
||||
String DUBBO_APPLICATION_LOGGER = "dubbo.application.logger";
|
||||
String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
|
||||
String DUBBO_PREFER_JSON_FRAMEWORK_NAME = "dubbo.json-framework.prefer";
|
||||
|
||||
/**
|
||||
* used in JVMUtil.java ,Control stack print lines, default is 32 lines
|
||||
*/
|
||||
String DUBBO_JSTACK_MAXLINE = "dubbo.jstack-dump.max-line";
|
||||
|
||||
/**
|
||||
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that the Dubbo
|
||||
* application will be ignored
|
||||
*
|
||||
* @since 2.7.6
|
||||
*/
|
||||
String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
|
||||
|
||||
/**
|
||||
* The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that the Dubbo
|
||||
* application prefers
|
||||
*
|
||||
* @since 2.7.6
|
||||
*/
|
||||
String DUBBO_PREFERRED_NETWORK_INTERFACE = "dubbo.network.interface.preferred";
|
||||
|
||||
String DUBBO_CLASS_DESERIALIZE_ALLOWED_LIST = "dubbo.security.serialize.allowedClassList";
|
||||
String DUBBO_CLASS_DESERIALIZE_BLOCKED_LIST = "dubbo.security.serialize.blockedClassList";
|
||||
String DUBBO_CLASS_DESERIALIZE_OPEN_CHECK = "dubbo.security.serialize.openCheckClass";
|
||||
String DUBBO_CLASS_DESERIALIZE_BLOCK_ALL = "dubbo.security.serialize.blockAllClassExceptAllow";
|
||||
String DUBBO_RESOLVE_FILE = "dubbo.resolve.file";
|
||||
String DUBBO_IP_TO_REGISTRY = "DUBBO_IP_TO_REGISTRY";
|
||||
String DUBBO_MONITOR_ADDRESS = "dubbo.monitor.address";
|
||||
String DUBBO_CONTAINER_KEY = "dubbo.container";
|
||||
String DUBBO_SHUTDOWN_HOOK_KEY = "dubbo.shutdown.hook";
|
||||
String DUBBO_SPRING_CONFIG = "dubbo.spring.config";
|
||||
String DUBBO_MAPPING_CACHE_FILEPATH = "dubbo.mapping.cache.filePath";
|
||||
|
||||
String DUBBO_MAPPING_CACHE_FILENAME = "dubbo.mapping.cache.fileName";
|
||||
|
||||
String DUBBO_MAPPING_CACHE_ENTRYSIZE = "dubbo.mapping.cache.entrySize";
|
||||
|
||||
String DUBBO_MAPPING_CACHE_MAXFILESIZE = "dubbo.mapping.cache.maxFileSize";
|
||||
|
||||
String DUBBO_META_CACHE_FILEPATH = "dubbo.meta.cache.filePath";
|
||||
|
||||
String DUBBO_META_CACHE_FILENAME = "dubbo.meta.cache.fileName";
|
||||
|
||||
String DUBBO_META_CACHE_ENTRYSIZE = "dubbo.meta.cache.entrySize";
|
||||
|
||||
String DUBBO_META_CACHE_MAXFILESIZE = "dubbo.meta.cache.maxFileSize";
|
||||
|
||||
String DUBBO_USE_SECURE_RANDOM_ID = "dubbo.application.use-secure-random-request-id";
|
||||
|
||||
String DUBBO_CLOSE_TIMEOUT_CONFIG_KEY = "dubbo.protocol.default-close-timeout";
|
||||
|
||||
String DUBBO_HEARTBEAT_CONFIG_KEY = "dubbo.protocol.default-heartbeat";
|
||||
|
||||
String DUBBO_DEFAULT_REMOTING_SERIALIZATION_PROPERTY = "DUBBO_DEFAULT_SERIALIZATION";
|
||||
|
||||
String DUBBO_HESSIAN_ALLOW_NON_SERIALIZABLE = "dubbo.hessian.allowNonSerializable";
|
||||
|
||||
String DUBBO_HESSIAN_WHITELIST = "dubbo.application.hessian2.whitelist";
|
||||
|
||||
String DUBBO_HESSIAN_ALLOW = "dubbo.application.hessian2.allow";
|
||||
|
||||
String DUBBO_HESSIAN_DENY = "dubbo.application.hessian2.deny";
|
||||
|
||||
String DUBBO_MANUAL_REGISTER_KEY = "dubbo.application.manual-register";
|
||||
|
||||
String DUBBO2_COMPACT_ENABLE = "dubbo.compact.enable";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,8 +91,6 @@ public interface LoggerCodeConstants {
|
|||
|
||||
String VULNERABILITY_WARNING = "0-28";
|
||||
|
||||
String COMMON_NOT_FOUND_TRACER_DEPENDENCY = "0-29";
|
||||
|
||||
// Registry module
|
||||
|
||||
String REGISTRY_ADDRESS_INVALID = "1-1";
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@ public interface MetricsConstants {
|
|||
|
||||
String TAG_CHANGE_TYPE = "change.type";
|
||||
|
||||
String TAG_ERROR_CODE = "error";
|
||||
|
||||
String ENABLE_JVM_METRICS_KEY = "enable.jvm";
|
||||
|
||||
String ENABLE_COLLECTOR_SYNC_KEY = "enable.collector.sync";
|
||||
|
|
|
|||
|
|
@ -141,7 +141,6 @@ public interface RegistryConstants {
|
|||
String ENABLE_EMPTY_PROTECTION_KEY = "enable-empty-protection";
|
||||
boolean DEFAULT_ENABLE_EMPTY_PROTECTION = false;
|
||||
String REGISTER_CONSUMER_URL_KEY = "register-consumer-url";
|
||||
String REGISTRY_PROTOCOL_TYPE = "registry-protocol-type";
|
||||
|
||||
/**
|
||||
* export noting suffix servicename
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ import java.util.List;
|
|||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_MONITOR_EXCEPTION;
|
||||
import static org.apache.dubbo.common.deploy.DeployState.COMPLETION;
|
||||
import static org.apache.dubbo.common.deploy.DeployState.FAILED;
|
||||
import static org.apache.dubbo.common.deploy.DeployState.PENDING;
|
||||
import static org.apache.dubbo.common.deploy.DeployState.STARTED;
|
||||
|
|
@ -57,17 +56,12 @@ public abstract class AbstractDeployer<E extends ScopeModel> implements Deployer
|
|||
|
||||
@Override
|
||||
public boolean isRunning() {
|
||||
return state == STARTING || state == STARTED || state == COMPLETION;
|
||||
return state == STARTING || state == STARTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStarted() {
|
||||
return state == STARTED || state == COMPLETION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCompletion() {
|
||||
return state == COMPLETION;
|
||||
return state == STARTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -141,22 +135,6 @@ public abstract class AbstractDeployer<E extends ScopeModel> implements Deployer
|
|||
}
|
||||
}
|
||||
|
||||
protected void setCompletion() {
|
||||
this.state = COMPLETION;
|
||||
for (DeployListener<E> listener : listeners) {
|
||||
try {
|
||||
listener.onCompletion(scopeModel);
|
||||
} catch (Throwable e) {
|
||||
logger.error(
|
||||
COMMON_MONITOR_EXCEPTION,
|
||||
"",
|
||||
"",
|
||||
getIdentifier() + " an exception occurred when handle completion event",
|
||||
e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void setStopping() {
|
||||
this.state = STOPPING;
|
||||
for (DeployListener<E> listener : listeners) {
|
||||
|
|
|
|||
|
|
@ -48,9 +48,7 @@ public interface ApplicationDeployer extends Deployer<ApplicationModel> {
|
|||
/**
|
||||
* Register application instance and start internal services
|
||||
*/
|
||||
void prepareApplicationInstance(ModuleModel moduleModel);
|
||||
|
||||
void exportMetadataService();
|
||||
void prepareApplicationInstance();
|
||||
|
||||
/**
|
||||
* Register application instance and start internal services
|
||||
|
|
|
|||
|
|
@ -24,35 +24,13 @@ public interface DeployListener<E extends ScopeModel> {
|
|||
*/
|
||||
void onInitialize(E scopeModel);
|
||||
|
||||
/**
|
||||
* Triggered before starting module.
|
||||
*/
|
||||
void onStarting(E scopeModel);
|
||||
|
||||
/**
|
||||
* Triggered before registering and exposing the service.
|
||||
*/
|
||||
void onStarted(E scopeModel);
|
||||
|
||||
/**
|
||||
* Triggered after deployer startup is complete.
|
||||
*/
|
||||
default void onCompletion(E scopeModel) {}
|
||||
|
||||
/**
|
||||
* Triggered before the app is destroyed,
|
||||
* can do some customized things before offline the service and destroy reference.
|
||||
*/
|
||||
void onStopping(E scopeModel);
|
||||
|
||||
/**
|
||||
* Triggered after the application is destroyed,
|
||||
* can do some customized things after the service is offline and the reference is destroyed.
|
||||
*/
|
||||
void onStopped(E scopeModel);
|
||||
|
||||
/**
|
||||
* Useful to do something when deployer was failed.
|
||||
*/
|
||||
void onFailure(E scopeModel, Throwable cause);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,9 +28,6 @@ public class DeployListenerAdapter<E extends ScopeModel> implements DeployListen
|
|||
@Override
|
||||
public void onStarted(E scopeModel) {}
|
||||
|
||||
@Override
|
||||
public void onCompletion(E scopeModel) {}
|
||||
|
||||
@Override
|
||||
public void onStopping(E scopeModel) {}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,11 +40,6 @@ public enum DeployState {
|
|||
*/
|
||||
STARTED,
|
||||
|
||||
/**
|
||||
* Completion
|
||||
*/
|
||||
COMPLETION,
|
||||
|
||||
/**
|
||||
* Stopping
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@ public interface Deployer<E extends ScopeModel> {
|
|||
*/
|
||||
boolean isStarted();
|
||||
|
||||
boolean isCompletion();
|
||||
|
||||
/**
|
||||
* @return true if the component is starting.
|
||||
* @see #isStarted()
|
||||
|
|
|
|||
|
|
@ -50,8 +50,4 @@ public interface ModuleDeployer extends Deployer<ModuleModel> {
|
|||
* Whether start in background, do not await finish
|
||||
*/
|
||||
boolean isBackground();
|
||||
|
||||
boolean hasRegistryInteraction();
|
||||
|
||||
ApplicationDeployer getApplicationDeployer();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ public @interface Activate {
|
|||
/**
|
||||
* Absolute ordering info, optional
|
||||
*
|
||||
* Ascending order, smaller values will be in the front of the list.
|
||||
* Ascending order, smaller values will be in the front o the list.
|
||||
*
|
||||
* @return absolute ordering info
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -16,9 +16,6 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.extension;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Uniform accessor for extension
|
||||
*/
|
||||
|
|
@ -27,7 +24,7 @@ public interface ExtensionAccessor {
|
|||
ExtensionDirector getExtensionDirector();
|
||||
|
||||
default <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
|
||||
return getExtensionDirector().getExtensionLoader(type);
|
||||
return this.getExtensionDirector().getExtensionLoader(type);
|
||||
}
|
||||
|
||||
default <T> T getExtension(Class<T> type, String name) {
|
||||
|
|
@ -44,21 +41,4 @@ public interface ExtensionAccessor {
|
|||
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
|
||||
return extensionLoader != null ? extensionLoader.getDefaultExtension() : null;
|
||||
}
|
||||
|
||||
default <T> List<T> getActivateExtensions(Class<T> type) {
|
||||
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
|
||||
return extensionLoader != null ? extensionLoader.getActivateExtensions() : Collections.emptyList();
|
||||
}
|
||||
|
||||
default <T> T getFirstActivateExtension(Class<T> type) {
|
||||
ExtensionLoader<T> extensionLoader = getExtensionLoader(type);
|
||||
if (extensionLoader == null) {
|
||||
throw new IllegalArgumentException("ExtensionLoader for [" + type + "] is not found");
|
||||
}
|
||||
List<T> extensions = extensionLoader.getActivateExtensions();
|
||||
if (extensions.isEmpty()) {
|
||||
throw new IllegalArgumentException("No activate extensions for [" + type + "] found");
|
||||
}
|
||||
return extensions.get(0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ package org.apache.dubbo.common.extension;
|
|||
|
||||
import org.apache.dubbo.common.Extension;
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.aot.NativeDetector;
|
||||
import org.apache.dubbo.common.beans.support.InstantiationStrategy;
|
||||
import org.apache.dubbo.common.compact.Dubbo2ActivateUtils;
|
||||
import org.apache.dubbo.common.compact.Dubbo2CompactUtils;
|
||||
|
|
@ -36,6 +35,7 @@ import org.apache.dubbo.common.utils.CollectionUtils;
|
|||
import org.apache.dubbo.common.utils.ConcurrentHashSet;
|
||||
import org.apache.dubbo.common.utils.ConfigUtils;
|
||||
import org.apache.dubbo.common.utils.Holder;
|
||||
import org.apache.dubbo.common.utils.NativeUtils;
|
||||
import org.apache.dubbo.common.utils.ReflectUtils;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
|
|
@ -75,7 +75,6 @@ import java.util.TreeSet;
|
|||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
|
@ -121,7 +120,6 @@ public class ExtensionLoader<T> {
|
|||
|
||||
private final ConcurrentMap<Class<?>, String> cachedNames = new ConcurrentHashMap<>();
|
||||
|
||||
private final ReentrantLock loadExtensionClassesLock = new ReentrantLock();
|
||||
private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();
|
||||
|
||||
private final Map<String, Object> cachedActivates = Collections.synchronizedMap(new LinkedHashMap<>());
|
||||
|
|
@ -953,8 +951,7 @@ public class ExtensionLoader<T> {
|
|||
private Map<String, Class<?>> getExtensionClasses() {
|
||||
Map<String, Class<?>> classes = cachedClasses.get();
|
||||
if (classes == null) {
|
||||
loadExtensionClassesLock.lock();
|
||||
try {
|
||||
synchronized (cachedClasses) {
|
||||
classes = cachedClasses.get();
|
||||
if (classes == null) {
|
||||
try {
|
||||
|
|
@ -971,8 +968,6 @@ public class ExtensionLoader<T> {
|
|||
}
|
||||
cachedClasses.set(classes);
|
||||
}
|
||||
} finally {
|
||||
loadExtensionClassesLock.unlock();
|
||||
}
|
||||
}
|
||||
return classes;
|
||||
|
|
@ -1456,7 +1451,7 @@ public class ExtensionLoader<T> {
|
|||
// Adaptive Classes' ClassLoader should be the same with Real SPI interface classes' ClassLoader
|
||||
ClassLoader classLoader = type.getClassLoader();
|
||||
try {
|
||||
if (NativeDetector.inNativeImage()) {
|
||||
if (NativeUtils.isNative()) {
|
||||
return classLoader.loadClass(type.getName() + "$Adaptive");
|
||||
}
|
||||
} catch (Throwable ignore) {
|
||||
|
|
|
|||
|
|
@ -16,21 +16,13 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.io;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* Stream utils.
|
||||
*/
|
||||
public final class StreamUtils {
|
||||
|
||||
public static final ByteArrayInputStream EMPTY = new ByteArrayInputStream(new byte[0]);
|
||||
|
||||
public class StreamUtils {
|
||||
private StreamUtils() {}
|
||||
|
||||
public static InputStream limitedInputStream(final InputStream is, final int limit) throws IOException {
|
||||
|
|
@ -237,51 +229,4 @@ public final class StreamUtils {
|
|||
is.skip(is.available());
|
||||
}
|
||||
}
|
||||
|
||||
public static void copy(InputStream in, OutputStream out) throws IOException {
|
||||
if (in.getClass() == ByteArrayInputStream.class) {
|
||||
copy((ByteArrayInputStream) in, out);
|
||||
return;
|
||||
}
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = in.read(buffer)) != -1) {
|
||||
out.write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
|
||||
public static void copy(ByteArrayInputStream in, OutputStream out) throws IOException {
|
||||
int len = in.available();
|
||||
byte[] buffer = new byte[len];
|
||||
in.read(buffer, 0, len);
|
||||
out.write(buffer, 0, len);
|
||||
}
|
||||
|
||||
public static byte[] readBytes(InputStream in) throws IOException {
|
||||
if (in.getClass() == ByteArrayInputStream.class) {
|
||||
return readBytes((ByteArrayInputStream) in);
|
||||
}
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
while ((bytesRead = in.read(buffer)) != -1) {
|
||||
out.write(buffer, 0, bytesRead);
|
||||
}
|
||||
return out.toByteArray();
|
||||
}
|
||||
|
||||
public static byte[] readBytes(ByteArrayInputStream in) throws IOException {
|
||||
int len = in.available();
|
||||
byte[] bytes = new byte[len];
|
||||
in.read(bytes, 0, len);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public static String toString(InputStream in) throws IOException {
|
||||
return new String(readBytes(in), StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
public static String toString(InputStream in, Charset charset) throws IOException {
|
||||
return new String(readBytes(in), charset);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,19 +62,6 @@ public class GsonUtils {
|
|||
}
|
||||
}
|
||||
|
||||
public static String toJson(Object obj) throws RuntimeException {
|
||||
if (!isSupportGson()) {
|
||||
throw new RuntimeException("Gson is not supported. Please import Gson in JVM env.");
|
||||
}
|
||||
try {
|
||||
return getGson().toJson(obj);
|
||||
} catch (JsonSyntaxException ex) {
|
||||
throw new RuntimeException(String.format(
|
||||
"Generic serialization [%s] Json syntax exception thrown when parsing (object:%s ) error:%s",
|
||||
GENERIC_SERIALIZATION_GSON, obj, ex.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
private static Gson getGson() {
|
||||
if (gsonCache == null || !(gsonCache instanceof Gson)) {
|
||||
synchronized (GsonUtils.class) {
|
||||
|
|
|
|||
|
|
@ -16,14 +16,11 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.json;
|
||||
|
||||
import org.apache.dubbo.common.extension.SPI;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@SPI
|
||||
public interface JsonUtil {
|
||||
public interface JSON {
|
||||
boolean isSupport();
|
||||
|
||||
boolean isJson(String json);
|
||||
|
|
@ -42,10 +39,6 @@ public interface JsonUtil {
|
|||
|
||||
Map<String, ?> getObject(Map<String, ?> obj, String key);
|
||||
|
||||
Object convertObject(Object obj, Type type);
|
||||
|
||||
Object convertObject(Object obj, Class<?> clazz);
|
||||
|
||||
Double getNumberAsDouble(Map<String, ?> obj, String key);
|
||||
|
||||
Integer getNumberAsInteger(Map<String, ?> obj, String key);
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.json.impl;
|
||||
|
||||
import org.apache.dubbo.common.json.JsonUtil;
|
||||
import org.apache.dubbo.common.json.JSON;
|
||||
import org.apache.dubbo.common.utils.CollectionUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
|
@ -24,7 +24,7 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class AbstractJsonUtilImpl implements JsonUtil {
|
||||
public abstract class AbstractJSONImpl implements JSON {
|
||||
@Override
|
||||
public boolean isSupport() {
|
||||
try {
|
||||
|
|
@ -22,7 +22,7 @@ import java.util.List;
|
|||
import com.alibaba.fastjson2.JSONValidator;
|
||||
import com.alibaba.fastjson2.JSONWriter;
|
||||
|
||||
public class FastJson2Impl extends AbstractJsonUtilImpl {
|
||||
public class FastJson2Impl extends AbstractJSONImpl {
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
|
|
@ -44,14 +44,4 @@ public class FastJson2Impl extends AbstractJsonUtilImpl {
|
|||
public String toJson(Object obj) {
|
||||
return com.alibaba.fastjson2.JSON.toJSONString(obj, JSONWriter.Feature.WriteEnumsUsingName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Type type) {
|
||||
return com.alibaba.fastjson2.util.TypeUtils.cast(obj, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Class<?> clazz) {
|
||||
return com.alibaba.fastjson2.util.TypeUtils.cast(obj, clazz);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,10 +19,9 @@ package org.apache.dubbo.common.json.impl;
|
|||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.fastjson.parser.ParserConfig;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
|
||||
public class FastJsonImpl extends AbstractJsonUtilImpl {
|
||||
public class FastJsonImpl extends AbstractJSONImpl {
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
|
|
@ -48,14 +47,4 @@ public class FastJsonImpl extends AbstractJsonUtilImpl {
|
|||
public String toJson(Object obj) {
|
||||
return com.alibaba.fastjson.JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Type type) {
|
||||
return com.alibaba.fastjson.util.TypeUtils.cast(obj, type, ParserConfig.getGlobalInstance());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Class<?> clazz) {
|
||||
return com.alibaba.fastjson.util.TypeUtils.cast(obj, clazz, ParserConfig.getGlobalInstance());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import com.google.gson.JsonParser;
|
|||
import com.google.gson.JsonSyntaxException;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
public class GsonImpl extends AbstractJsonUtilImpl {
|
||||
public class GsonImpl extends AbstractJSONImpl {
|
||||
// weak reference of com.google.gson.Gson, prevent throw exception when init
|
||||
private volatile Object gsonCache = null;
|
||||
|
||||
|
|
@ -55,18 +55,6 @@ public class GsonImpl extends AbstractJsonUtilImpl {
|
|||
return getGson().toJson(obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Type type) {
|
||||
Gson gson = getGson();
|
||||
return gson.fromJson(gson.toJsonTree(obj), type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Class<?> clazz) {
|
||||
Gson gson = getGson();
|
||||
return gson.fromJson(gson.toJsonTree(obj), clazz);
|
||||
}
|
||||
|
||||
private Gson getGson() {
|
||||
if (gsonCache == null || !(gsonCache instanceof Gson)) {
|
||||
synchronized (this) {
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||
import com.fasterxml.jackson.databind.json.JsonMapper;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
|
||||
public class JacksonImpl extends AbstractJsonUtilImpl {
|
||||
public class JacksonImpl extends AbstractJSONImpl {
|
||||
private final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
private volatile Object jacksonCache = null;
|
||||
|
|
@ -71,17 +71,6 @@ public class JacksonImpl extends AbstractJsonUtilImpl {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Type type) {
|
||||
JsonMapper mapper = getJackson();
|
||||
return mapper.convertValue(obj, mapper.constructType(type));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object convertObject(Object obj, Class<?> clazz) {
|
||||
return getJackson().convertValue(obj, clazz);
|
||||
}
|
||||
|
||||
private JsonMapper getJackson() {
|
||||
if (jacksonCache == null || !(jacksonCache instanceof JsonMapper)) {
|
||||
synchronized (this) {
|
||||
|
|
|
|||
|
|
@ -30,14 +30,6 @@ public interface Logger {
|
|||
*/
|
||||
void trace(String msg);
|
||||
|
||||
/**
|
||||
* Logs a message with trace log level.
|
||||
*
|
||||
* @param msg log this message
|
||||
* @param arguments a list of arguments
|
||||
*/
|
||||
void trace(String msg, Object... arguments);
|
||||
|
||||
/**
|
||||
* Logs an error with trace log level.
|
||||
*
|
||||
|
|
@ -60,14 +52,6 @@ public interface Logger {
|
|||
*/
|
||||
void debug(String msg);
|
||||
|
||||
/**
|
||||
* Logs a message with debug log level.
|
||||
*
|
||||
* @param msg log this message
|
||||
* @param arguments a list of arguments
|
||||
*/
|
||||
void debug(String msg, Object... arguments);
|
||||
|
||||
/**
|
||||
* Logs an error with debug log level.
|
||||
*
|
||||
|
|
@ -90,14 +74,6 @@ public interface Logger {
|
|||
*/
|
||||
void info(String msg);
|
||||
|
||||
/**
|
||||
* Logs a message with info log level.
|
||||
*
|
||||
* @param msg log this message
|
||||
* @param arguments a list of arguments
|
||||
*/
|
||||
void info(String msg, Object... arguments);
|
||||
|
||||
/**
|
||||
* Logs an error with info log level.
|
||||
*
|
||||
|
|
@ -120,14 +96,6 @@ public interface Logger {
|
|||
*/
|
||||
void warn(String msg);
|
||||
|
||||
/**
|
||||
* Logs a message with warn log level.
|
||||
*
|
||||
* @param msg log this message
|
||||
* @param arguments a list of arguments
|
||||
*/
|
||||
void warn(String msg, Object... arguments);
|
||||
|
||||
/**
|
||||
* Logs a message with warn log level.
|
||||
*
|
||||
|
|
@ -150,14 +118,6 @@ public interface Logger {
|
|||
*/
|
||||
void error(String msg);
|
||||
|
||||
/**
|
||||
* Logs a message with error log level.
|
||||
*
|
||||
* @param msg log this message
|
||||
* @param arguments a list of arguments
|
||||
*/
|
||||
void error(String msg, Object... arguments);
|
||||
|
||||
/**
|
||||
* Logs an error with error log level.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.logger;
|
||||
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.logger.jcl.JclLoggerAdapter;
|
||||
import org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter;
|
||||
import org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter;
|
||||
|
|
@ -25,7 +24,6 @@ import org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter;
|
|||
import org.apache.dubbo.common.logger.support.FailsafeErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.support.FailsafeLogger;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
|
||||
import java.io.File;
|
||||
|
|
@ -49,8 +47,7 @@ public class LoggerFactory {
|
|||
|
||||
// search common-used logging frameworks
|
||||
static {
|
||||
String logger =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_APPLICATION_LOGGER, "");
|
||||
String logger = System.getProperty("dubbo.application.logger", "");
|
||||
switch (logger) {
|
||||
case Slf4jLoggerAdapter.NAME:
|
||||
setLoggerAdapter(new Slf4jLoggerAdapter());
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2004-2011 QOS.ch
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
package org.apache.dubbo.common.logger.helpers;
|
||||
|
||||
/**
|
||||
* Holds the results of formatting done by {@link MessageFormatter}.
|
||||
* This is a copy of org.slf4j.helpers.FormattingTuple from slf4j-api.
|
||||
*
|
||||
* @author Joern Huxhorn
|
||||
*/
|
||||
public class FormattingTuple {
|
||||
|
||||
static public FormattingTuple NULL = new FormattingTuple(null);
|
||||
|
||||
private String message;
|
||||
private Throwable throwable;
|
||||
private Object[] argArray;
|
||||
|
||||
public FormattingTuple(String message) {
|
||||
this(message, null, null);
|
||||
}
|
||||
|
||||
public FormattingTuple(String message, Object[] argArray, Throwable throwable) {
|
||||
this.message = message;
|
||||
this.throwable = throwable;
|
||||
this.argArray = argArray;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public Object[] getArgArray() {
|
||||
return argArray;
|
||||
}
|
||||
|
||||
public Throwable getThrowable() {
|
||||
return throwable;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,437 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2004-2011 QOS.ch
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining
|
||||
* a copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
package org.apache.dubbo.common.logger.helpers;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
// contributors: lizongbo: proposed special treatment of array parameter values
|
||||
// Joern Huxhorn: pointed out double[] omission, suggested deep array copy
|
||||
|
||||
/**
|
||||
* This is a copy of org.slf4j.helpers.MessageFormatter from slf4j-api.
|
||||
* Formats messages according to very simple substitution rules. Substitutions
|
||||
* can be made 1, 2 or more arguments.
|
||||
*
|
||||
* <p>
|
||||
* For example,
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("Hi {}.", "there")
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "Hi there.".
|
||||
* <p>
|
||||
* The {} pair is called the <em>formatting anchor</em>. It serves to designate
|
||||
* the location where arguments need to be substituted within the message
|
||||
* pattern.
|
||||
* <p>
|
||||
* In case your message contains the '{' or the '}' character, you do not have
|
||||
* to do anything special unless the '}' character immediately follows '{'. For
|
||||
* example,
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("Set {1,2,3} is not equal to {}.", "1,2");
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "Set {1,2,3} is not equal to 1,2.".
|
||||
*
|
||||
* <p>
|
||||
* If for whatever reason you need to place the string "{}" in the message
|
||||
* without its <em>formatting anchor</em> meaning, then you need to escape the
|
||||
* '{' character with '\', that is the backslash character. Only the '{'
|
||||
* character should be escaped. There is no need to escape the '}' character.
|
||||
* For example,
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("Set \\{} is not equal to {}.", "1,2");
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "Set {} is not equal to 1,2.".
|
||||
*
|
||||
* <p>
|
||||
* The escaping behavior just described can be overridden by escaping the escape
|
||||
* character '\'. Calling
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("File name is C:\\\\{}.", "file.zip");
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "File name is C:\file.zip".
|
||||
*
|
||||
* <p>
|
||||
* The formatting conventions are different than those of {@link MessageFormat}
|
||||
* which ships with the Java platform. This is justified by the fact that
|
||||
* SLF4J's implementation is 10 times faster than that of {@link MessageFormat}.
|
||||
* This local performance difference is both measurable and significant in the
|
||||
* larger context of the complete logging processing chain.
|
||||
*
|
||||
* <p>
|
||||
* See also {@link #format(String, Object)},
|
||||
* {@link #format(String, Object, Object)} and
|
||||
* {@link #arrayFormat(String, Object[])} methods for more details.
|
||||
*
|
||||
* @author Ceki Gülcü
|
||||
* @author Joern Huxhorn
|
||||
*/
|
||||
final public class MessageFormatter {
|
||||
static final char DELIM_START = '{';
|
||||
static final char DELIM_STOP = '}';
|
||||
static final String DELIM_STR = "{}";
|
||||
private static final char ESCAPE_CHAR = '\\';
|
||||
|
||||
/**
|
||||
* Performs single argument substitution for the 'messagePattern' passed as
|
||||
* parameter.
|
||||
* <p>
|
||||
* For example,
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("Hi {}.", "there");
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "Hi there.".
|
||||
* <p>
|
||||
*
|
||||
* @param messagePattern The message pattern which will be parsed and formatted
|
||||
* @param arg The argument to be substituted in place of the formatting anchor
|
||||
* @return The formatted message
|
||||
*/
|
||||
final public static FormattingTuple format(String messagePattern, Object arg) {
|
||||
return arrayFormat(messagePattern, new Object[]{arg});
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a two argument substitution for the 'messagePattern' passed as
|
||||
* parameter.
|
||||
* <p>
|
||||
* For example,
|
||||
*
|
||||
* <pre>
|
||||
* MessageFormatter.format("Hi {}. My name is {}.", "Alice", "Bob");
|
||||
* </pre>
|
||||
* <p>
|
||||
* will return the string "Hi Alice. My name is Bob.".
|
||||
*
|
||||
* @param messagePattern The message pattern which will be parsed and formatted
|
||||
* @param arg1 The argument to be substituted in place of the first formatting
|
||||
* anchor
|
||||
* @param arg2 The argument to be substituted in place of the second formatting
|
||||
* anchor
|
||||
* @return The formatted message
|
||||
*/
|
||||
final public static FormattingTuple format(final String messagePattern, Object arg1, Object arg2) {
|
||||
return arrayFormat(messagePattern, new Object[]{arg1, arg2});
|
||||
}
|
||||
|
||||
|
||||
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
|
||||
Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argArray);
|
||||
Object[] args = argArray;
|
||||
if (throwableCandidate != null) {
|
||||
args = MessageFormatter.trimmedCopy(argArray);
|
||||
}
|
||||
return arrayFormat(messagePattern, args, throwableCandidate);
|
||||
}
|
||||
|
||||
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
|
||||
|
||||
if (messagePattern == null) {
|
||||
return new FormattingTuple(null, argArray, throwable);
|
||||
}
|
||||
|
||||
if (argArray == null) {
|
||||
return new FormattingTuple(messagePattern);
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
int j;
|
||||
// use string builder for better multicore performance
|
||||
StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);
|
||||
|
||||
int L;
|
||||
for (L = 0; L < argArray.length; L++) {
|
||||
|
||||
j = messagePattern.indexOf(DELIM_STR, i);
|
||||
|
||||
if (j == -1) {
|
||||
// no more variables
|
||||
if (i == 0) { // this is a simple string
|
||||
return new FormattingTuple(messagePattern, argArray, throwable);
|
||||
} else { // add the tail string which contains no variables and return
|
||||
// the result.
|
||||
sbuf.append(messagePattern, i, messagePattern.length());
|
||||
return new FormattingTuple(sbuf.toString(), argArray, throwable);
|
||||
}
|
||||
} else {
|
||||
if (isEscapedDelimeter(messagePattern, j)) {
|
||||
if (!isDoubleEscaped(messagePattern, j)) {
|
||||
L--; // DELIM_START was escaped, thus should not be incremented
|
||||
sbuf.append(messagePattern, i, j - 1);
|
||||
sbuf.append(DELIM_START);
|
||||
i = j + 1;
|
||||
} else {
|
||||
// The escape character preceding the delimiter start is
|
||||
// itself escaped: "abc x:\\{}"
|
||||
// we have to consume one backward slash
|
||||
sbuf.append(messagePattern, i, j - 1);
|
||||
deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
|
||||
i = j + 2;
|
||||
}
|
||||
} else {
|
||||
// normal case
|
||||
sbuf.append(messagePattern, i, j);
|
||||
deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
|
||||
i = j + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
// append the characters following the last {} pair.
|
||||
sbuf.append(messagePattern, i, messagePattern.length());
|
||||
return new FormattingTuple(sbuf.toString(), argArray, throwable);
|
||||
}
|
||||
|
||||
final static boolean isEscapedDelimeter(String messagePattern, int delimeterStartIndex) {
|
||||
|
||||
if (delimeterStartIndex == 0) {
|
||||
return false;
|
||||
}
|
||||
char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
|
||||
if (potentialEscape == ESCAPE_CHAR) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
|
||||
if (delimeterStartIndex >= 2 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// special treatment of array values was suggested by 'lizongbo'
|
||||
private static void deeplyAppendParameter(StringBuilder sbuf, Object o, Map<Object[], Object> seenMap) {
|
||||
if (o == null) {
|
||||
sbuf.append("null");
|
||||
return;
|
||||
}
|
||||
if (!o.getClass().isArray()) {
|
||||
safeObjectAppend(sbuf, o);
|
||||
} else {
|
||||
// check for primitive array types because they
|
||||
// unfortunately cannot be cast to Object[]
|
||||
if (o instanceof boolean[]) {
|
||||
booleanArrayAppend(sbuf, (boolean[]) o);
|
||||
} else if (o instanceof byte[]) {
|
||||
byteArrayAppend(sbuf, (byte[]) o);
|
||||
} else if (o instanceof char[]) {
|
||||
charArrayAppend(sbuf, (char[]) o);
|
||||
} else if (o instanceof short[]) {
|
||||
shortArrayAppend(sbuf, (short[]) o);
|
||||
} else if (o instanceof int[]) {
|
||||
intArrayAppend(sbuf, (int[]) o);
|
||||
} else if (o instanceof long[]) {
|
||||
longArrayAppend(sbuf, (long[]) o);
|
||||
} else if (o instanceof float[]) {
|
||||
floatArrayAppend(sbuf, (float[]) o);
|
||||
} else if (o instanceof double[]) {
|
||||
doubleArrayAppend(sbuf, (double[]) o);
|
||||
} else {
|
||||
objectArrayAppend(sbuf, (Object[]) o, seenMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void safeObjectAppend(StringBuilder sbuf, Object o) {
|
||||
try {
|
||||
String oAsString = o.toString();
|
||||
sbuf.append(oAsString);
|
||||
} catch (Throwable t) {
|
||||
System.err.println("SLF4J: Failed toString() invocation on an object of type [" + o.getClass().getName() + "]");
|
||||
System.err.println("Reported exception:");
|
||||
StackTraceElement[] stackTrace = t.getStackTrace();
|
||||
StringBuilder stackBuilder = new StringBuilder();
|
||||
for (StackTraceElement traceElement : stackTrace) {
|
||||
stackBuilder.append("\tat ").append(traceElement).append("\n");
|
||||
}
|
||||
System.err.println(stackBuilder);
|
||||
sbuf.append("[FAILED toString()]");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void objectArrayAppend(StringBuilder sbuf, Object[] a, Map<Object[], Object> seenMap) {
|
||||
sbuf.append('[');
|
||||
if (!seenMap.containsKey(a)) {
|
||||
seenMap.put(a, null);
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
deeplyAppendParameter(sbuf, a[i], seenMap);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
// allow repeats in siblings
|
||||
seenMap.remove(a);
|
||||
} else {
|
||||
sbuf.append("...");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void charArrayAppend(StringBuilder sbuf, char[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void intArrayAppend(StringBuilder sbuf, int[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void longArrayAppend(StringBuilder sbuf, long[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {
|
||||
sbuf.append('[');
|
||||
final int len = a.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
sbuf.append(a[i]);
|
||||
if (i != len - 1)
|
||||
sbuf.append(", ");
|
||||
}
|
||||
sbuf.append(']');
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
|
||||
*
|
||||
* @param argArray The arguments off which we want to know if it contains a {@link Throwable} as last element
|
||||
* @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
|
||||
* otherwise it returns null
|
||||
*/
|
||||
public static Throwable getThrowableCandidate(final Object[] argArray) {
|
||||
if (argArray == null || argArray.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Object lastEntry = argArray[argArray.length - 1];
|
||||
if (lastEntry instanceof Throwable) {
|
||||
return (Throwable) lastEntry;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to get all but the last element of an array
|
||||
*
|
||||
* @param argArray The arguments from which we want to remove the last element
|
||||
* @return a copy of the array without the last element
|
||||
*/
|
||||
public static Object[] trimmedCopy(final Object[] argArray) {
|
||||
if (argArray == null || argArray.length == 0) {
|
||||
throw new IllegalStateException("non-sensical empty or null argument array");
|
||||
}
|
||||
|
||||
final int trimmedLen = argArray.length - 1;
|
||||
|
||||
Object[] trimmed = new Object[trimmedLen];
|
||||
|
||||
if (trimmedLen > 0) {
|
||||
System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
|
||||
}
|
||||
|
||||
return trimmed;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,8 +19,6 @@ package org.apache.dubbo.common.logger.jcl;
|
|||
import org.apache.dubbo.common.logger.Logger;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.slf4j.helpers.FormattingTuple;
|
||||
import org.slf4j.helpers.MessageFormatter;
|
||||
|
||||
/**
|
||||
* Adaptor to commons logging, depends on commons-logging.jar. For more information about commons logging, pls. refer to
|
||||
|
|
@ -39,12 +37,6 @@ public class JclLogger implements Logger {
|
|||
logger.trace(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.trace(ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Throwable e) {
|
||||
logger.trace(e);
|
||||
|
|
@ -60,12 +52,6 @@ public class JclLogger implements Logger {
|
|||
logger.debug(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.debug(ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Throwable e) {
|
||||
logger.debug(e);
|
||||
|
|
@ -81,12 +67,6 @@ public class JclLogger implements Logger {
|
|||
logger.info(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.info(ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Throwable e) {
|
||||
logger.info(e);
|
||||
|
|
@ -102,12 +82,6 @@ public class JclLogger implements Logger {
|
|||
logger.warn(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.warn(ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Throwable e) {
|
||||
logger.warn(e);
|
||||
|
|
@ -123,12 +97,6 @@ public class JclLogger implements Logger {
|
|||
logger.error(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.error(ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable e) {
|
||||
logger.error(e);
|
||||
|
|
|
|||
|
|
@ -20,9 +20,6 @@ import org.apache.dubbo.common.logger.Logger;
|
|||
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.slf4j.helpers.FormattingTuple;
|
||||
import org.slf4j.helpers.MessageFormatter;
|
||||
|
||||
public class JdkLogger implements Logger {
|
||||
|
||||
private final java.util.logging.Logger logger;
|
||||
|
|
@ -36,12 +33,6 @@ public class JdkLogger implements Logger {
|
|||
logger.log(Level.FINER, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(Level.FINER, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Throwable e) {
|
||||
logger.log(Level.FINER, e.getMessage(), e);
|
||||
|
|
@ -57,12 +48,6 @@ public class JdkLogger implements Logger {
|
|||
logger.log(Level.FINE, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(Level.FINE, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Throwable e) {
|
||||
logger.log(Level.FINE, e.getMessage(), e);
|
||||
|
|
@ -78,12 +63,6 @@ public class JdkLogger implements Logger {
|
|||
logger.log(Level.INFO, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(Level.INFO, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Throwable e) {
|
||||
logger.log(Level.INFO, msg, e);
|
||||
|
|
@ -94,12 +73,6 @@ public class JdkLogger implements Logger {
|
|||
logger.log(Level.WARNING, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(Level.WARNING, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Throwable e) {
|
||||
logger.log(Level.WARNING, msg, e);
|
||||
|
|
@ -110,12 +83,6 @@ public class JdkLogger implements Logger {
|
|||
logger.log(Level.SEVERE, msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(Level.SEVERE, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Throwable e) {
|
||||
logger.log(Level.SEVERE, msg, e);
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ import org.apache.dubbo.common.logger.Logger;
|
|||
import org.apache.dubbo.common.logger.support.FailsafeLogger;
|
||||
|
||||
import org.apache.log4j.Level;
|
||||
import org.slf4j.helpers.FormattingTuple;
|
||||
import org.slf4j.helpers.MessageFormatter;
|
||||
|
||||
public class Log4jLogger implements Logger {
|
||||
|
||||
|
|
@ -38,12 +36,6 @@ public class Log4jLogger implements Logger {
|
|||
logger.log(FQCN, Level.TRACE, msg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(FQCN, Level.TRACE, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Throwable e) {
|
||||
logger.log(FQCN, Level.TRACE, e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -59,12 +51,6 @@ public class Log4jLogger implements Logger {
|
|||
logger.log(FQCN, Level.DEBUG, msg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Throwable e) {
|
||||
logger.log(FQCN, Level.DEBUG, e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -80,12 +66,6 @@ public class Log4jLogger implements Logger {
|
|||
logger.log(FQCN, Level.INFO, msg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(FQCN, Level.INFO, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Throwable e) {
|
||||
logger.log(FQCN, Level.INFO, e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -101,12 +81,6 @@ public class Log4jLogger implements Logger {
|
|||
logger.log(FQCN, Level.WARN, msg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(FQCN, Level.WARN, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Throwable e) {
|
||||
logger.log(FQCN, Level.WARN, e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -122,12 +96,6 @@ public class Log4jLogger implements Logger {
|
|||
logger.log(FQCN, Level.ERROR, msg, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
logger.log(FQCN, Level.ERROR, ft.getMessage(), ft.getThrowable());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable e) {
|
||||
logger.log(FQCN, Level.ERROR, e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -162,4 +130,9 @@ public class Log4jLogger implements Logger {
|
|||
public boolean isErrorEnabled() {
|
||||
return logger.isEnabledFor(Level.ERROR);
|
||||
}
|
||||
|
||||
// test purpose only
|
||||
public org.apache.log4j.Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,11 +31,6 @@ public class Log4j2Logger implements Logger {
|
|||
logger.trace(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
logger.trace(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Throwable e) {
|
||||
logger.trace(e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -51,11 +46,6 @@ public class Log4j2Logger implements Logger {
|
|||
logger.debug(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
logger.debug(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Throwable e) {
|
||||
logger.debug(e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -71,11 +61,6 @@ public class Log4j2Logger implements Logger {
|
|||
logger.info(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
logger.info(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Throwable e) {
|
||||
logger.info(e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -91,11 +76,6 @@ public class Log4j2Logger implements Logger {
|
|||
logger.warn(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
logger.warn(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Throwable e) {
|
||||
logger.warn(e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -111,11 +91,6 @@ public class Log4j2Logger implements Logger {
|
|||
logger.error(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
logger.error(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable e) {
|
||||
logger.error(e == null ? null : e.getMessage(), e);
|
||||
|
|
@ -150,9 +125,4 @@ public class Log4j2Logger implements Logger {
|
|||
public boolean isErrorEnabled() {
|
||||
return logger.isErrorEnabled();
|
||||
}
|
||||
|
||||
// test purpose only
|
||||
public org.apache.logging.log4j.Logger getLogger() {
|
||||
return logger;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@ import org.apache.dubbo.common.logger.Level;
|
|||
import org.apache.dubbo.common.logger.Logger;
|
||||
import org.apache.dubbo.common.logger.support.FailsafeLogger;
|
||||
|
||||
import org.slf4j.helpers.FormattingTuple;
|
||||
import org.slf4j.helpers.MessageFormatter;
|
||||
import org.slf4j.spi.LocationAwareLogger;
|
||||
|
||||
public class Slf4jLogger implements Logger {
|
||||
|
|
@ -50,17 +48,6 @@ public class Slf4jLogger implements Logger {
|
|||
logger.trace(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
if (locationAwareLogger != null) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
locationAwareLogger.log(
|
||||
null, FQCN, LocationAwareLogger.TRACE_INT, msg, ft.getArgArray(), ft.getThrowable());
|
||||
return;
|
||||
}
|
||||
logger.trace(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(Throwable e) {
|
||||
if (locationAwareLogger != null) {
|
||||
|
|
@ -88,17 +75,6 @@ public class Slf4jLogger implements Logger {
|
|||
logger.debug(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
if (locationAwareLogger != null) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
locationAwareLogger.log(
|
||||
null, FQCN, LocationAwareLogger.DEBUG_INT, msg, ft.getArgArray(), ft.getThrowable());
|
||||
return;
|
||||
}
|
||||
logger.debug(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(Throwable e) {
|
||||
if (locationAwareLogger != null) {
|
||||
|
|
@ -126,16 +102,6 @@ public class Slf4jLogger implements Logger {
|
|||
logger.info(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
if (locationAwareLogger != null) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
locationAwareLogger.log(null, FQCN, LocationAwareLogger.INFO_INT, msg, ft.getArgArray(), ft.getThrowable());
|
||||
return;
|
||||
}
|
||||
logger.info(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(Throwable e) {
|
||||
if (locationAwareLogger != null) {
|
||||
|
|
@ -163,16 +129,6 @@ public class Slf4jLogger implements Logger {
|
|||
logger.warn(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
if (locationAwareLogger != null) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
locationAwareLogger.log(null, FQCN, LocationAwareLogger.WARN_INT, msg, ft.getArgArray(), ft.getThrowable());
|
||||
return;
|
||||
}
|
||||
logger.warn(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(Throwable e) {
|
||||
if (locationAwareLogger != null) {
|
||||
|
|
@ -200,17 +156,6 @@ public class Slf4jLogger implements Logger {
|
|||
logger.error(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
if (locationAwareLogger != null) {
|
||||
FormattingTuple ft = MessageFormatter.arrayFormat(msg, arguments);
|
||||
locationAwareLogger.log(
|
||||
null, FQCN, LocationAwareLogger.ERROR_INT, msg, ft.getArgArray(), ft.getThrowable());
|
||||
return;
|
||||
}
|
||||
logger.error(msg, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable e) {
|
||||
if (locationAwareLogger != null) {
|
||||
|
|
|
|||
|
|
@ -17,22 +17,16 @@
|
|||
package org.apache.dubbo.common.logger.support;
|
||||
|
||||
import org.apache.dubbo.common.Version;
|
||||
import org.apache.dubbo.common.logger.ListenableLogger;
|
||||
import org.apache.dubbo.common.logger.LogListener;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.Logger;
|
||||
import org.apache.dubbo.common.utils.NetUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* A fail-safe (ignoring exception thrown by logger) wrapper of error type aware logger.
|
||||
*/
|
||||
public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements ListenableLogger {
|
||||
public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements ErrorTypeAwareLogger {
|
||||
|
||||
/**
|
||||
* Template address for formatting.
|
||||
|
|
@ -41,16 +35,6 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements List
|
|||
|
||||
private static final Pattern ERROR_CODE_PATTERN = Pattern.compile("\\d+-\\d+");
|
||||
|
||||
/**
|
||||
* Listeners that listened to all Loggers.
|
||||
*/
|
||||
private static final List<LogListener> GLOBAL_LISTENERS = Collections.synchronizedList(new ArrayList<>());
|
||||
|
||||
/**
|
||||
* Listeners that listened to this listener.
|
||||
*/
|
||||
private final AtomicReference<List<LogListener>> listeners = new AtomicReference<>();
|
||||
|
||||
public FailsafeErrorTypeAwareLogger(Logger logger) {
|
||||
super(logger);
|
||||
}
|
||||
|
|
@ -97,7 +81,6 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements List
|
|||
}
|
||||
|
||||
try {
|
||||
onEvent(code, msg);
|
||||
getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg));
|
||||
} catch (Throwable t) {
|
||||
// ignored.
|
||||
|
|
@ -111,7 +94,6 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements List
|
|||
}
|
||||
|
||||
try {
|
||||
onEvent(code, msg);
|
||||
getLogger().warn(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e);
|
||||
} catch (Throwable t) {
|
||||
// ignored.
|
||||
|
|
@ -125,7 +107,6 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements List
|
|||
}
|
||||
|
||||
try {
|
||||
onEvent(code, msg);
|
||||
getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg));
|
||||
} catch (Throwable t) {
|
||||
// ignored.
|
||||
|
|
@ -139,44 +120,9 @@ public class FailsafeErrorTypeAwareLogger extends FailsafeLogger implements List
|
|||
}
|
||||
|
||||
try {
|
||||
onEvent(code, msg);
|
||||
getLogger().error(appendContextMessageWithInstructions(code, cause, extendedInformation, msg), e);
|
||||
} catch (Throwable t) {
|
||||
// ignored.
|
||||
}
|
||||
}
|
||||
|
||||
public static void registerGlobalListen(LogListener listener) {
|
||||
GLOBAL_LISTENERS.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerListen(LogListener listener) {
|
||||
listeners.getAndUpdate(logListeners -> {
|
||||
if (logListeners == null) {
|
||||
logListeners = Collections.synchronizedList(new ArrayList<>());
|
||||
}
|
||||
logListeners.add(listener);
|
||||
return logListeners;
|
||||
});
|
||||
}
|
||||
|
||||
private void onEvent(String code, String msg) {
|
||||
Optional.ofNullable(listeners.get())
|
||||
.ifPresent(logListeners -> logListeners.forEach(logListener -> {
|
||||
try {
|
||||
logListener.onMessage(code, msg);
|
||||
} catch (Exception e) {
|
||||
// ignored.
|
||||
}
|
||||
}));
|
||||
|
||||
GLOBAL_LISTENERS.forEach(logListener -> {
|
||||
try {
|
||||
logListener.onMessage(code, msg);
|
||||
} catch (Exception e) {
|
||||
// ignored.
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,17 +84,6 @@ public class FailsafeLogger implements Logger {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void trace(String msg, Object... arguments) {
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
logger.trace(appendContextMessage(msg), arguments);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Throwable e) {
|
||||
if (disabled) {
|
||||
|
|
@ -128,17 +117,6 @@ public class FailsafeLogger implements Logger {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void debug(String msg, Object... arguments) {
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
logger.debug(appendContextMessage(msg), arguments);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Throwable e) {
|
||||
if (disabled) {
|
||||
|
|
@ -161,17 +139,6 @@ public class FailsafeLogger implements Logger {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void info(String msg, Object... arguments) {
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
logger.info(appendContextMessage(msg), arguments);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Throwable e) {
|
||||
if (disabled) {
|
||||
|
|
@ -194,17 +161,6 @@ public class FailsafeLogger implements Logger {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void warn(String msg, Object... arguments) {
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
logger.warn(appendContextMessage(msg), arguments);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Throwable e) {
|
||||
if (disabled) {
|
||||
|
|
@ -227,17 +183,6 @@ public class FailsafeLogger implements Logger {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String msg, Object... arguments) {
|
||||
if (disabled) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
logger.error(appendContextMessage(msg), arguments);
|
||||
} catch (Throwable t) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable e) {
|
||||
if (disabled) {
|
||||
|
|
|
|||
|
|
@ -34,4 +34,6 @@ public interface DataStore {
|
|||
void put(String componentName, String key, Object value);
|
||||
|
||||
void remove(String componentName, String key);
|
||||
|
||||
default void addListener(DataStoreUpdateListener dataStoreUpdateListener) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,11 +14,8 @@
|
|||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.apache.dubbo.rpc.cluster.support;
|
||||
package org.apache.dubbo.common.store;
|
||||
|
||||
import org.apache.dubbo.common.extension.SPI;
|
||||
|
||||
@SPI
|
||||
public interface Greeting {
|
||||
String hello();
|
||||
public interface DataStoreUpdateListener {
|
||||
void onUpdate(String componentName, String key, Object value);
|
||||
}
|
||||
|
|
@ -16,8 +16,13 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.store.support;
|
||||
|
||||
import org.apache.dubbo.common.constants.LoggerCodeConstants;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.store.DataStore;
|
||||
import org.apache.dubbo.common.store.DataStoreUpdateListener;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashSet;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -25,9 +30,11 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
public class SimpleDataStore implements DataStore {
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(SimpleDataStore.class);
|
||||
|
||||
// <component name or id, <data-name, data-value>>
|
||||
private final ConcurrentMap<String, ConcurrentMap<String, Object>> data = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashSet<DataStoreUpdateListener> listeners = new ConcurrentHashSet<>();
|
||||
|
||||
@Override
|
||||
public Map<String, Object> get(String componentName) {
|
||||
|
|
@ -52,6 +59,7 @@ public class SimpleDataStore implements DataStore {
|
|||
Map<String, Object> componentData =
|
||||
ConcurrentHashMapUtils.computeIfAbsent(data, componentName, k -> new ConcurrentHashMap<>());
|
||||
componentData.put(key, value);
|
||||
notifyListeners(componentName, key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -60,5 +68,27 @@ public class SimpleDataStore implements DataStore {
|
|||
return;
|
||||
}
|
||||
data.get(componentName).remove(key);
|
||||
notifyListeners(componentName, key, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(DataStoreUpdateListener dataStoreUpdateListener) {
|
||||
listeners.add(dataStoreUpdateListener);
|
||||
}
|
||||
|
||||
private void notifyListeners(String componentName, String key, Object value) {
|
||||
for (DataStoreUpdateListener listener : listeners) {
|
||||
try {
|
||||
listener.onUpdate(componentName, key, value);
|
||||
} catch (Throwable t) {
|
||||
logger.warn(
|
||||
LoggerCodeConstants.INTERNAL_ERROR,
|
||||
"",
|
||||
"",
|
||||
"Failed to notify data store update listener. " + "ComponentName: " + componentName + " Key: "
|
||||
+ key,
|
||||
t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
package org.apache.dubbo.common.threadpool.support;
|
||||
|
||||
import org.apache.dubbo.common.URL;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.extension.ExtensionLoader;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
|
|
@ -26,7 +25,6 @@ import org.apache.dubbo.common.threadpool.event.ThreadPoolExhaustedListener;
|
|||
import org.apache.dubbo.common.utils.ConcurrentHashSet;
|
||||
import org.apache.dubbo.common.utils.JVMUtil;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
|
||||
import java.io.File;
|
||||
|
|
@ -44,8 +42,8 @@ import static java.lang.String.format;
|
|||
import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DUMP_ENABLE;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.OS_NAME_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_OS_NAME;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.THREAD_POOL_EXHAUSTED_LISTENERS_KEY;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_THREAD_POOL_EXHAUSTED;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_UNEXPECTED_CREATE_DUMP;
|
||||
|
|
@ -73,8 +71,7 @@ public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {
|
|||
|
||||
protected static Semaphore guard = new Semaphore(1);
|
||||
|
||||
private static final String USER_HOME =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.SystemProperty.USER_HOME);
|
||||
private static final String USER_HOME = System.getProperty("user.home");
|
||||
|
||||
private final Set<ThreadPoolExhaustedListener> listeners = new ConcurrentHashSet<>();
|
||||
|
||||
|
|
@ -171,8 +168,7 @@ public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {
|
|||
|
||||
SimpleDateFormat sdf;
|
||||
|
||||
String os = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_OS_NAME)
|
||||
.toLowerCase();
|
||||
String os = System.getProperty(OS_NAME_KEY).toLowerCase();
|
||||
|
||||
// window system don't support ":" in file name
|
||||
if (os.contains(OS_WIN_PREFIX)) {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@ package org.apache.dubbo.common.timer;
|
|||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.ClassUtils;
|
||||
import org.apache.dubbo.common.utils.SystemPropertyConfigUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
|
|
@ -37,7 +36,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_OS_NAME;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.OS_NAME_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.OS_WIN_PREFIX;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_RUN_THREAD_TASK;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_ERROR_TOO_MANY_INSTANCES;
|
||||
|
|
@ -812,7 +811,7 @@ public class HashedWheelTimer implements Timer {
|
|||
}
|
||||
}
|
||||
|
||||
private static final boolean IS_OS_WINDOWS = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_OS_NAME, "").toLowerCase(Locale.US).contains(OS_WIN_PREFIX);
|
||||
private static final boolean IS_OS_WINDOWS = System.getProperty(OS_NAME_KEY, "").toLowerCase(Locale.US).contains(OS_WIN_PREFIX);
|
||||
|
||||
private boolean isWindows() {
|
||||
return IS_OS_WINDOWS;
|
||||
|
|
|
|||
|
|
@ -132,38 +132,6 @@ public interface AnnotationUtils {
|
|||
return getAttribute(annotation, "value");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attribute from the specified {@link Annotation annotation}
|
||||
*
|
||||
* @param annotation the specified {@link Annotation annotation}
|
||||
* @param attributeNames the multiply attribute name arrays
|
||||
* @param <T> the type of attribute
|
||||
* @return the attribute value
|
||||
* @throws IllegalArgumentException If the attribute name can't be found
|
||||
*/
|
||||
static <T> T getAttribute(Annotation annotation, String... attributeNames) throws IllegalArgumentException {
|
||||
if (attributeNames == null || attributeNames.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (String attributeName : attributeNames) {
|
||||
T attribute = getAttribute(annotation, attributeName);
|
||||
|
||||
if (attribute == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// exclude string attribute default is empty
|
||||
if ((attribute instanceof String) && ((String) attribute).length() == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return attribute;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the {@link Annotation} from the specified {@link AnnotatedElement the annotated element} and
|
||||
* {@link Annotation annotation} class name
|
||||
|
|
|
|||
|
|
@ -76,8 +76,4 @@ public final class ArrayUtils {
|
|||
public static <T> T[] of(T... values) {
|
||||
return values;
|
||||
}
|
||||
|
||||
public static <T> T first(T[] data) {
|
||||
return isEmpty(data) ? null : data[0];
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,12 +28,6 @@ public abstract class Assert {
|
|||
}
|
||||
}
|
||||
|
||||
public static void notNull(Object obj, String format, Object... args) {
|
||||
if (obj == null) {
|
||||
throw new IllegalArgumentException(String.format(format, args));
|
||||
}
|
||||
}
|
||||
|
||||
public static void notEmptyString(String str, String message) {
|
||||
if (StringUtils.isEmpty(str)) {
|
||||
throw new IllegalArgumentException(message);
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import org.apache.dubbo.common.resource.GlobalResourcesRepository;
|
|||
|
||||
import java.io.IOException;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URL;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
|
@ -30,6 +31,7 @@ import java.util.LinkedHashMap;
|
|||
import java.util.LinkedHashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
|
|
@ -78,9 +80,15 @@ public class ClassLoaderResourceLoader {
|
|||
Enumeration<URL> urls;
|
||||
try {
|
||||
urls = currentClassLoader.getResources(fileName);
|
||||
boolean isNative = NativeUtils.isNative();
|
||||
if (urls != null) {
|
||||
while (urls.hasMoreElements()) {
|
||||
URL url = urls.nextElement();
|
||||
if (isNative) {
|
||||
// In native mode, the address of each URL is the same instead of different paths, so it is
|
||||
// necessary to set the ref to make it different
|
||||
setRef(url);
|
||||
}
|
||||
set.add(url);
|
||||
}
|
||||
}
|
||||
|
|
@ -104,6 +112,15 @@ public class ClassLoaderResourceLoader {
|
|||
}
|
||||
}
|
||||
|
||||
private static void setRef(URL url) {
|
||||
try {
|
||||
Field field = URL.class.getDeclaredField("ref");
|
||||
field.setAccessible(true);
|
||||
field.set(url, UUID.randomUUID().toString());
|
||||
} catch (Throwable ignore) {
|
||||
}
|
||||
}
|
||||
|
||||
// for test
|
||||
protected static SoftReference<Map<ClassLoader, Map<String, Set<URL>>>> getClassLoaderResourcesCache() {
|
||||
return classLoaderResourcesCache;
|
||||
|
|
|
|||
|
|
@ -214,19 +214,6 @@ public class ClassUtils {
|
|||
return forName(name, getClassLoader());
|
||||
}
|
||||
|
||||
/**
|
||||
* find class and don`t expect to throw exception
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
public static Class<?> forNameAndTryCatch(String name) {
|
||||
try {
|
||||
return forName(name, getClassLoader());
|
||||
} catch (Throwable e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Replacement for <code>Class.forName()</code> that also returns Class
|
||||
* instances for primitives (like "int") and array class names (like
|
||||
|
|
@ -327,10 +314,6 @@ public class ClassUtils {
|
|||
return type != null && (type.isPrimitive() || isSimpleType(type));
|
||||
}
|
||||
|
||||
public static boolean isPrimitiveWrapper(Class<?> type) {
|
||||
return PRIMITIVE_WRAPPER_TYPE_MAP.containsKey(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* The specified type is simple type or not
|
||||
*
|
||||
|
|
|
|||
|
|
@ -24,14 +24,11 @@ import java.util.Collections;
|
|||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static java.util.Collections.emptySet;
|
||||
|
|
@ -407,19 +404,13 @@ public class CollectionUtils {
|
|||
return null;
|
||||
}
|
||||
if (values instanceof List) {
|
||||
return ((List<T>) values).get(0);
|
||||
List<T> list = (List<T>) values;
|
||||
return list.get(0);
|
||||
} else {
|
||||
return values.iterator().next();
|
||||
}
|
||||
}
|
||||
|
||||
public static <T> T first(List<T> values) {
|
||||
if (isEmpty(values)) {
|
||||
return null;
|
||||
}
|
||||
return values.get(0);
|
||||
}
|
||||
|
||||
public static <T> Set<T> toTreeSet(Set<T> set) {
|
||||
if (isEmpty(set)) {
|
||||
return set;
|
||||
|
|
@ -429,78 +420,4 @@ public class CollectionUtils {
|
|||
}
|
||||
return set;
|
||||
}
|
||||
|
||||
public static <T> Set<T> newHashSet(int expectedSize) {
|
||||
return new HashSet<>(capacity(expectedSize));
|
||||
}
|
||||
|
||||
public static <T> Set<T> newLinkedHashSet(int expectedSize) {
|
||||
return new LinkedHashSet<>(capacity(expectedSize));
|
||||
}
|
||||
|
||||
public static <T, K> Map<K, T> newHashMap(int expectedSize) {
|
||||
return new HashMap<>(capacity(expectedSize));
|
||||
}
|
||||
|
||||
public static <T, K> Map<K, T> newLinkedHashMap(int expectedSize) {
|
||||
return new LinkedHashMap<>(capacity(expectedSize));
|
||||
}
|
||||
|
||||
public static <T, K> Map<K, T> newConcurrentHashMap(int expectedSize) {
|
||||
if (JRE.JAVA_8.isCurrentVersion()) {
|
||||
return new SafeConcurrentHashMap<>(capacity(expectedSize));
|
||||
}
|
||||
return new ConcurrentHashMap<>(capacity(expectedSize));
|
||||
}
|
||||
|
||||
public static <T, K> Map<K, T> newConcurrentHashMap() {
|
||||
if (JRE.JAVA_8.isCurrentVersion()) {
|
||||
return new SafeConcurrentHashMap<>();
|
||||
}
|
||||
return new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public static int capacity(int expectedSize) {
|
||||
if (expectedSize < 3) {
|
||||
if (expectedSize < 0) {
|
||||
throw new IllegalArgumentException("expectedSize cannot be negative but was: " + expectedSize);
|
||||
}
|
||||
return expectedSize + 1;
|
||||
}
|
||||
if (expectedSize < 1 << (Integer.SIZE - 2)) {
|
||||
return (int) (expectedSize / 0.75F + 1.0F);
|
||||
}
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
public static class SafeConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SafeConcurrentHashMap() {}
|
||||
|
||||
public SafeConcurrentHashMap(int initialCapacity) {
|
||||
super(initialCapacity);
|
||||
}
|
||||
|
||||
public SafeConcurrentHashMap(Map<? extends K, ? extends V> m) {
|
||||
super(m);
|
||||
}
|
||||
|
||||
@Override
|
||||
public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
|
||||
V value = get(key);
|
||||
if (value != null) {
|
||||
return value;
|
||||
}
|
||||
value = mappingFunction.apply(key);
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
V exists = putIfAbsent(key, value);
|
||||
if (exists != null) {
|
||||
return exists;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,9 +164,9 @@ public class ConfigUtils {
|
|||
* @return
|
||||
*/
|
||||
public static Properties getProperties(Set<ClassLoader> classLoaders) {
|
||||
String path = SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_PROPERTIES_KEY);
|
||||
String path = System.getProperty(CommonConstants.DUBBO_PROPERTIES_KEY);
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
path = System.getenv(CommonConstants.DubboProperty.DUBBO_PROPERTIES_KEY);
|
||||
path = System.getenv(CommonConstants.DUBBO_PROPERTIES_KEY);
|
||||
if (StringUtils.isEmpty(path)) {
|
||||
path = CommonConstants.DEFAULT_DUBBO_PROPERTIES;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,259 +0,0 @@
|
|||
/*
|
||||
* 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 org.apache.dubbo.common.utils;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.time.temporal.TemporalAccessor;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public final class DateUtils {
|
||||
|
||||
public static final ZoneId GMT = ZoneId.of("GMT");
|
||||
public static final ZoneId UTC = ZoneId.of("UTC");
|
||||
|
||||
public static final String DATE = "yyyy-MM-dd";
|
||||
public static final String DATE_MIN = "yyyy-MM-dd HH:mm";
|
||||
public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";
|
||||
public static final String JDK_TIME = "EEE MMM dd HH:mm:ss zzz yyyy";
|
||||
public static final String ASC_TIME = "EEE MMM d HH:mm:ss yyyy";
|
||||
public static final String RFC1036 = "EEE, dd-MMM-yy HH:mm:ss zzz";
|
||||
|
||||
public static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern(DATE);
|
||||
public static final DateTimeFormatter DATE_MIN_FORMAT = DateTimeFormatter.ofPattern(DATE_MIN);
|
||||
public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern(DATE_TIME);
|
||||
public static final DateTimeFormatter JDK_TIME_FORMAT = DateTimeFormatter.ofPattern(JDK_TIME, Locale.US);
|
||||
public static final DateTimeFormatter ASC_TIME_FORMAT = DateTimeFormatter.ofPattern(ASC_TIME, Locale.US);
|
||||
public static final DateTimeFormatter RFC1036_FORMAT = DateTimeFormatter.ofPattern(RFC1036, Locale.US);
|
||||
|
||||
private static final Map<String, DateTimeFormatter> CACHE = new LRUCache<>(64);
|
||||
private static final List<DateTimeFormatter> CUSTOM_FORMATTERS = new CopyOnWriteArrayList<>();
|
||||
|
||||
private DateUtils() {}
|
||||
|
||||
public static void registerFormatter(String pattern) {
|
||||
CUSTOM_FORMATTERS.add(DateTimeFormatter.ofPattern(pattern));
|
||||
}
|
||||
|
||||
public static void registerFormatter(DateTimeFormatter formatter) {
|
||||
CUSTOM_FORMATTERS.add(formatter);
|
||||
}
|
||||
|
||||
public static Date parse(String str, String pattern) {
|
||||
if (DATE_TIME.equals(pattern)) {
|
||||
return parse(str, DATE_TIME_FORMAT);
|
||||
}
|
||||
DateTimeFormatter formatter = getFormatter(pattern);
|
||||
return parse(str, formatter);
|
||||
}
|
||||
|
||||
public static Date parse(String str, DateTimeFormatter formatter) {
|
||||
return toDate(formatter.parse(str));
|
||||
}
|
||||
|
||||
public static String format(Date date) {
|
||||
return format(date, DATE_TIME_FORMAT);
|
||||
}
|
||||
|
||||
public static String format(Date date, String pattern) {
|
||||
if (DATE_TIME.equals(pattern)) {
|
||||
return format(date, DATE_TIME_FORMAT);
|
||||
}
|
||||
DateTimeFormatter formatter = getFormatter(pattern);
|
||||
return format(date, formatter);
|
||||
}
|
||||
|
||||
public static String format(Date date, DateTimeFormatter formatter) {
|
||||
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()));
|
||||
}
|
||||
|
||||
public static String format(Date date, DateTimeFormatter formatter, ZoneId zone) {
|
||||
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), zone));
|
||||
}
|
||||
|
||||
public static String formatGMT(Date date, DateTimeFormatter formatter) {
|
||||
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), GMT));
|
||||
}
|
||||
|
||||
public static String formatUTC(Date date, DateTimeFormatter formatter) {
|
||||
return formatter.format(ZonedDateTime.ofInstant(date.toInstant(), UTC));
|
||||
}
|
||||
|
||||
public static String formatHeader(Date date) {
|
||||
return DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.ofInstant(date.toInstant(), GMT));
|
||||
}
|
||||
|
||||
private static DateTimeFormatter getFormatter(String pattern) {
|
||||
return CACHE.computeIfAbsent(pattern, DateTimeFormatter::ofPattern);
|
||||
}
|
||||
|
||||
public static Date parse(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Date) {
|
||||
return (Date) value;
|
||||
}
|
||||
if (value instanceof Calendar) {
|
||||
return ((Calendar) value).getTime();
|
||||
}
|
||||
if (value.getClass() == Instant.class) {
|
||||
return Date.from((Instant) value);
|
||||
}
|
||||
if (value instanceof TemporalAccessor) {
|
||||
return Date.from(Instant.from((TemporalAccessor) value));
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return new Date(((Number) value).longValue());
|
||||
}
|
||||
if (value instanceof CharSequence) {
|
||||
return parse(value.toString());
|
||||
}
|
||||
throw new IllegalArgumentException("Can not cast to Date, value : '" + value + "'");
|
||||
}
|
||||
|
||||
public static Date parse(String value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
String str = value.trim();
|
||||
int len = str.length();
|
||||
if (len == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
boolean isIso = true;
|
||||
boolean isNumeric = true;
|
||||
boolean hasDate = false;
|
||||
boolean hasTime = false;
|
||||
for (int i = 0; i < len; i++) {
|
||||
char c = str.charAt(i);
|
||||
switch (c) {
|
||||
case ' ':
|
||||
isIso = false;
|
||||
break;
|
||||
case '-':
|
||||
hasDate = true;
|
||||
break;
|
||||
case 'T':
|
||||
case ':':
|
||||
hasTime = true;
|
||||
break;
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
continue;
|
||||
default:
|
||||
}
|
||||
if (isNumeric) {
|
||||
isNumeric = false;
|
||||
}
|
||||
}
|
||||
DateTimeFormatter formatter = null;
|
||||
if (isIso) {
|
||||
if (hasDate) {
|
||||
formatter = hasTime ? DateTimeFormatter.ISO_DATE_TIME : DateTimeFormatter.ISO_DATE;
|
||||
} else if (hasTime) {
|
||||
formatter = DateTimeFormatter.ISO_TIME;
|
||||
}
|
||||
}
|
||||
if (isNumeric) {
|
||||
long num = Long.parseLong(str);
|
||||
if (num > 21000101 || num < 19700101) {
|
||||
return new Date(num);
|
||||
}
|
||||
formatter = DateTimeFormatter.BASIC_ISO_DATE;
|
||||
}
|
||||
switch (len) {
|
||||
case 10:
|
||||
formatter = DATE_FORMAT;
|
||||
break;
|
||||
case 16:
|
||||
formatter = DATE_MIN_FORMAT;
|
||||
break;
|
||||
case 19:
|
||||
formatter = DATE_TIME_FORMAT;
|
||||
break;
|
||||
case 23:
|
||||
case 24:
|
||||
formatter = ASC_TIME_FORMAT;
|
||||
break;
|
||||
case 27:
|
||||
formatter = RFC1036_FORMAT;
|
||||
break;
|
||||
case 28:
|
||||
formatter = JDK_TIME_FORMAT;
|
||||
break;
|
||||
case 29:
|
||||
formatter = DateTimeFormatter.RFC_1123_DATE_TIME;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
if (formatter != null) {
|
||||
try {
|
||||
return toDate(formatter.parse(str));
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
for (DateTimeFormatter dtf : CUSTOM_FORMATTERS) {
|
||||
try {
|
||||
return parse(str, dtf);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Can not cast to Date, value : '" + value + "'");
|
||||
}
|
||||
|
||||
public static Date toDate(TemporalAccessor temporal) {
|
||||
if (temporal instanceof Instant) {
|
||||
return Date.from((Instant) temporal);
|
||||
}
|
||||
long timestamp;
|
||||
if (temporal.isSupported(ChronoField.EPOCH_DAY)) {
|
||||
timestamp = temporal.getLong(ChronoField.EPOCH_DAY) * 86400000;
|
||||
} else {
|
||||
timestamp = LocalDate.now().toEpochDay() * 86400000;
|
||||
}
|
||||
if (temporal.isSupported(ChronoField.MILLI_OF_DAY)) {
|
||||
timestamp += temporal.getLong(ChronoField.MILLI_OF_DAY);
|
||||
}
|
||||
if (temporal.isSupported(ChronoField.OFFSET_SECONDS)) {
|
||||
timestamp -= temporal.getLong(ChronoField.OFFSET_SECONDS) * 1000;
|
||||
} else {
|
||||
timestamp -= TimeZone.getDefault().getRawOffset();
|
||||
}
|
||||
return new Date(timestamp);
|
||||
}
|
||||
}
|
||||
|
|
@ -16,10 +16,8 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.utils;
|
||||
|
||||
import org.apache.dubbo.common.aot.NativeDetector;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.serialization.ClassHolder;
|
||||
import org.apache.dubbo.rpc.model.FrameworkModel;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
@ -42,7 +40,6 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
private volatile boolean checkSerializable = true;
|
||||
|
||||
private final SerializeSecurityManager serializeSecurityManager;
|
||||
private final ClassHolder classHolder;
|
||||
private volatile long[] allowPrefixes = new long[0];
|
||||
|
||||
private volatile long[] disAllowPrefixes = new long[0];
|
||||
|
|
@ -50,8 +47,6 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
public DefaultSerializeClassChecker(FrameworkModel frameworkModel) {
|
||||
serializeSecurityManager = frameworkModel.getBeanFactory().getOrRegisterBean(SerializeSecurityManager.class);
|
||||
serializeSecurityManager.registerListener(this);
|
||||
classHolder =
|
||||
NativeDetector.inNativeImage() ? frameworkModel.getBeanFactory().getBean(ClassHolder.class) : null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -125,7 +120,7 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
|
||||
private Class<?> loadClass0(ClassLoader classLoader, String className) throws ClassNotFoundException {
|
||||
if (checkStatus == SerializeCheckStatus.DISABLE) {
|
||||
return classForName(classLoader, className);
|
||||
return ClassUtils.forName(className, classLoader);
|
||||
}
|
||||
|
||||
long hash = MAGIC_HASH_CODE;
|
||||
|
|
@ -138,7 +133,7 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
hash *= MAGIC_PRIME;
|
||||
|
||||
if (Arrays.binarySearch(allowPrefixes, hash) >= 0) {
|
||||
return classForName(classLoader, className);
|
||||
return ClassUtils.forName(className, classLoader);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -195,7 +190,7 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
}
|
||||
}
|
||||
|
||||
Class<?> clazz = classForName(classLoader, className);
|
||||
Class<?> clazz = ClassUtils.forName(className, classLoader);
|
||||
if (serializeSecurityManager.getWarnedClasses().add(className)) {
|
||||
logger.warn(
|
||||
PROTOCOL_UNTRUSTED_SERIALIZE_CLASS,
|
||||
|
|
@ -209,16 +204,6 @@ public class DefaultSerializeClassChecker implements AllowClassNotifyListener {
|
|||
return clazz;
|
||||
}
|
||||
|
||||
private Class<?> classForName(ClassLoader classLoader, String className) throws ClassNotFoundException {
|
||||
if (classHolder != null) {
|
||||
Class<?> aClass = classHolder.loadClass(className, classLoader);
|
||||
if (aClass != null) {
|
||||
return aClass;
|
||||
}
|
||||
}
|
||||
return ClassUtils.forName(className, classLoader);
|
||||
}
|
||||
|
||||
public static DefaultSerializeClassChecker getInstance() {
|
||||
return FrameworkModel.defaultModel().getBeanFactory().getBean(DefaultSerializeClassChecker.class);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,91 +16,24 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.utils;
|
||||
|
||||
import org.apache.dubbo.common.logger.Level;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.logging.log4j.core.LogEvent;
|
||||
import org.apache.logging.log4j.core.appender.AbstractAppender;
|
||||
import org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender;
|
||||
import org.apache.logging.log4j.core.appender.FileAppender;
|
||||
import org.apache.logging.log4j.core.config.Property;
|
||||
import org.apache.logging.log4j.core.config.plugins.Plugin;
|
||||
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
|
||||
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
|
||||
import org.apache.log4j.FileAppender;
|
||||
import org.apache.log4j.spi.LoggingEvent;
|
||||
|
||||
@Plugin(name = "Dubbo", category = "Core", elementType = "appender")
|
||||
public class DubboAppender extends AbstractAppender {
|
||||
|
||||
public static class Builder extends AbstractOutputStreamAppender.Builder<Builder>
|
||||
implements org.apache.logging.log4j.core.util.Builder<DubboAppender> {
|
||||
|
||||
@PluginBuilderAttribute
|
||||
private String fileName;
|
||||
|
||||
@PluginBuilderAttribute
|
||||
private boolean append = true;
|
||||
|
||||
@PluginBuilderAttribute
|
||||
private boolean locking;
|
||||
|
||||
public Builder setFileName(String fileName) {
|
||||
this.fileName = fileName;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setAppend(boolean append) {
|
||||
this.append = append;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setLocking(boolean locking) {
|
||||
this.locking = locking;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DubboAppender build() {
|
||||
return new DubboAppender(getName(), buildFileAppender());
|
||||
}
|
||||
|
||||
private <B extends FileAppender.Builder<B>> FileAppender buildFileAppender() {
|
||||
FileAppender.Builder<B> builder = FileAppender.newBuilder();
|
||||
builder.setIgnoreExceptions(isIgnoreExceptions());
|
||||
builder.setLayout(getLayout());
|
||||
builder.setName(getName() + "-File");
|
||||
builder.setConfiguration(getConfiguration());
|
||||
builder.setBufferedIo(isBufferedIo());
|
||||
builder.setBufferSize(getBufferSize());
|
||||
builder.setImmediateFlush(isImmediateFlush());
|
||||
builder.withFileName(fileName == null || fileName.isEmpty() ? DEFAULT_FILE_NAME : fileName);
|
||||
builder.withAppend(append);
|
||||
builder.withLocking(locking);
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
public class DubboAppender extends FileAppender {
|
||||
|
||||
private static final String DEFAULT_FILE_NAME = "dubbo.log";
|
||||
|
||||
public static boolean available = false;
|
||||
public static List<Log> logList = new ArrayList<>();
|
||||
|
||||
private final FileAppender fileAppender;
|
||||
|
||||
public DubboAppender() {
|
||||
this("Dubbo", null);
|
||||
super();
|
||||
setFile(DEFAULT_FILE_NAME);
|
||||
}
|
||||
|
||||
private DubboAppender(String name, FileAppender fileAppender) {
|
||||
super(name, null, null, true, Property.EMPTY_ARRAY);
|
||||
this.fileAppender = fileAppender;
|
||||
}
|
||||
public static boolean available = false;
|
||||
|
||||
@PluginBuilderFactory
|
||||
public static Builder newBuilder() {
|
||||
return new Builder().asBuilder();
|
||||
}
|
||||
public static List<Log> logList = new ArrayList<>();
|
||||
|
||||
public static void doStart() {
|
||||
available = true;
|
||||
|
|
@ -115,39 +48,20 @@ public class DubboAppender extends AbstractAppender {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void append(LogEvent event) {
|
||||
if (fileAppender != null) {
|
||||
fileAppender.append(event);
|
||||
}
|
||||
public void append(LoggingEvent event) {
|
||||
super.append(event);
|
||||
if (available) {
|
||||
logList.add(parseLog(event));
|
||||
Log temp = parseLog(event);
|
||||
logList.add(temp);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
fileAppender.initialize();
|
||||
super.initialize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start() {
|
||||
fileAppender.start();
|
||||
super.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
super.stop();
|
||||
fileAppender.stop();
|
||||
}
|
||||
|
||||
private Log parseLog(LogEvent event) {
|
||||
private Log parseLog(LoggingEvent event) {
|
||||
Log log = new Log();
|
||||
log.setLogName(event.getLoggerName());
|
||||
log.setLogLevel(Level.valueOf(event.getLevel().name()));
|
||||
log.setLogName(event.getLogger().getName());
|
||||
log.setLogLevel(event.getLevel());
|
||||
log.setLogThread(event.getThreadName());
|
||||
log.setLogMessage(event.getMessage().getFormattedMessage());
|
||||
log.setLogMessage(event.getMessage().toString());
|
||||
return log;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,8 +19,6 @@ package org.apache.dubbo.common.utils;
|
|||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SystemProperty.SYSTEM_JAVA_VERSION;
|
||||
|
||||
/**
|
||||
* JRE version
|
||||
*/
|
||||
|
|
@ -83,7 +81,7 @@ public enum JRE {
|
|||
|
||||
private static JRE getJre() {
|
||||
// get java version from system property
|
||||
String version = SystemPropertyConfigUtils.getSystemProperty(SYSTEM_JAVA_VERSION);
|
||||
String version = System.getProperty("java.version");
|
||||
boolean isBlank = StringUtils.isBlank(version);
|
||||
if (isBlank) {
|
||||
logger.debug("java.version is blank");
|
||||
|
|
|
|||
|
|
@ -56,8 +56,7 @@ public class JVMUtil {
|
|||
int i = 0;
|
||||
// default is 32, means only print up to 32 lines
|
||||
int jstackMaxLine = 32;
|
||||
String jstackMaxLineStr =
|
||||
SystemPropertyConfigUtils.getSystemProperty(CommonConstants.DubboProperty.DUBBO_JSTACK_MAXLINE);
|
||||
String jstackMaxLineStr = System.getProperty(CommonConstants.DUBBO_JSTACK_MAXLINE);
|
||||
if (StringUtils.isNotEmpty(jstackMaxLineStr)) {
|
||||
try {
|
||||
jstackMaxLine = Integer.parseInt(jstackMaxLineStr);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue