Merge remote-tracking branch 'upstream/dev' into spilit
This commit is contained in:
commit
2603d52044
|
|
@ -8,7 +8,7 @@ assignees: ''
|
|||
|
||||
*For better global communication, please give priority to using English description, thx! *
|
||||
|
||||
*Please review https://dolphinscheduler.apache.org/en-us/docs/development/issue.html when describe an issue.*
|
||||
*Please review https://dolphinscheduler.apache.org/en-us/community/development/issue.html when describe an issue.*
|
||||
|
||||
**Describe the feature**
|
||||
A clear and concise description of what the feature is.
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ assignees: ''
|
|||
|
||||
*For better global communication, please give priority to using English description, thx! *
|
||||
|
||||
*Please review https://dolphinscheduler.apache.org/en-us/docs/development/issue.html when describe an issue.*
|
||||
*Please review https://dolphinscheduler.apache.org/en-us/community/development/issue.html when describe an issue.*
|
||||
|
||||
**Describe the question**
|
||||
A clear and concise description of what the improvement is.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
## *Tips*
|
||||
- *Thanks very much for contributing to Apache DolphinScheduler.*
|
||||
- *Please review https://dolphinscheduler.apache.org/en-us/community/index.html before opening a pull request.*
|
||||
- *Please review https://dolphinscheduler.apache.org/en-us/community/development/pull-request.html before opening a pull request.*
|
||||
|
||||
## What is the purpose of the pull request
|
||||
|
||||
|
|
|
|||
37
README.md
37
README.md
|
|
@ -1,6 +1,7 @@
|
|||
Dolphin Scheduler Official Website
|
||||
[dolphinscheduler.apache.org](https://dolphinscheduler.apache.org)
|
||||
============
|
||||
|
||||
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||
[](https://github.com/apache/Incubator-DolphinScheduler)
|
||||
[](https://codecov.io/gh/apache/incubator-dolphinscheduler/branch/dev)
|
||||
|
|
@ -12,10 +13,9 @@ Dolphin Scheduler Official Website
|
|||
[](README.md)
|
||||
[](README_zh_CN.md)
|
||||
|
||||
## Design Features
|
||||
|
||||
### Design Features:
|
||||
|
||||
DolphinScheduler is a distributed and extensible workflow scheduler platform with powerful DAG visual interfaces, dedicated to solving complex job dependencies in the data pipeline and providing various types of jobs available `out of the box`.
|
||||
DolphinScheduler is a distributed and extensible workflow scheduler platform with powerful DAG visual interfaces, dedicated to solving complex job dependencies in the data pipeline and providing various types of jobs available `out of the box`.
|
||||
|
||||
Its main objectives are as follows:
|
||||
|
||||
|
|
@ -34,8 +34,7 @@ Its main objectives are as follows:
|
|||
- Support internationalization.
|
||||
- More features waiting for partners to explore...
|
||||
|
||||
|
||||
### What's in DolphinScheduler
|
||||
## What's in DolphinScheduler
|
||||
|
||||
Stability | Accessibility | Features | Scalability |
|
||||
-- | -- | -- | --
|
||||
|
|
@ -43,8 +42,7 @@ Decentralized multi-master and multi-worker | Visualization of workflow key info
|
|||
support HA | Visualization of all workflow operations, dragging tasks to draw DAGs, configuring data sources and resources. At the same time, for third-party systems, provide API mode operations. | Users on DolphinScheduler can achieve many-to-one or one-to-one mapping relationship through tenants and Hadoop users, which is very important for scheduling large data jobs. | The scheduler supports distributed scheduling, and the overall scheduling capability will increase linearly with the scale of the cluster. Master and Worker support dynamic adjustment.
|
||||
Overload processing: By using the task queue mechanism, the number of schedulable tasks on a single machine can be flexibly configured. Machine jam can be avoided with high tolerance to numbers of tasks cached in task queue. | One-click deployment | Support traditional shell tasks, and big data platform task scheduling: MR, Spark, SQL (MySQL, PostgreSQL, hive, spark SQL), Python, Procedure, Sub_Process | |
|
||||
|
||||
|
||||
### User Interface Screenshots
|
||||
## User Interface Screenshots
|
||||
|
||||

|
||||

|
||||
|
|
@ -55,11 +53,15 @@ Overload processing: By using the task queue mechanism, the number of schedulabl
|
|||

|
||||

|
||||
|
||||
### QuickStart in Docker
|
||||
Please referer the official website document:[[QuickStart in Docker](https://dolphinscheduler.apache.org/en-us/docs/1.3.4/user_doc/docker-deployment.html)]
|
||||
## QuickStart in Docker
|
||||
|
||||
Please referer the official website document: [QuickStart in Docker](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/docker-deployment.html)
|
||||
|
||||
### How to Build
|
||||
## QuickStart in Kubernetes
|
||||
|
||||
Please referer the official website document: [QuickStart in Kubernetes](https://dolphinscheduler.apache.org/en-us/docs/latest/user_doc/kubernetes-deployment.html)
|
||||
|
||||
## How to Build
|
||||
|
||||
```bash
|
||||
./mvnw clean install -Prelease
|
||||
|
|
@ -72,25 +74,26 @@ dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release
|
|||
dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release.version}-src.zip: Source code package of DolphinScheduler
|
||||
```
|
||||
|
||||
### Thanks
|
||||
## Thanks
|
||||
|
||||
DolphinScheduler is based on a lot of excellent open-source projects, such as google guava, guice, grpc, netty, ali bonecp, quartz, and many open-source projects of Apache and so on.
|
||||
We would like to express our deep gratitude to all the open-source projects used in Dolphin Scheduler. We hope that we are not only the beneficiaries of open-source, but also give back to the community. Besides, we hope everyone who have the same enthusiasm and passion for open source could join in and contribute to the open-source community!
|
||||
|
||||
### Get Help
|
||||
## Get Help
|
||||
|
||||
1. Submit an [[issue](https://github.com/apache/incubator-dolphinscheduler/issues/new/choose)]
|
||||
1. Subscribe to this mail list: https://dolphinscheduler.apache.org/en-us/community/development/subscribe.html, then email dev@dolphinscheduler.apache.org
|
||||
|
||||
## Community
|
||||
|
||||
### Community
|
||||
You are so much welcomed to communicate with the developers and users of Dolphin Scheduler freely. There are two ways to find them:
|
||||
1. Join the slack channel by [this invitation link](https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-l8k90ceu-wwUfobaDkJxjzMfZp4y1Ag).
|
||||
1. Join the slack channel by [this invitation link](https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-mzqu52gi-rCggPkSHQ0DZYkwbTxO1Gw).
|
||||
2. Follow the [twitter account of Dolphin Scheduler](https://twitter.com/dolphinschedule) and get the latest news just on time.
|
||||
|
||||
## How to Contribute
|
||||
|
||||
### How to Contribute
|
||||
The community welcomes everyone to participate in contributing, please refer to this website to find out more: [[How to contribute](https://dolphinscheduler.apache.org/en-us/community/development/contribute.html)]
|
||||
|
||||
## License
|
||||
|
||||
### License
|
||||
Please refer to the [LICENSE](https://github.com/apache/incubator-dolphinscheduler/blob/dev/LICENSE) file.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,23 +1,24 @@
|
|||
Dolphin Scheduler Official Website
|
||||
[dolphinscheduler.apache.org](https://dolphinscheduler.apache.org)
|
||||
============
|
||||
|
||||
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||
[](https://github.com/apache/Incubator-DolphinScheduler)
|
||||
[](https://codecov.io/gh/apache/incubator-dolphinscheduler/branch/dev)
|
||||
[](https://sonarcloud.io/dashboard?id=apache-dolphinscheduler)
|
||||
|
||||
> Dolphin Scheduler for Big Data
|
||||
|
||||
|
||||
|
||||
[](https://starchart.cc/apache/incubator-dolphinscheduler)
|
||||
|
||||
[](README_zh_CN.md)
|
||||
[](README.md)
|
||||
|
||||
## 设计特点
|
||||
|
||||
一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中`开箱即用`。
|
||||
|
||||
**设计特点:** 一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中`开箱即用`。
|
||||
其主要目标如下:
|
||||
|
||||
- 以DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态
|
||||
- 支持丰富的任务类型:Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql),Python,Sub_Process、Procedure等
|
||||
- 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作
|
||||
|
|
@ -33,8 +34,7 @@ Dolphin Scheduler Official Website
|
|||
- 支持国际化
|
||||
- 还有更多等待伙伴们探索
|
||||
|
||||
|
||||
### 系统部分截图
|
||||
## 系统部分截图
|
||||
|
||||

|
||||
|
||||
|
|
@ -50,50 +50,51 @@ Dolphin Scheduler Official Website
|
|||
|
||||

|
||||
|
||||
|
||||
### 近期研发计划
|
||||
## 近期研发计划
|
||||
|
||||
DolphinScheduler的工作计划:<a href="https://github.com/apache/incubator-dolphinscheduler/projects/1" target="_blank">研发计划</a> ,其中 In Develop卡片下是正在研发的功能,TODO卡片是待做事项(包括 feature ideas)
|
||||
|
||||
### 参与贡献
|
||||
## 参与贡献
|
||||
|
||||
非常欢迎大家来参与贡献,贡献流程请参考:
|
||||
[[参与贡献](https://dolphinscheduler.apache.org/zh-cn/docs/development/contribute.html)]
|
||||
[[参与贡献](https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html)]
|
||||
|
||||
### How to Build
|
||||
## 快速试用 Docker
|
||||
|
||||
请参考官方文档: [快速试用 Docker 部署](https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/docker-deployment.html)
|
||||
|
||||
## 快速试用 Kubernetes
|
||||
|
||||
请参考官方文档: [快速试用 Kubernetes 部署](https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/kubernetes-deployment.html)
|
||||
|
||||
## 如何构建
|
||||
|
||||
```bash
|
||||
./mvnw clean install -Prelease
|
||||
```
|
||||
|
||||
Artifact:
|
||||
制品:
|
||||
|
||||
```
|
||||
dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release.version}-dolphinscheduler-bin.tar.gz: Binary package of DolphinScheduler
|
||||
dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release.version}-src.zip: Source code package of DolphinScheduler
|
||||
dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release.version}-dolphinscheduler-bin.tar.gz: DolphinScheduler 二进制包
|
||||
dolphinscheduler-dist/target/apache-dolphinscheduler-incubating-${latest.release.version}-src.zip: DolphinScheduler 源代码包
|
||||
```
|
||||
|
||||
### 感谢
|
||||
## 感谢
|
||||
|
||||
Dolphin Scheduler使用了很多优秀的开源项目,比如google的guava、guice、grpc,netty,ali的bonecp,quartz,以及apache的众多开源项目等等,
|
||||
正是由于站在这些开源项目的肩膀上,才有Dolphin Scheduler的诞生的可能。对此我们对使用的所有开源软件表示非常的感谢!我们也希望自己不仅是开源的受益者,也能成为开源的贡献者,也希望对开源有同样热情和信念的伙伴加入进来,一起为开源献出一份力!
|
||||
|
||||
## 获得帮助
|
||||
|
||||
### 获得帮助
|
||||
1. 提交issue
|
||||
2. 先订阅邮件开发列表:[订阅邮件列表](https://dolphinscheduler.apache.org/zh-cn/community/development/subscribe.html), 订阅成功后发送邮件到dev@dolphinscheduler.apache.org.
|
||||
|
||||
### 社区
|
||||
1. 通过[该申请链接](https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-l8k90ceu-wwUfobaDkJxjzMfZp4y1Ag)加入slack channel
|
||||
## 社区
|
||||
|
||||
1. 通过[该申请链接](https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-mzqu52gi-rCggPkSHQ0DZYkwbTxO1Gw)加入slack channel
|
||||
2. 关注[Apache Dolphin Scheduler的Twitter账号](https://twitter.com/dolphinschedule)获取实时动态
|
||||
|
||||
### 版权
|
||||
## 版权
|
||||
|
||||
请参考 [LICENSE](https://github.com/apache/incubator-dolphinscheduler/blob/dev/LICENSE) 文件.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -44,11 +44,10 @@ COPY ./startup-init-conf.sh /root/startup-init-conf.sh
|
|||
COPY ./startup.sh /root/startup.sh
|
||||
COPY ./conf/dolphinscheduler/*.tpl /opt/dolphinscheduler/conf/
|
||||
COPY ./conf/dolphinscheduler/logback/* /opt/dolphinscheduler/conf/
|
||||
COPY ./conf/dolphinscheduler/env/dolphinscheduler_env.sh /opt/dolphinscheduler/conf/env/
|
||||
COPY ./conf/dolphinscheduler/env/dolphinscheduler_env.sh.tpl /opt/dolphinscheduler/conf/env/
|
||||
RUN dos2unix /root/checkpoint.sh && \
|
||||
dos2unix /root/startup-init-conf.sh && \
|
||||
dos2unix /root/startup.sh && \
|
||||
dos2unix /opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh && \
|
||||
dos2unix /opt/dolphinscheduler/script/*.sh && \
|
||||
dos2unix /opt/dolphinscheduler/bin/*.sh && \
|
||||
rm -rf /bin/sh && \
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
## What is Dolphin Scheduler?
|
||||
## What is DolphinScheduler?
|
||||
|
||||
Dolphin Scheduler is a distributed and easy-to-expand visual DAG workflow scheduling system, dedicated to solving the complex dependencies in data processing, making the scheduling system out of the box for data processing.
|
||||
DolphinScheduler is a distributed and easy-to-expand visual DAG workflow scheduling system, dedicated to solving the complex dependencies in data processing, making the scheduling system out of the box for data processing.
|
||||
|
||||
Github URL: https://github.com/apache/incubator-dolphinscheduler
|
||||
GitHub URL: https://github.com/apache/incubator-dolphinscheduler
|
||||
|
||||
Official Website: https://dolphinscheduler.apache.org
|
||||
|
||||

|
||||

|
||||
|
||||
[](README.md)
|
||||
[](README_zh_CN.md)
|
||||
|
|
@ -23,7 +23,7 @@ The default **postgres** user `root`, postgres password `root` and database `dol
|
|||
|
||||
The default **zookeeper** is created in the `docker-compose.yml`.
|
||||
|
||||
Access the Web UI:http://192.168.xx.xx:12345/dolphinscheduler
|
||||
Access the Web UI: http://192.168.xx.xx:12345/dolphinscheduler
|
||||
|
||||
The default username is `admin` and the default password is `dolphinscheduler123`
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ $ docker run -d --name dolphinscheduler-master \
|
|||
apache/dolphinscheduler:latest master-server
|
||||
```
|
||||
|
||||
* Start a **worker server**, For example:
|
||||
* Start a **worker server** (including **logger server**), For example:
|
||||
|
||||
```
|
||||
$ docker run -d --name dolphinscheduler-worker \
|
||||
|
|
@ -118,7 +118,7 @@ Please read `./docker/build/hooks/build` `./docker/build/hooks/build.bat` script
|
|||
|
||||
## Environment Variables
|
||||
|
||||
The Dolphin Scheduler image uses several environment variables which are easy to miss. While none of the variables are required, they may significantly aid you in using the image.
|
||||
The DolphinScheduler Docker container is configured through environment variables, and the default value will be used if an environment variable is not set.
|
||||
|
||||
**`DATABASE_TYPE`**
|
||||
|
||||
|
|
@ -168,9 +168,41 @@ This environment variable sets the database for database. The default value is `
|
|||
|
||||
**Note**: You must be specify it when start a standalone dolphinscheduler server. Like `master-server`, `worker-server`, `api-server`, `alert-server`.
|
||||
|
||||
**`DOLPHINSCHEDULER_ENV_PATH`**
|
||||
**`HADOOP_HOME`**
|
||||
|
||||
This environment variable sets the runtime environment for task. The default value is `/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh`.
|
||||
This environment variable sets `HADOOP_HOME`. The default value is `/opt/soft/hadoop`.
|
||||
|
||||
**`HADOOP_CONF_DIR`**
|
||||
|
||||
This environment variable sets `HADOOP_CONF_DIR`. The default value is `/opt/soft/hadoop/etc/hadoop`.
|
||||
|
||||
**`SPARK_HOME1`**
|
||||
|
||||
This environment variable sets `SPARK_HOME1`. The default value is `/opt/soft/spark1`.
|
||||
|
||||
**`SPARK_HOME2`**
|
||||
|
||||
This environment variable sets `SPARK_HOME2`. The default value is `/opt/soft/spark2`.
|
||||
|
||||
**`PYTHON_HOME`**
|
||||
|
||||
This environment variable sets `PYTHON_HOME`. The default value is `/usr/bin/python`.
|
||||
|
||||
**`JAVA_HOME`**
|
||||
|
||||
This environment variable sets `JAVA_HOME`. The default value is `/usr/lib/jvm/java-1.8-openjdk`.
|
||||
|
||||
**`HIVE_HOME`**
|
||||
|
||||
This environment variable sets `HIVE_HOME`. The default value is `/opt/soft/hive`.
|
||||
|
||||
**`FLINK_HOME`**
|
||||
|
||||
This environment variable sets `FLINK_HOME`. The default value is `/opt/soft/flink`.
|
||||
|
||||
**`DATAX_HOME`**
|
||||
|
||||
This environment variable sets `DATAX_HOME`. The default value is `/opt/soft/datax/bin/datax.py`.
|
||||
|
||||
**`DOLPHINSCHEDULER_DATA_BASEDIR_PATH`**
|
||||
|
||||
|
|
@ -268,7 +300,7 @@ This environment variable sets port for `worker-server`. The default value is `1
|
|||
|
||||
**`WORKER_GROUPS`**
|
||||
|
||||
This environment variable sets group for `worker-server`. The default value is `default`.
|
||||
This environment variable sets groups for `worker-server`. The default value is `default`.
|
||||
|
||||
**`WORKER_WEIGHT`**
|
||||
|
||||
|
|
@ -308,3 +340,142 @@ EOF
|
|||
" > ${DOLPHINSCHEDULER_HOME}/conf/${line%.*}
|
||||
done
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
### How to stop dolphinscheduler by docker-compose?
|
||||
|
||||
Stop containers:
|
||||
|
||||
```
|
||||
docker-compose stop
|
||||
```
|
||||
|
||||
Stop containers and remove containers, networks and volumes:
|
||||
|
||||
```
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### How to deploy dolphinscheduler on Docker Swarm?
|
||||
|
||||
Assuming that the Docker Swarm cluster has been created (If there is no Docker Swarm cluster, please refer to [create-swarm](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/))
|
||||
|
||||
Start a stack named dolphinscheduler
|
||||
|
||||
```
|
||||
docker stack deploy -c docker-stack.yml dolphinscheduler
|
||||
```
|
||||
|
||||
Stop and remove the stack named dolphinscheduler
|
||||
|
||||
```
|
||||
docker stack rm dolphinscheduler
|
||||
```
|
||||
|
||||
### How to use MySQL as the DolphinScheduler's database instead of PostgreSQL?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver and client of MySQL.
|
||||
>
|
||||
> If you want to use MySQL, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the MySQL driver [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (require `>=5.1.47`)
|
||||
|
||||
2. Create a new `Dockerfile` to add MySQL driver and client:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
RUN apk add --update --no-cache mysql-client
|
||||
```
|
||||
|
||||
3. Build a new docker image including MySQL driver and client:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql .
|
||||
```
|
||||
|
||||
4. Modify all `image` fields to `apache/dolphinscheduler:mysql` in `docker-compose.yml`
|
||||
|
||||
> If you want to deploy dolphinscheduler on Docker Swarm, you need modify `docker-stack.yml`
|
||||
|
||||
5. Comment the `dolphinscheduler-postgresql` block in `docker-compose.yml`
|
||||
|
||||
6. Add `dolphinscheduler-mysql` service in `docker-compose.yml` (**Optional**, you can directly use a external MySQL database)
|
||||
|
||||
7. Modify all DATABASE environments in `docker-compose.yml`
|
||||
|
||||
```
|
||||
DATABASE_TYPE: mysql
|
||||
DATABASE_DRIVER: com.mysql.jdbc.Driver
|
||||
DATABASE_HOST: dolphinscheduler-mysql
|
||||
DATABASE_PORT: 3306
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: useUnicode=true&characterEncoding=UTF-8
|
||||
```
|
||||
|
||||
> If you have added `dolphinscheduler-mysql` service in `docker-compose.yml`, just set `DATABASE_HOST` to `dolphinscheduler-mysql`
|
||||
|
||||
8. Run a dolphinscheduler (See **How to use this docker image**)
|
||||
|
||||
### How to support MySQL datasource in `Datasource manage`?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver of MySQL.
|
||||
>
|
||||
> If you want to add MySQL datasource, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the MySQL driver [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (require `>=5.1.47`)
|
||||
|
||||
2. Create a new `Dockerfile` to add MySQL driver:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. Build a new docker image including MySQL driver:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql-driver .
|
||||
```
|
||||
|
||||
4. Modify all `image` fields to `apache/dolphinscheduler:mysql-driver` in `docker-compose.yml`
|
||||
|
||||
> If you want to deploy dolphinscheduler on Docker Swarm, you need modify `docker-stack.yml`
|
||||
|
||||
5. Run a dolphinscheduler (See **How to use this docker image**)
|
||||
|
||||
6. Add a MySQL datasource in `Datasource manage`
|
||||
|
||||
### How to support Oracle datasource in `Datasource manage`?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver of Oracle.
|
||||
>
|
||||
> If you want to add Oracle datasource, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the Oracle driver [ojdbc8.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/) (such as `ojdbc8-19.9.0.0.jar`)
|
||||
|
||||
2. Create a new `Dockerfile` to add Oracle driver:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY ojdbc8-19.9.0.0.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. Build a new docker image including Oracle driver:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:oracle-driver .
|
||||
```
|
||||
|
||||
4. Modify all `image` fields to `apache/dolphinscheduler:oracle-driver` in `docker-compose.yml`
|
||||
|
||||
> If you want to deploy dolphinscheduler on Docker Swarm, you need modify `docker-stack.yml`
|
||||
|
||||
5. Run a dolphinscheduler (See **How to use this docker image**)
|
||||
|
||||
6. Add a Oracle datasource in `Datasource manage`
|
||||
|
||||
For more information please refer to the [incubator-dolphinscheduler](https://github.com/apache/incubator-dolphinscheduler.git) documentation.
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
## Dolphin Scheduler是什么?
|
||||
## DolphinScheduler是什么?
|
||||
|
||||
一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中`开箱即用`。
|
||||
|
||||
Github URL: https://github.com/apache/incubator-dolphinscheduler
|
||||
GitHub URL: https://github.com/apache/incubator-dolphinscheduler
|
||||
|
||||
Official Website: https://dolphinscheduler.apache.org
|
||||
|
||||

|
||||

|
||||
|
||||
[](README.md)
|
||||
[](README_zh_CN.md)
|
||||
|
|
@ -14,6 +14,7 @@ Official Website: https://dolphinscheduler.apache.org
|
|||
## 如何使用docker镜像
|
||||
|
||||
#### 以 docker-compose 的方式启动dolphinscheduler(推荐)
|
||||
|
||||
```
|
||||
$ docker-compose -f ./docker/docker-swarm/docker-compose.yml up -d
|
||||
```
|
||||
|
|
@ -22,7 +23,9 @@ $ docker-compose -f ./docker/docker-swarm/docker-compose.yml up -d
|
|||
|
||||
同时,默认的`Zookeeper`也会在`docker-compose.yml`文件中被创建。
|
||||
|
||||
访问前端界面:http://192.168.xx.xx:12345/dolphinscheduler
|
||||
访问前端页面:http://192.168.xx.xx:12345/dolphinscheduler
|
||||
|
||||
默认的用户是`admin`,默认的密码是`dolphinscheduler123`
|
||||
|
||||
#### 或者通过环境变量 **`DATABASE_HOST`** **`DATABASE_PORT`** **`ZOOKEEPER_QUORUM`** 使用已存在的服务
|
||||
|
||||
|
|
@ -37,7 +40,7 @@ $ docker run -d --name dolphinscheduler \
|
|||
apache/dolphinscheduler:latest all
|
||||
```
|
||||
|
||||
访问前端界面:http://192.168.xx.xx:12345/dolphinscheduler
|
||||
访问前端页面:http://192.168.xx.xx:12345/dolphinscheduler
|
||||
|
||||
#### 或者运行dolphinscheduler中的部分服务
|
||||
|
||||
|
|
@ -59,7 +62,7 @@ $ docker run -d --name dolphinscheduler-master \
|
|||
apache/dolphinscheduler:latest master-server
|
||||
```
|
||||
|
||||
* 启动一个 **worker server**, 如下:
|
||||
* 启动一个 **worker server** (包括 **logger server**), 如下:
|
||||
|
||||
```
|
||||
$ docker run -d --name dolphinscheduler-worker \
|
||||
|
|
@ -115,7 +118,7 @@ C:\incubator-dolphinscheduler>.\docker\build\hooks\build.bat
|
|||
|
||||
## 环境变量
|
||||
|
||||
Dolphin Scheduler映像使用了几个容易遗漏的环境变量。虽然这些变量不是必须的,但是可以帮助你更容易配置镜像并根据你的需求定义相应的服务配置。
|
||||
DolphinScheduler Docker 容器通过环境变量进行配置,缺省时将会使用默认值
|
||||
|
||||
**`DATABASE_TYPE`**
|
||||
|
||||
|
|
@ -165,9 +168,41 @@ Dolphin Scheduler映像使用了几个容易遗漏的环境变量。虽然这些
|
|||
|
||||
**注意**: 当运行`dolphinscheduler`中`master-server`、`worker-server`、`api-server`、`alert-server`这些服务时,必须指定这个环境变量,以便于你更好的搭建分布式服务。
|
||||
|
||||
**`DOLPHINSCHEDULER_ENV_PATH`**
|
||||
**`HADOOP_HOME`**
|
||||
|
||||
任务执行时的环境变量配置文件, 默认值 `/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh`。
|
||||
配置`dolphinscheduler`的`HADOOP_HOME`,默认值 `/opt/soft/hadoop`。
|
||||
|
||||
**`HADOOP_CONF_DIR`**
|
||||
|
||||
配置`dolphinscheduler`的`HADOOP_CONF_DIR`,默认值 `/opt/soft/hadoop/etc/hadoop`。
|
||||
|
||||
**`SPARK_HOME1`**
|
||||
|
||||
配置`dolphinscheduler`的`SPARK_HOME1`,默认值 `/opt/soft/spark1`。
|
||||
|
||||
**`SPARK_HOME2`**
|
||||
|
||||
配置`dolphinscheduler`的`SPARK_HOME2`,默认值 `/opt/soft/spark2`。
|
||||
|
||||
**`PYTHON_HOME`**
|
||||
|
||||
配置`dolphinscheduler`的`PYTHON_HOME`,默认值 `/usr/bin/python`。
|
||||
|
||||
**`JAVA_HOME`**
|
||||
|
||||
配置`dolphinscheduler`的`JAVA_HOME`,默认值 `/usr/lib/jvm/java-1。8-openjdk`。
|
||||
|
||||
**`HIVE_HOME`**
|
||||
|
||||
配置`dolphinscheduler`的`HIVE_HOME`,默认值 `/opt/soft/hive`。
|
||||
|
||||
**`FLINK_HOME`**
|
||||
|
||||
配置`dolphinscheduler`的`FLINK_HOME`,默认值 `/opt/soft/flink`。
|
||||
|
||||
**`DATAX_HOME`**
|
||||
|
||||
配置`dolphinscheduler`的`DATAX_HOME`,默认值 `/opt/soft/datax/bin/datax。py`。
|
||||
|
||||
**`DOLPHINSCHEDULER_DATA_BASEDIR_PATH`**
|
||||
|
||||
|
|
@ -305,3 +340,142 @@ EOF
|
|||
" > ${DOLPHINSCHEDULER_HOME}/conf/${line%.*}
|
||||
done
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
### 如何通过 docker-compose 停止 dolphinscheduler?
|
||||
|
||||
停止所有容器:
|
||||
|
||||
```
|
||||
docker-compose stop
|
||||
```
|
||||
|
||||
停止所有容器并移除所有容器,网络和存储卷:
|
||||
|
||||
```
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### 如何在 Docker Swarm 上部署 dolphinscheduler?
|
||||
|
||||
假设 Docker Swarm 集群已经部署(如果还没有创建 Docker Swarm 集群,请参考 [create-swarm](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/))
|
||||
|
||||
启动名为 dolphinscheduler 的 stack
|
||||
|
||||
```
|
||||
docker stack deploy -c docker-stack.yml dolphinscheduler
|
||||
```
|
||||
|
||||
启动并移除名为 dolphinscheduler 的 stack
|
||||
|
||||
```
|
||||
docker stack rm dolphinscheduler
|
||||
```
|
||||
|
||||
### 如何用 MySQL 替代 PostgreSQL 作为 DolphinScheduler 的数据库?
|
||||
|
||||
> 由于商业许可证的原因,我们不能直接使用 MySQL 的驱动包和客户端.
|
||||
>
|
||||
> 如果你要使用 MySQL, 你可以基于官方镜像 `apache/dolphinscheduler` 进行构建.
|
||||
|
||||
1. 下载 MySQL 驱动包 [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (要求 `>=5.1.47`)
|
||||
|
||||
2. 创建一个新的 `Dockerfile`,用于添加 MySQL 的驱动包和客户端:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
RUN apk add --update --no-cache mysql-client
|
||||
```
|
||||
|
||||
3. 构建一个包含 MySQL 的驱动包和客户端的新镜像:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql .
|
||||
```
|
||||
|
||||
4. 修改 `docker-compose.yml` 文件中的所有 image 字段为 `apache/dolphinscheduler:mysql`
|
||||
|
||||
> 如果你想在 Docker Swarm 上部署 dolphinscheduler,你需要修改 `docker-stack.yml`
|
||||
|
||||
5. 注释 `docker-compose.yml` 文件中的 `dolphinscheduler-postgresql` 块
|
||||
|
||||
6. 在 `docker-compose.yml` 文件中添加 `dolphinscheduler-mysql` 服务(**可选**,你可以直接使用一个外部的 MySQL 数据库)
|
||||
|
||||
7. 修改 `docker-compose.yml` 文件中的所有 DATABASE 环境变量
|
||||
|
||||
```
|
||||
DATABASE_TYPE: mysql
|
||||
DATABASE_DRIVER: com.mysql.jdbc.Driver
|
||||
DATABASE_HOST: dolphinscheduler-mysql
|
||||
DATABASE_PORT: 3306
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: useUnicode=true&characterEncoding=UTF-8
|
||||
```
|
||||
|
||||
> 如果你已经添加了 `dolphinscheduler-mysql` 服务,设置 `DATABASE_HOST` 为 `dolphinscheduler-mysql` 即可
|
||||
|
||||
8. 运行 dolphinscheduler (详见**如何使用docker镜像**)
|
||||
|
||||
### 如何在数据源中心支持 MySQL 数据源?
|
||||
|
||||
> 由于商业许可证的原因,我们不能直接使用 MySQL 的驱动包.
|
||||
>
|
||||
> 如果你要添加 MySQL 数据源, 你可以基于官方镜像 `apache/dolphinscheduler` 进行构建.
|
||||
|
||||
1. 下载 MySQL 驱动包 [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (要求 `>=5.1.47`)
|
||||
|
||||
2. 创建一个新的 `Dockerfile`,用于添加 MySQL 驱动包:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. 构建一个包含 MySQL 驱动包的新镜像:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql-driver .
|
||||
```
|
||||
|
||||
4. 将 `docker-compose.yml` 文件中的所有 image 字段 修改为 `apache/dolphinscheduler:mysql-driver`
|
||||
|
||||
> 如果你想在 Docker Swarm 上部署 dolphinscheduler,你需要修改 `docker-stack.yml`
|
||||
|
||||
5. 运行 dolphinscheduler (详见**如何使用docker镜像**)
|
||||
|
||||
6. 在数据源中心添加一个 MySQL 数据源
|
||||
|
||||
### 如何在数据源中心支持 Oracle 数据源?
|
||||
|
||||
> 由于商业许可证的原因,我们不能直接使用 Oracle 的驱动包.
|
||||
>
|
||||
> 如果你要添加 Oracle 数据源, 你可以基于官方镜像 `apache/dolphinscheduler` 进行构建.
|
||||
|
||||
1. 下载 Oracle 驱动包 [ojdbc8.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/) (such as `ojdbc8-19.9.0.0.jar`)
|
||||
|
||||
2. 创建一个新的 `Dockerfile`,用于添加 Oracle 驱动包:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY ojdbc8-19.9.0.0.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. 构建一个包含 Oracle 驱动包的新镜像:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:oracle-driver .
|
||||
```
|
||||
|
||||
4. 将 `docker-compose.yml` 文件中的所有 image 字段 修改为 `apache/dolphinscheduler:oracle-driver`
|
||||
|
||||
> 如果你想在 Docker Swarm 上部署 dolphinscheduler,你需要修改 `docker-stack.yml`
|
||||
|
||||
5. 运行 dolphinscheduler (详见**如何使用docker镜像**)
|
||||
|
||||
6. 在数据源中心添加一个 Oracle 数据源
|
||||
|
||||
更多信息请查看 [incubator-dolphinscheduler](https://github.com/apache/incubator-dolphinscheduler.git) 文档.
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ yarn.application.status.address=http://ds1:8088/ws/v1/cluster/apps/%s
|
|||
yarn.job.history.status.address=http://ds1:19888/ws/v1/history/mapreduce/jobs/%s
|
||||
|
||||
# system env path, If you want to set your own path, you need to set this env file to an absolute path
|
||||
dolphinscheduler.env.path=${DOLPHINSCHEDULER_ENV_PATH}
|
||||
#dolphinscheduler.env.path=env/dolphinscheduler_env.sh
|
||||
development.state=false
|
||||
|
||||
# kerberos tgt expire time, unit is hours
|
||||
|
|
|
|||
|
|
@ -15,14 +15,14 @@
|
|||
# limitations under the License.
|
||||
#
|
||||
|
||||
export HADOOP_HOME=/opt/soft/hadoop
|
||||
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
|
||||
export SPARK_HOME1=/opt/soft/spark1
|
||||
export SPARK_HOME2=/opt/soft/spark2
|
||||
export PYTHON_HOME=/usr/bin/python
|
||||
export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
|
||||
export HIVE_HOME=/opt/soft/hive
|
||||
export FLINK_HOME=/opt/soft/flink
|
||||
export DATAX_HOME=/opt/soft/datax/bin/datax.py
|
||||
export HADOOP_HOME=$HADOOP_HOME
|
||||
export HADOOP_CONF_DIR=$HADOOP_CONF_DIR
|
||||
export SPARK_HOME1=$SPARK_HOME1
|
||||
export SPARK_HOME2=$SPARK_HOME2
|
||||
export PYTHON_HOME=$PYTHON_HOME
|
||||
export JAVA_HOME=$JAVA_HOME
|
||||
export HIVE_HOME=$HIVE_HOME
|
||||
export FLINK_HOME=$FLINK_HOME
|
||||
export DATAX_HOME=$DATAX_HOME
|
||||
|
||||
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$DATAX_HOME:$PATH
|
||||
|
|
@ -30,7 +30,7 @@ worker.reserved.memory=${WORKER_RESERVED_MEMORY}
|
|||
# worker listener port
|
||||
worker.listen.port=${WORKER_LISTEN_PORT}
|
||||
|
||||
# default worker group
|
||||
# default worker groups
|
||||
worker.groups=${WORKER_GROUPS}
|
||||
|
||||
# default worker weight
|
||||
|
|
|
|||
|
|
@ -37,7 +37,17 @@ export DATABASE_PARAMS=${DATABASE_PARAMS:-"characterEncoding=utf8"}
|
|||
#============================================================================
|
||||
# Common
|
||||
#============================================================================
|
||||
export DOLPHINSCHEDULER_ENV_PATH=${DOLPHINSCHEDULER_ENV_PATH:-"/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh"}
|
||||
# dolphinscheduler env
|
||||
export HADOOP_HOME=${HADOOP_HOME:-"/opt/soft/hadoop"}
|
||||
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/opt/soft/hadoop/etc/hadoop"}
|
||||
export SPARK_HOME1=${SPARK_HOME1:-"/opt/soft/spark1"}
|
||||
export SPARK_HOME2=${SPARK_HOME2:-"/opt/soft/spark2"}
|
||||
export PYTHON_HOME=${PYTHON_HOME:-"/usr/bin/python"}
|
||||
export JAVA_HOME=${JAVA_HOME:-"/usr/lib/jvm/java-1.8-openjdk"}
|
||||
export HIVE_HOME=${HIVE_HOME:-"/opt/soft/hive"}
|
||||
export FLINK_HOME=${FLINK_HOME:-"/opt/soft/flink"}
|
||||
export DATAX_HOME=${DATAX_HOME:-"/opt/soft/datax/bin/datax.py"}
|
||||
# common env
|
||||
export DOLPHINSCHEDULER_DATA_BASEDIR_PATH=${DOLPHINSCHEDULER_DATA_BASEDIR_PATH:-"/tmp/dolphinscheduler"}
|
||||
export DOLPHINSCHEDULER_OPTS=${DOLPHINSCHEDULER_OPTS:-""}
|
||||
export RESOURCE_STORAGE_TYPE=${RESOURCE_STORAGE_TYPE:-"HDFS"}
|
||||
|
|
@ -83,9 +93,10 @@ export ALERT_LISTEN_HOST=${ALERT_LISTEN_HOST:-"127.0.0.1"}
|
|||
export ALERT_PLUGIN_DIR=${ALERT_PLUGIN_DIR:-"lib/plugin/alert"}
|
||||
|
||||
echo "generate app config"
|
||||
ls ${DOLPHINSCHEDULER_HOME}/conf/ | grep ".tpl" | while read line; do
|
||||
find ${DOLPHINSCHEDULER_HOME}/conf/ -name "*.tpl" | while read file; do
|
||||
eval "cat << EOF
|
||||
$(cat ${DOLPHINSCHEDULER_HOME}/conf/${line})
|
||||
$(cat ${file})
|
||||
EOF
|
||||
" > ${DOLPHINSCHEDULER_HOME}/conf/${line%.*}
|
||||
" > ${file%.*}
|
||||
done
|
||||
find ${DOLPHINSCHEDULER_HOME}/conf/ -name "*.sh" -exec chmod +x {} \;
|
||||
|
|
|
|||
|
|
@ -58,11 +58,15 @@ services:
|
|||
- 12345:12345
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms512m -Xmx512m -Xmn256m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
RESOURCE_STORAGE_TYPE: HDFS
|
||||
RESOURCE_UPLOAD_PATH: /dolphinscheduler
|
||||
|
|
@ -92,11 +96,15 @@ services:
|
|||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
ALERT_PLUGIN_DIR: lib/plugin/alert
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms512m -Xmx512m -Xmn256m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
healthcheck:
|
||||
test: ["CMD", "/root/checkpoint.sh", "AlertServer"]
|
||||
interval: 30s
|
||||
|
|
@ -126,11 +134,16 @@ services:
|
|||
MASTER_TASK_COMMIT_INTERVAL: "1000"
|
||||
MASTER_MAX_CPULOAD_AVG: "100"
|
||||
MASTER_RESERVED_MEMORY: "0.1"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms1g -Xmx1g -Xmn512m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
healthcheck:
|
||||
test: ["CMD", "/root/checkpoint.sh", "MasterServer"]
|
||||
|
|
@ -162,13 +175,26 @@ services:
|
|||
WORKER_RESERVED_MEMORY: "0.1"
|
||||
WORKER_GROUPS: "default"
|
||||
WORKER_WEIGHT: "100"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
ALERT_LISTEN_HOST: dolphinscheduler-alert
|
||||
HADOOP_HOME: "/opt/soft/hadoop"
|
||||
HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop"
|
||||
SPARK_HOME1: "/opt/soft/spark1"
|
||||
SPARK_HOME2: "/opt/soft/spark2"
|
||||
PYTHON_HOME: "/usr/bin/python"
|
||||
JAVA_HOME: "/usr/lib/jvm/java-1.8-openjdk"
|
||||
HIVE_HOME: "/opt/soft/hive"
|
||||
FLINK_HOME: "/opt/soft/flink"
|
||||
DATAX_HOME: "/opt/soft/datax/bin/datax.py"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms1g -Xmx1g -Xmn512m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
RESOURCE_STORAGE_TYPE: HDFS
|
||||
RESOURCE_UPLOAD_PATH: /dolphinscheduler
|
||||
|
|
@ -183,7 +209,6 @@ services:
|
|||
- dolphinscheduler-postgresql
|
||||
- dolphinscheduler-zookeeper
|
||||
volumes:
|
||||
- ./dolphinscheduler_env.sh:/opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh
|
||||
- dolphinscheduler-worker-data:/tmp/dolphinscheduler
|
||||
- dolphinscheduler-logs:/opt/dolphinscheduler/logs
|
||||
- dolphinscheduler-resource-local:/dolphinscheduler
|
||||
|
|
|
|||
|
|
@ -58,11 +58,15 @@ services:
|
|||
- 12345:12345
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms512m -Xmx512m -Xmn256m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
RESOURCE_STORAGE_TYPE: HDFS
|
||||
RESOURCE_UPLOAD_PATH: /dolphinscheduler
|
||||
|
|
@ -89,11 +93,15 @@ services:
|
|||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
ALERT_PLUGIN_DIR: lib/plugin/alert
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms512m -Xmx512m -Xmn256m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
healthcheck:
|
||||
test: ["CMD", "/root/checkpoint.sh", "AlertServer"]
|
||||
interval: 30s
|
||||
|
|
@ -122,11 +130,16 @@ services:
|
|||
MASTER_TASK_COMMIT_INTERVAL: "1000"
|
||||
MASTER_MAX_CPULOAD_AVG: "100"
|
||||
MASTER_RESERVED_MEMORY: "0.1"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms1g -Xmx1g -Xmn512m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
healthcheck:
|
||||
test: ["CMD", "/root/checkpoint.sh", "MasterServer"]
|
||||
|
|
@ -156,13 +169,26 @@ services:
|
|||
WORKER_RESERVED_MEMORY: "0.1"
|
||||
WORKER_GROUPS: "default"
|
||||
WORKER_WEIGHT: "100"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
ALERT_LISTEN_HOST: dolphinscheduler-alert
|
||||
HADOOP_HOME: "/opt/soft/hadoop"
|
||||
HADOOP_CONF_DIR: "/opt/soft/hadoop/etc/hadoop"
|
||||
SPARK_HOME1: "/opt/soft/spark1"
|
||||
SPARK_HOME2: "/opt/soft/spark2"
|
||||
PYTHON_HOME: "/usr/bin/python"
|
||||
JAVA_HOME: "/usr/lib/jvm/java-1.8-openjdk"
|
||||
HIVE_HOME: "/opt/soft/hive"
|
||||
FLINK_HOME: "/opt/soft/flink"
|
||||
DATAX_HOME: "/opt/soft/datax/bin/datax.py"
|
||||
DOLPHINSCHEDULER_DATA_BASEDIR_PATH: /tmp/dolphinscheduler
|
||||
DOLPHINSCHEDULER_OPTS: "-Xms1g -Xmx1g -Xmn512m"
|
||||
DATABASE_TYPE: postgresql
|
||||
DATABASE_DRIVER: org.postgresql.Driver
|
||||
DATABASE_HOST: dolphinscheduler-postgresql
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_USERNAME: root
|
||||
DATABASE_PASSWORD: root
|
||||
DATABASE_DATABASE: dolphinscheduler
|
||||
DATABASE_PARAMS: characterEncoding=utf8
|
||||
ZOOKEEPER_QUORUM: dolphinscheduler-zookeeper:2181
|
||||
RESOURCE_STORAGE_TYPE: HDFS
|
||||
RESOURCE_UPLOAD_PATH: /dolphinscheduler
|
||||
|
|
@ -173,9 +199,6 @@ services:
|
|||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
configs:
|
||||
- source: dolphinscheduler-worker-task-env
|
||||
target: /opt/dolphinscheduler/conf/env/dolphinscheduler_env.sh
|
||||
volumes:
|
||||
- dolphinscheduler-worker-data:/tmp/dolphinscheduler
|
||||
- dolphinscheduler-logs:/opt/dolphinscheduler/logs
|
||||
|
|
@ -193,8 +216,4 @@ volumes:
|
|||
dolphinscheduler-postgresql:
|
||||
dolphinscheduler-zookeeper:
|
||||
dolphinscheduler-worker-data:
|
||||
dolphinscheduler-logs:
|
||||
|
||||
configs:
|
||||
dolphinscheduler-worker-task-env:
|
||||
file: ./dolphinscheduler_env.sh
|
||||
dolphinscheduler-logs:
|
||||
|
|
@ -1,28 +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.
|
||||
#
|
||||
|
||||
export HADOOP_HOME=/opt/soft/hadoop
|
||||
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
|
||||
export SPARK_HOME1=/opt/soft/spark1
|
||||
export SPARK_HOME2=/opt/soft/spark2
|
||||
export PYTHON_HOME=/usr/bin/python
|
||||
export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
|
||||
export HIVE_HOME=/opt/soft/hive
|
||||
export FLINK_HOME=/opt/soft/flink
|
||||
export DATAX_HOME=/opt/soft/datax/bin/datax.py
|
||||
|
||||
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$DATAX_HOME:$PATH
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
# Dolphin Scheduler
|
||||
# DolphinScheduler
|
||||
|
||||
[Dolphin Scheduler](https://dolphinscheduler.apache.org) is a distributed and easy-to-expand visual DAG workflow scheduling system, dedicated to solving the complex dependencies in data processing, making the scheduling system out of the box for data processing.
|
||||
[DolphinScheduler](https://dolphinscheduler.apache.org) is a distributed and easy-to-expand visual DAG workflow scheduling system, dedicated to solving the complex dependencies in data processing, making the scheduling system out of the box for data processing.
|
||||
|
||||
## Introduction
|
||||
This chart bootstraps a [Dolphin Scheduler](https://dolphinscheduler.apache.org) distributed deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||
This chart bootstraps a [DolphinScheduler](https://dolphinscheduler.apache.org) distributed deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Helm 3.1.0+
|
||||
- Kubernetes 1.12+
|
||||
- [Helm](https://helm.sh/) 3.1.0+
|
||||
- [Kubernetes](https://kubernetes.io/) 1.12+
|
||||
- PV provisioner support in the underlying infrastructure
|
||||
|
||||
## Installing the Chart
|
||||
|
|
@ -22,10 +22,38 @@ $ helm repo add bitnami https://charts.bitnami.com/bitnami
|
|||
$ helm dependency update .
|
||||
$ helm install dolphinscheduler .
|
||||
```
|
||||
These commands deploy Dolphin Scheduler on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
|
||||
|
||||
To install the chart with a namespace named `test`:
|
||||
|
||||
```bash
|
||||
$ helm install dolphinscheduler . -n test
|
||||
```
|
||||
|
||||
> **Tip**: If a namespace named `test` is used, the option `-n test` needs to be added to the `helm` and `kubectl` command
|
||||
|
||||
These commands deploy DolphinScheduler on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
|
||||
|
||||
> **Tip**: List all releases using `helm list`
|
||||
|
||||
## Access DolphinScheduler UI
|
||||
|
||||
If `ingress.enabled` in `values.yaml` is set to `true`, you just access `http://${ingress.host}/dolphinscheduler` in browser.
|
||||
|
||||
> **Tip**: If there is a problem with ingress access, please contact the Kubernetes administrator and refer to the [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/)
|
||||
|
||||
Otherwise, you need to execute port-forward command like:
|
||||
|
||||
```bash
|
||||
$ kubectl port-forward --address 0.0.0.0 svc/dolphinscheduler-api 12345:12345
|
||||
$ kubectl port-forward --address 0.0.0.0 -n test svc/dolphinscheduler-api 12345:12345 # with test namespace
|
||||
```
|
||||
|
||||
> **Tip**: If the error of `unable to do port forwarding: socat not found` appears, you need to install `socat` at first
|
||||
|
||||
And then access the web: http://192.168.xx.xx:12345/dolphinscheduler
|
||||
|
||||
The default username is `admin` and the default password is `dolphinscheduler123`
|
||||
|
||||
## Uninstalling the Chart
|
||||
|
||||
To uninstall/delete the `dolphinscheduler` deployment:
|
||||
|
|
@ -34,63 +62,78 @@ To uninstall/delete the `dolphinscheduler` deployment:
|
|||
$ helm uninstall dolphinscheduler
|
||||
```
|
||||
|
||||
The command removes all the Kubernetes components associated with the chart and deletes the release.
|
||||
The command removes all the Kubernetes components but PVC's associated with the chart and deletes the release.
|
||||
|
||||
To delete the PVC's associated with `dolphinscheduler`:
|
||||
|
||||
```bash
|
||||
$ kubectl delete pvc -l app.kubernetes.io/instance=dolphinscheduler
|
||||
```
|
||||
|
||||
> **Note**: Deleting the PVC's will delete all data as well. Please be cautious before doing it.
|
||||
|
||||
## Configuration
|
||||
|
||||
The following tables lists the configurable parameters of the Dolphins Scheduler chart and their default values.
|
||||
The Configuration file is `values.yaml`, and the following tables lists the configurable parameters of the DolphinScheduler chart and their default values.
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
|
||||
| `nameOverride` | String to partially override common.names.fullname | `nil` |
|
||||
| `fullnameOverride` | String to fully override common.names.fullname | `nil` |
|
||||
| `timezone` | World time and date for cities in all time zones | `Asia/Shanghai` |
|
||||
| `image.registry` | Docker image registry for the Dolphins Scheduler | `docker.io` |
|
||||
| `image.repository` | Docker image repository for the Dolphins Scheduler | `dolphinscheduler` |
|
||||
| `image.tag` | Docker image version for the Dolphins Scheduler | `1.2.1` |
|
||||
| `image.imagePullPolicy` | Image pull policy. One of Always, Never, IfNotPresent | `IfNotPresent` |
|
||||
| `image.pullSecres` | PullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images | `[]` |
|
||||
| | | |
|
||||
| `postgresql.enabled` | If not exists external PostgreSQL, by default, the Dolphins Scheduler will use a internal PostgreSQL | `true` |
|
||||
| `image.registry` | Docker image registry for the DolphinScheduler | `docker.io` |
|
||||
| `image.repository` | Docker image repository for the DolphinScheduler | `dolphinscheduler` |
|
||||
| `image.tag` | Docker image version for the DolphinScheduler | `latest` |
|
||||
| `image.pullPolicy` | Image pull policy. One of Always, Never, IfNotPresent | `IfNotPresent` |
|
||||
| `image.pullSecrets` | Image pull secrets. An optional list of references to secrets in the same namespace to use for pulling any of the images | `[]` |
|
||||
| | | |
|
||||
| `postgresql.enabled` | If not exists external PostgreSQL, by default, the DolphinScheduler will use a internal PostgreSQL | `true` |
|
||||
| `postgresql.postgresqlUsername` | The username for internal PostgreSQL | `root` |
|
||||
| `postgresql.postgresqlPassword` | The password for internal PostgreSQL | `root` |
|
||||
| `postgresql.postgresqlDatabase` | The database for internal PostgreSQL | `dolphinscheduler` |
|
||||
| `postgresql.persistence.enabled` | Set `postgresql.persistence.enabled` to `true` to mount a new volume for internal PostgreSQL | `false` |
|
||||
| `postgresql.persistence.size` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| `postgresql.persistence.storageClass` | PostgreSQL data Persistent Volume Storage Class. If set to "-", storageClassName: "", which disables dynamic provisioning | `-` |
|
||||
| `externalDatabase.type` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database type will use it. | `postgresql` |
|
||||
| `externalDatabase.driver` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database driver will use it. | `org.postgresql.Driver` |
|
||||
| `externalDatabase.host` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database host will use it. | `localhost` |
|
||||
| `externalDatabase.port` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database port will use it. | `5432` |
|
||||
| `externalDatabase.username` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database username will use it. | `root` |
|
||||
| `externalDatabase.password` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database password will use it. | `root` |
|
||||
| `externalDatabase.database` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database database will use it. | `dolphinscheduler` |
|
||||
| `externalDatabase.params` | If exists external PostgreSQL, and set `postgresql.enable` value to false. Dolphins Scheduler's database params will use it. | `characterEncoding=utf8` |
|
||||
| | | |
|
||||
| `zookeeper.enabled` | If not exists external Zookeeper, by default, the Dolphin Scheduler will use a internal Zookeeper | `true` |
|
||||
| `zookeeper.taskQueue` | Specify task queue for `master` and `worker` | `zookeeper` |
|
||||
| `externalDatabase.type` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database type will use it | `postgresql` |
|
||||
| `externalDatabase.driver` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database driver will use it | `org.postgresql.Driver` |
|
||||
| `externalDatabase.host` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database host will use it | `localhost` |
|
||||
| `externalDatabase.port` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database port will use it | `5432` |
|
||||
| `externalDatabase.username` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database username will use it | `root` |
|
||||
| `externalDatabase.password` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database password will use it | `root` |
|
||||
| `externalDatabase.database` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database database will use it | `dolphinscheduler` |
|
||||
| `externalDatabase.params` | If exists external PostgreSQL, and set `postgresql.enabled` value to false. DolphinScheduler's database params will use it | `characterEncoding=utf8` |
|
||||
| | | |
|
||||
| `zookeeper.enabled` | If not exists external Zookeeper, by default, the DolphinScheduler will use a internal Zookeeper | `true` |
|
||||
| `zookeeper.fourlwCommandsWhitelist` | A list of comma separated Four Letter Words commands to use | `srvr,ruok,wchs,cons` |
|
||||
| `zookeeper.service.port` | ZooKeeper port | `2181` |
|
||||
| `zookeeper.persistence.enabled` | Set `zookeeper.persistence.enabled` to `true` to mount a new volume for internal Zookeeper | `false` |
|
||||
| `zookeeper.persistence.size` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| `zookeeper.persistence.storageClass` | Zookeeper data Persistent Volume Storage Class. If set to "-", storageClassName: "", which disables dynamic provisioning | `-` |
|
||||
| `externalZookeeper.taskQueue` | If exists external Zookeeper, and set `zookeeper.enable` value to false. Specify task queue for `master` and `worker` | `zookeeper` |
|
||||
| `externalZookeeper.zookeeperQuorum` | If exists external Zookeeper, and set `zookeeper.enable` value to false. Specify Zookeeper quorum | `127.0.0.1:2181` |
|
||||
| `externalZookeeper.zookeeperRoot` | If exists external Zookeeper, and set `zookeeper.enable` value to false. Specify Zookeeper root path for `master` and `worker` | `dolphinscheduler` |
|
||||
| | | |
|
||||
| `common.configmap.DOLPHINSCHEDULER_ENV_PATH` | Extra env file path. | `/tmp/dolphinscheduler/env` |
|
||||
| `common.configmap.DOLPHINSCHEDULER_DATA_BASEDIR_PATH` | File uploaded path of DS. | `/tmp/dolphinscheduler/files` |
|
||||
| `common.configmap.RESOURCE_STORAGE_TYPE` | Resource Storate type, support type are: S3、HDFS、NONE. | `NONE` |
|
||||
| `common.configmap.RESOURCE_UPLOAD_PATH` | The base path of resource. | `/ds` |
|
||||
| `common.configmap.FS_DEFAULT_FS` | The default fs of resource, for s3 is the `s3a` prefix and bucket name. | `s3a://xxxx` |
|
||||
| `common.configmap.FS_S3A_ENDPOINT` | If the resource type is `S3`, you should fill this filed, it's the endpoint of s3. | `s3.xxx.amazonaws.com` |
|
||||
| `common.configmap.FS_S3A_ACCESS_KEY` | The access key for your s3 bucket. | `xxxxxxx` |
|
||||
| `common.configmap.FS_S3A_SECRET_KEY` | The secret key for your s3 bucket. | `xxxxxxx` |
|
||||
| `zookeeper.zookeeperRoot` | Specify dolphinscheduler root directory in Zookeeper | `/dolphinscheduler` |
|
||||
| `externalZookeeper.zookeeperQuorum` | If exists external Zookeeper, and set `zookeeper.enabled` value to false. Specify Zookeeper quorum | `127.0.0.1:2181` |
|
||||
| `externalZookeeper.zookeeperRoot` | If exists external Zookeeper, and set `zookeeper.enabled` value to false. Specify dolphinscheduler root directory in Zookeeper | `/dolphinscheduler` |
|
||||
| | | |
|
||||
| `common.configmap.DOLPHINSCHEDULER_ENV` | System env path, self configuration, please read `values.yaml` | `[]` |
|
||||
| `common.configmap.DOLPHINSCHEDULER_DATA_BASEDIR_PATH` | User data directory path, self configuration, please make sure the directory exists and have read write permissions | `/tmp/dolphinscheduler` |
|
||||
| `common.configmap.RESOURCE_STORAGE_TYPE` | Resource storage type: HDFS, S3, NONE | `HDFS` |
|
||||
| `common.configmap.RESOURCE_UPLOAD_PATH` | Resource store on HDFS/S3 path, please make sure the directory exists on hdfs and have read write permissions | `/dolphinscheduler` |
|
||||
| `common.configmap.FS_DEFAULT_FS` | Resource storage file system like `file:///`, `hdfs://mycluster:8020` or `s3a://dolphinscheduler` | `file:///` |
|
||||
| `common.configmap.FS_S3A_ENDPOINT` | S3 endpoint when `common.configmap.RESOURCE_STORAGE_TYPE` is set to `S3` | `s3.xxx.amazonaws.com` |
|
||||
| `common.configmap.FS_S3A_ACCESS_KEY` | S3 access key when `common.configmap.RESOURCE_STORAGE_TYPE` is set to `S3` | `xxxxxxx` |
|
||||
| `common.configmap.FS_S3A_SECRET_KEY` | S3 secret key when `common.configmap.RESOURCE_STORAGE_TYPE` is set to `S3` | `xxxxxxx` |
|
||||
| `common.fsFileResourcePersistence.enabled` | Set `common.fsFileResourcePersistence.enabled` to `true` to mount a new file resource volume for `api` and `worker` | `false` |
|
||||
| `common.fsFileResourcePersistence.accessModes` | `PersistentVolumeClaim` Access Modes, must be `ReadWriteMany` | `[ReadWriteMany]` |
|
||||
| `common.fsFileResourcePersistence.storageClassName` | Resource Persistent Volume Storage Class, must support the access mode: ReadWriteMany | `-` |
|
||||
| `common.fsFileResourcePersistence.storage` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| | | |
|
||||
| `master.podManagementPolicy` | PodManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down | `Parallel` |
|
||||
| | | |
|
||||
| `master.replicas` | Replicas is the desired number of replicas of the given Template | `3` |
|
||||
| `master.annotations` | The `annotations` for master server | `{}` |
|
||||
| `master.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `master.nodeSelector` | NodeSelector is a selector which must be true for the pod to fit on a node | `{}` |
|
||||
| `master.tolerations` | If specified, the pod's tolerations | `{}` |
|
||||
| `master.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `master.jvmOptions` | The JVM options for master server. | `""` |
|
||||
| `master.resources` | The `resource` limit and request config for master server. | `{}` |
|
||||
| `master.annotations` | The `annotations` for master server. | `{}` |
|
||||
| `master.resources` | The `resource` limit and request config for master server | `{}` |
|
||||
| `master.configmap.DOLPHINSCHEDULER_OPTS` | The java options for master server | `""` |
|
||||
| `master.configmap.MASTER_EXEC_THREADS` | Master execute thread num | `100` |
|
||||
| `master.configmap.MASTER_EXEC_TASK_NUM` | Master execute task number in parallel | `20` |
|
||||
| `master.configmap.MASTER_HEARTBEAT_INTERVAL` | Master heartbeat interval | `10` |
|
||||
|
|
@ -98,6 +141,7 @@ The following tables lists the configurable parameters of the Dolphins Scheduler
|
|||
| `master.configmap.MASTER_TASK_COMMIT_INTERVAL` | Master commit task interval | `1000` |
|
||||
| `master.configmap.MASTER_MAX_CPULOAD_AVG` | Only less than cpu avg load, master server can work. default value : the number of cpu cores * 2 | `100` |
|
||||
| `master.configmap.MASTER_RESERVED_MEMORY` | Only larger than reserved memory, master server can work. default value : physical memory * 1/10, unit is G | `0.1` |
|
||||
| `master.configmap.MASTER_LISTEN_PORT` | Master listen port | `5678` |
|
||||
| `master.livenessProbe.enabled` | Turn on and off liveness probe | `true` |
|
||||
| `master.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | `30` |
|
||||
| `master.livenessProbe.periodSeconds` | How often to perform the probe | `30` |
|
||||
|
|
@ -114,22 +158,22 @@ The following tables lists the configurable parameters of the Dolphins Scheduler
|
|||
| `master.persistentVolumeClaim.accessModes` | `PersistentVolumeClaim` Access Modes | `[ReadWriteOnce]` |
|
||||
| `master.persistentVolumeClaim.storageClassName` | `Master` logs data Persistent Volume Storage Class. If set to "-", storageClassName: "", which disables dynamic provisioning | `-` |
|
||||
| `master.persistentVolumeClaim.storage` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| | | |
|
||||
| | | |
|
||||
| `worker.podManagementPolicy` | PodManagementPolicy controls how pods are created during initial scale up, when replacing pods on nodes, or when scaling down | `Parallel` |
|
||||
| `worker.replicas` | Replicas is the desired number of replicas of the given Template | `3` |
|
||||
| `worker.annotations` | The `annotations` for worker server | `{}` |
|
||||
| `worker.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `worker.nodeSelector` | NodeSelector is a selector which must be true for the pod to fit on a node | `{}` |
|
||||
| `worker.tolerations` | If specified, the pod's tolerations | `{}` |
|
||||
| `worker.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `worker.jvmOptions` | The JVM options for worker server. | `""` |
|
||||
| `worker.resources` | The `resource` limit and request config for worker server. | `{}` |
|
||||
| `worker.annotations` | The `annotations` for worker server. | `{}` |
|
||||
| `worker.resources` | The `resource` limit and request config for worker server | `{}` |
|
||||
| `worker.configmap.DOLPHINSCHEDULER_OPTS` | The java options for worker server | `""` |
|
||||
| `worker.configmap.WORKER_EXEC_THREADS` | Worker execute thread num | `100` |
|
||||
| `worker.configmap.WORKER_HEARTBEAT_INTERVAL` | Worker heartbeat interval | `10` |
|
||||
| `worker.configmap.WORKER_FETCH_TASK_NUM` | Submit the number of tasks at a time | `3` |
|
||||
| `worker.configmap.WORKER_MAX_CPULOAD_AVG` | Only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2 | `100` |
|
||||
| `worker.configmap.WORKER_RESERVED_MEMORY` | Only larger than reserved memory, worker server can work. default value : physical memory * 1/10, unit is G | `0.1` |
|
||||
| `worker.configmap.DOLPHINSCHEDULER_DATA_BASEDIR_PATH` | User data directory path, self configuration, please make sure the directory exists and have read write permissions | `/tmp/dolphinscheduler` |
|
||||
| `worker.configmap.DOLPHINSCHEDULER_ENV` | System env path, self configuration, please read `values.yaml` | `[]` |
|
||||
| `worker.configmap.WORKER_LISTEN_PORT` | Worker listen port | `1234` |
|
||||
| `worker.configmap.WORKER_GROUPS` | Worker groups | `default` |
|
||||
| `worker.configmap.WORKER_WEIGHT` | Worker weight | `100` |
|
||||
| `worker.livenessProbe.enabled` | Turn on and off liveness probe | `true` |
|
||||
| `worker.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | `30` |
|
||||
| `worker.livenessProbe.periodSeconds` | How often to perform the probe | `30` |
|
||||
|
|
@ -151,32 +195,18 @@ The following tables lists the configurable parameters of the Dolphins Scheduler
|
|||
| `worker.persistentVolumeClaim.logsPersistentVolume.accessModes` | `PersistentVolumeClaim` Access Modes | `[ReadWriteOnce]` |
|
||||
| `worker.persistentVolumeClaim.logsPersistentVolume.storageClassName` | `Worker` logs data Persistent Volume Storage Class. If set to "-", storageClassName: "", which disables dynamic provisioning | `-` |
|
||||
| `worker.persistentVolumeClaim.logsPersistentVolume.storage` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| | | |
|
||||
| | | |
|
||||
| `alert.replicas` | Replicas is the desired number of replicas of the given Template | `1` |
|
||||
| `alert.strategy.type` | Type of deployment. Can be "Recreate" or "RollingUpdate" | `RollingUpdate` |
|
||||
| `alert.strategy.rollingUpdate.maxSurge` | The maximum number of pods that can be scheduled above the desired number of pods | `25%` |
|
||||
| `alert.strategy.rollingUpdate.maxUnavailable` | The maximum number of pods that can be unavailable during the update | `25%` |
|
||||
| `alert.replicas` | Replicas is the desired number of replicas of the given Template | `1` |
|
||||
| `alert.annotations` | The `annotations` for alert server | `{}` |
|
||||
| `alert.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `alert.nodeSelector` | NodeSelector is a selector which must be true for the pod to fit on a node | `{}` |
|
||||
| `alert.tolerations` | If specified, the pod's tolerations | `{}` |
|
||||
| `alert.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `alert.jvmOptions` | The JVM options for alert server. | `""` |
|
||||
| `alert.resources` | The `resource` limit and request config for alert server. | `{}` |
|
||||
| `alert.annotations` | The `annotations` for alert server. | `{}` |
|
||||
| `alert.configmap.ALERT_PLUGIN_DIR` | Alert plugin path. | `/opt/dolphinscheduler/alert/plugin` |
|
||||
| `alert.configmap.XLS_FILE_PATH` | XLS file path | `/tmp/xls` |
|
||||
| `alert.configmap.MAIL_SERVER_HOST` | Mail `SERVER HOST ` | `nil` |
|
||||
| `alert.configmap.MAIL_SERVER_PORT` | Mail `SERVER PORT` | `nil` |
|
||||
| `alert.configmap.MAIL_SENDER` | Mail `SENDER` | `nil` |
|
||||
| `alert.configmap.MAIL_USER` | Mail `USER` | `nil` |
|
||||
| `alert.configmap.MAIL_PASSWD` | Mail `PASSWORD` | `nil` |
|
||||
| `alert.configmap.MAIL_SMTP_STARTTLS_ENABLE` | Mail `SMTP STARTTLS` enable | `false` |
|
||||
| `alert.configmap.MAIL_SMTP_SSL_ENABLE` | Mail `SMTP SSL` enable | `false` |
|
||||
| `alert.configmap.MAIL_SMTP_SSL_TRUST` | Mail `SMTP SSL TRUST` | `nil` |
|
||||
| `alert.configmap.ENTERPRISE_WECHAT_ENABLE` | `Enterprise Wechat` enable | `false` |
|
||||
| `alert.configmap.ENTERPRISE_WECHAT_CORP_ID` | `Enterprise Wechat` corp id | `nil` |
|
||||
| `alert.configmap.ENTERPRISE_WECHAT_SECRET` | `Enterprise Wechat` secret | `nil` |
|
||||
| `alert.configmap.ENTERPRISE_WECHAT_AGENT_ID` | `Enterprise Wechat` agent id | `nil` |
|
||||
| `alert.configmap.ENTERPRISE_WECHAT_USERS` | `Enterprise Wechat` users | `nil` |
|
||||
| `alert.resources` | The `resource` limit and request config for alert server | `{}` |
|
||||
| `alert.configmap.DOLPHINSCHEDULER_OPTS` | The java options for alert server | `""` |
|
||||
| `alert.configmap.ALERT_PLUGIN_DIR` | Alert plugin directory | `lib/plugin/alert` |
|
||||
| `alert.livenessProbe.enabled` | Turn on and off liveness probe | `true` |
|
||||
| `alert.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | `30` |
|
||||
| `alert.livenessProbe.periodSeconds` | How often to perform the probe | `30` |
|
||||
|
|
@ -194,16 +224,16 @@ The following tables lists the configurable parameters of the Dolphins Scheduler
|
|||
| `alert.persistentVolumeClaim.storageClassName` | `Alert` logs data Persistent Volume Storage Class. If set to "-", storageClassName: "", which disables dynamic provisioning | `-` |
|
||||
| `alert.persistentVolumeClaim.storage` | `PersistentVolumeClaim` Size | `20Gi` |
|
||||
| | | |
|
||||
| `api.replicas` | Replicas is the desired number of replicas of the given Template | `1` |
|
||||
| `api.strategy.type` | Type of deployment. Can be "Recreate" or "RollingUpdate" | `RollingUpdate` |
|
||||
| `api.strategy.rollingUpdate.maxSurge` | The maximum number of pods that can be scheduled above the desired number of pods | `25%` |
|
||||
| `api.strategy.rollingUpdate.maxUnavailable` | The maximum number of pods that can be unavailable during the update | `25%` |
|
||||
| `api.replicas` | Replicas is the desired number of replicas of the given Template | `1` |
|
||||
| `api.annotations` | The `annotations` for api server | `{}` |
|
||||
| `api.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `api.nodeSelector` | NodeSelector is a selector which must be true for the pod to fit on a node | `{}` |
|
||||
| `api.tolerations` | If specified, the pod's tolerations | `{}` |
|
||||
| `api.affinity` | If specified, the pod's scheduling constraints | `{}` |
|
||||
| `api.jvmOptions` | The JVM options for api server. | `""` |
|
||||
| `api.resources` | The `resource` limit and request config for api server. | `{}` |
|
||||
| `api.annotations` | The `annotations` for api server. | `{}` |
|
||||
| `api.resources` | The `resource` limit and request config for api server | `{}` |
|
||||
| `api.configmap.DOLPHINSCHEDULER_OPTS` | The java options for api server | `""` |
|
||||
| `api.livenessProbe.enabled` | Turn on and off liveness probe | `true` |
|
||||
| `api.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | `30` |
|
||||
| `api.livenessProbe.periodSeconds` | How often to perform the probe | `30` |
|
||||
|
|
@ -228,4 +258,108 @@ The following tables lists the configurable parameters of the Dolphins Scheduler
|
|||
| `ingress.tls.hosts` | Ingress tls hosts | `dolphinscheduler.org` |
|
||||
| `ingress.tls.secretName` | Ingress tls secret name | `dolphinscheduler-tls` |
|
||||
|
||||
For more information please refer to the [chart](https://github.com/apache/incubator-dolphinscheduler.git) documentation.
|
||||
## FAQ
|
||||
|
||||
### How to use MySQL as the DolphinScheduler's database instead of PostgreSQL?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver and client of MySQL.
|
||||
>
|
||||
> If you want to use MySQL, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the MySQL driver [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (require `>=5.1.47`)
|
||||
|
||||
2. Create a new `Dockerfile` to add MySQL driver and client:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
RUN apk add --update --no-cache mysql-client
|
||||
```
|
||||
|
||||
3. Build a new docker image including MySQL driver and client:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql .
|
||||
```
|
||||
|
||||
4. Push the docker image `apache/dolphinscheduler:mysql` to a docker registry
|
||||
|
||||
5. Modify image `registry` and `repository`, and update `tag` to `mysql` in `values.yaml`
|
||||
|
||||
6. Modify postgresql `enabled` to `false`
|
||||
|
||||
7. Modify externalDatabase (especially modify `host`, `username` and `password`):
|
||||
|
||||
```
|
||||
externalDatabase:
|
||||
type: "mysql"
|
||||
driver: "com.mysql.jdbc.Driver"
|
||||
host: "localhost"
|
||||
port: "3306"
|
||||
username: "root"
|
||||
password: "root"
|
||||
database: "dolphinscheduler"
|
||||
params: "useUnicode=true&characterEncoding=UTF-8"
|
||||
```
|
||||
|
||||
8. Run a DolphinScheduler release in Kubernetes (See **Installing the Chart**)
|
||||
|
||||
### How to support MySQL datasource in `Datasource manage`?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver of MySQL.
|
||||
>
|
||||
> If you want to add MySQL datasource, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the MySQL driver [mysql-connector-java-5.1.49.jar](https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar) (require `>=5.1.47`)
|
||||
|
||||
2. Create a new `Dockerfile` to add MySQL driver:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY mysql-connector-java-5.1.49.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. Build a new docker image including MySQL driver:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:mysql-driver .
|
||||
```
|
||||
|
||||
4. Push the docker image `apache/dolphinscheduler:mysql-driver` to a docker registry
|
||||
|
||||
5. Modify image `registry` and `repository`, and update `tag` to `mysql-driver` in `values.yaml`
|
||||
|
||||
6. Run a DolphinScheduler release in Kubernetes (See **Installing the Chart**)
|
||||
|
||||
7. Add a MySQL datasource in `Datasource manage`
|
||||
|
||||
### How to support Oracle datasource in `Datasource manage`?
|
||||
|
||||
> Because of the commercial license, we cannot directly use the driver of Oracle.
|
||||
>
|
||||
> If you want to add Oracle datasource, you can build a new image based on the `apache/dolphinscheduler` image as follows.
|
||||
|
||||
1. Download the Oracle driver [ojdbc8.jar](https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/) (such as `ojdbc8-19.9.0.0.jar`)
|
||||
|
||||
2. Create a new `Dockerfile` to add Oracle driver:
|
||||
|
||||
```
|
||||
FROM apache/dolphinscheduler:latest
|
||||
COPY ojdbc8-19.9.0.0.jar /opt/dolphinscheduler/lib
|
||||
```
|
||||
|
||||
3. Build a new docker image including Oracle driver:
|
||||
|
||||
```
|
||||
docker build -t apache/dolphinscheduler:oracle-driver .
|
||||
```
|
||||
|
||||
4. Push the docker image `apache/dolphinscheduler:oracle-driver` to a docker registry
|
||||
|
||||
5. Modify image `registry` and `repository`, and update `tag` to `oracle-driver` in `values.yaml`
|
||||
|
||||
6. Run a DolphinScheduler release in Kubernetes (See **Installing the Chart**)
|
||||
|
||||
7. Add a Oracle datasource in `Datasource manage`
|
||||
|
||||
For more information please refer to the [incubator-dolphinscheduler](https://github.com/apache/incubator-dolphinscheduler.git) documentation.
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ public class BaseController {
|
|||
* @return check result code
|
||||
*/
|
||||
public Map<String, Object> checkPageParams(int pageNo, int pageSize) {
|
||||
Map<String, Object> result = new HashMap<>(2);
|
||||
Map<String, Object> result = new HashMap<>(4);
|
||||
Status resultEnum = Status.SUCCESS;
|
||||
String msg = Status.SUCCESS.getMsg();
|
||||
if (pageNo <= 0) {
|
||||
|
|
@ -202,7 +202,7 @@ public class BaseController {
|
|||
result.setCode(Status.SUCCESS.getCode());
|
||||
result.setMsg(Status.SUCCESS.getMsg());
|
||||
|
||||
Map<String, Object> map = new HashMap<>(4);
|
||||
Map<String, Object> map = new HashMap<>(8);
|
||||
map.put(Constants.TOTAL_LIST, totalList);
|
||||
map.put(Constants.CURRENT_PAGE, currentPage);
|
||||
map.put(Constants.TOTAL_PAGE, totalPage);
|
||||
|
|
|
|||
|
|
@ -105,8 +105,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
|
|||
}
|
||||
|
||||
if (projectMapper.insert(project) > 0) {
|
||||
Project insertedProject = projectMapper.queryByName(name);
|
||||
result.put(Constants.DATA_LIST, insertedProject);
|
||||
result.put(Constants.DATA_LIST, project);
|
||||
putMsg(result, Status.SUCCESS);
|
||||
} else {
|
||||
putMsg(result, Status.CREATE_PROJECT_ERROR);
|
||||
|
|
|
|||
|
|
@ -46,6 +46,11 @@ public class CollectionUtils {
|
|||
throw new UnsupportedOperationException("Construct CollectionUtils");
|
||||
}
|
||||
|
||||
/**
|
||||
* The load factor used when none specified in constructor.
|
||||
*/
|
||||
static final float DEFAULT_LOAD_FACTOR = 0.75f;
|
||||
|
||||
/**
|
||||
* Returns a new {@link Collection} containing <i>a</i> minus a subset of
|
||||
* <i>b</i>. Only the elements of <i>b</i> that satisfy the predicate
|
||||
|
|
@ -95,6 +100,7 @@ public class CollectionUtils {
|
|||
* @return string to map
|
||||
*/
|
||||
public static Map<String, String> stringToMap(String str, String separator, String keyPrefix) {
|
||||
|
||||
Map<String, String> emptyMap = new HashMap<>(0);
|
||||
if (StringUtils.isEmpty(str)) {
|
||||
return emptyMap;
|
||||
|
|
@ -103,7 +109,8 @@ public class CollectionUtils {
|
|||
return emptyMap;
|
||||
}
|
||||
String[] strings = str.split(separator);
|
||||
Map<String, String> map = new HashMap<>(strings.length);
|
||||
int initialCapacity = (int)(strings.length / DEFAULT_LOAD_FACTOR) + 1;
|
||||
Map<String, String> map = new HashMap<>(initialCapacity);
|
||||
for (int i = 0; i < strings.length; i++) {
|
||||
String[] strArray = strings[i].split("=");
|
||||
if (strArray.length != 2) {
|
||||
|
|
|
|||
|
|
@ -225,7 +225,7 @@ The text of each license is also included at licenses/LICENSE-[project].txt.
|
|||
avro 1.7.4: https://github.com/apache/avro, Apache 2.0
|
||||
aws-sdk-java 1.7.4: https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk/1.7.4, Apache 2.0
|
||||
bonecp 0.8.0.RELEASE: https://github.com/wwadge/bonecp, Apache 2.0
|
||||
byte-buddy 1.9.10: https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy/1.9.10, Apache 2.0
|
||||
byte-buddy 1.9.16: https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy/1.9.16, Apache 2.0
|
||||
classmate 1.4.0: https://mvnrepository.com/artifact/com.fasterxml/classmate/1.4.0, Apache 2.0
|
||||
clickhouse-jdbc 0.1.52: https://mvnrepository.com/artifact/ru.yandex.clickhouse/clickhouse-jdbc/0.1.52, Apache 2.0
|
||||
commons-beanutils 1.9.4 https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils/1.9.4, Apache 2.0
|
||||
|
|
@ -408,6 +408,10 @@ The text of each license is also included at licenses/LICENSE-[project].txt.
|
|||
xml-apis 1.4.01: https://mvnrepository.com/artifact/xml-apis/xml-apis/1.4.01, Apache 2.0 and W3C
|
||||
zookeeper 3.4.14: https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper/3.4.14, Apache 2.0
|
||||
presto-jdbc 0.238.1 https://mvnrepository.com/artifact/com.facebook.presto/presto-jdbc/0.238.1
|
||||
protostuff-core 1.7.2: https://github.com/protostuff/protostuff/protostuff-core Apache-2.0
|
||||
protostuff-runtime 1.7.2: https://github.com/protostuff/protostuff/protostuff-core Apache-2.0
|
||||
protostuff-api 1.7.2: https://github.com/protostuff/protostuff/protostuff-api Apache-2.0
|
||||
protostuff-collectionschema 1.7.2: https://github.com/protostuff/protostuff/protostuff-collectionschema Apache-2.0
|
||||
|
||||
========================================================================
|
||||
BSD licenses
|
||||
|
|
@ -491,7 +495,7 @@ The following components are provided under a MPL 1.1 license. See project link
|
|||
The text of each license is also included at licenses/LICENSE-[project].txt.
|
||||
|
||||
jamon-runtime 2.3.1: https://mvnrepository.com/artifact/org.jamon/jamon-runtime/2.3.1, MPL-1.1
|
||||
|
||||
javassist 3.26.0-GA: https://github.com/jboss-javassist/javassist, MPL-1.1
|
||||
|
||||
========================================================================
|
||||
Public Domain licenses
|
||||
|
|
@ -500,6 +504,11 @@ Public Domain licenses
|
|||
xz 1.0: https://mvnrepository.com/artifact/org.tukaani/xz/1.0, Public Domain
|
||||
aopalliance 1.0: https://mvnrepository.com/artifact/aopalliance/aopalliance/1.0, Public Domain
|
||||
|
||||
========================================
|
||||
WTFPL License
|
||||
========================================
|
||||
reflections 0.9.12: https://github.com/ronmamo/reflections WTFPL
|
||||
|
||||
|
||||
========================================================================
|
||||
UI related licenses
|
||||
|
|
|
|||
|
|
@ -561,6 +561,34 @@ The Apache Software Foundation (http://www.apache.org/).
|
|||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
==============================================================
|
||||
protostuff
|
||||
Copyright 2009 David Yu dyuproject@gmail.com
|
||||
==============================================================
|
||||
|
||||
protobuf is copyright Google inc unless otherwise noted.
|
||||
It is licensed under the BSD license.
|
||||
|
||||
jackson-core-asl is copyright FasterXml unless otherwise noted.
|
||||
It is licensed under the apache 2.0 license.
|
||||
|
||||
antlr is copyright Terence Parr unless otherwise noted.
|
||||
It is licensed under the BSD license.
|
||||
|
||||
stringtemplate is copyright Terence Parr unless otherwise noted.
|
||||
It is licensed under the BSD license.
|
||||
|
||||
velocity is licensed under the apache 2.0 license.
|
||||
|
||||
B64Code.java is copyright Mort Bay Consulting Pty Ltd unless otherwise noted.
|
||||
It is licensed under the apache 2.0 license.
|
||||
|
||||
jarjar is copyright Google inc unless otherwise noted.
|
||||
It is licensed under the apache 2.0 license.
|
||||
|
||||
guava is copyright Google inc unless otherwise noted.
|
||||
It is licensed under the apache 2.0 license.
|
||||
|
||||
This product includes parquet-tools, initially developed at ARRIS, Inc. with
|
||||
the following copyright notice:
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,469 @@
|
|||
MOZILLA PUBLIC LICENSE
|
||||
Version 1.1
|
||||
|
||||
---------------
|
||||
|
||||
1. Definitions.
|
||||
|
||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
||||
Covered Code available to a third party.
|
||||
|
||||
1.1. "Contributor" means each entity that creates or contributes to
|
||||
the creation of Modifications.
|
||||
|
||||
1.2. "Contributor Version" means the combination of the Original
|
||||
Code, prior Modifications used by a Contributor, and the Modifications
|
||||
made by that particular Contributor.
|
||||
|
||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
||||
combination of the Original Code and Modifications, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
||||
accepted in the software development community for the electronic
|
||||
transfer of data.
|
||||
|
||||
1.5. "Executable" means Covered Code in any form other than Source
|
||||
Code.
|
||||
|
||||
1.6. "Initial Developer" means the individual or entity identified
|
||||
as the Initial Developer in the Source Code notice required by Exhibit
|
||||
A.
|
||||
|
||||
1.7. "Larger Work" means a work which combines Covered Code or
|
||||
portions thereof with code not governed by the terms of this License.
|
||||
|
||||
1.8. "License" means this document.
|
||||
|
||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
||||
extent possible, whether at the time of the initial grant or
|
||||
subsequently acquired, any and all of the rights conveyed herein.
|
||||
|
||||
1.9. "Modifications" means any addition to or deletion from the
|
||||
substance or structure of either the Original Code or any previous
|
||||
Modifications. When Covered Code is released as a series of files, a
|
||||
Modification is:
|
||||
A. Any addition to or deletion from the contents of a file
|
||||
containing Original Code or previous Modifications.
|
||||
|
||||
B. Any new file that contains any part of the Original Code or
|
||||
previous Modifications.
|
||||
|
||||
1.10. "Original Code" means Source Code of computer software code
|
||||
which is described in the Source Code notice required by Exhibit A as
|
||||
Original Code, and which, at the time of its release under this
|
||||
License is not already Covered Code governed by this License.
|
||||
|
||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
||||
hereafter acquired, including without limitation, method, process,
|
||||
and apparatus claims, in any patent Licensable by grantor.
|
||||
|
||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
||||
making modifications to it, including all modules it contains, plus
|
||||
any associated interface definition files, scripts used to control
|
||||
compilation and installation of an Executable, or source code
|
||||
differential comparisons against either the Original Code or another
|
||||
well known, available Covered Code of the Contributor's choice. The
|
||||
Source Code can be in a compressed or archival form, provided the
|
||||
appropriate decompression or de-archiving software is widely available
|
||||
for no charge.
|
||||
|
||||
1.12. "You" (or "Your") means an individual or a legal entity
|
||||
exercising rights under, and complying with all of the terms of, this
|
||||
License or a future version of this License issued under Section 6.1.
|
||||
For legal entities, "You" includes any entity which controls, is
|
||||
controlled by, or is under common control with You. For purposes of
|
||||
this definition, "control" means (a) the power, direct or indirect,
|
||||
to cause the direction or management of such entity, whether by
|
||||
contract or otherwise, or (b) ownership of more than fifty percent
|
||||
(50%) of the outstanding shares or beneficial ownership of such
|
||||
entity.
|
||||
|
||||
2. Source Code License.
|
||||
|
||||
2.1. The Initial Developer Grant.
|
||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license, subject to third party intellectual property
|
||||
claims:
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Initial Developer to use, reproduce,
|
||||
modify, display, perform, sublicense and distribute the Original
|
||||
Code (or portions thereof) with or without Modifications, and/or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patents Claims infringed by the making, using or
|
||||
selling of Original Code, to make, have made, use, practice,
|
||||
sell, and offer for sale, and/or otherwise dispose of the
|
||||
Original Code (or portions thereof).
|
||||
|
||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
||||
effective on the date Initial Developer first distributes
|
||||
Original Code under the terms of this License.
|
||||
|
||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
||||
granted: 1) for code that You delete from the Original Code; 2)
|
||||
separate from the Original Code; or 3) for infringements caused
|
||||
by: i) the modification of the Original Code or ii) the
|
||||
combination of the Original Code with other software or devices.
|
||||
|
||||
2.2. Contributor Grant.
|
||||
Subject to third party intellectual property claims, each Contributor
|
||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
||||
|
||||
(a) under intellectual property rights (other than patent or
|
||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
||||
display, perform, sublicense and distribute the Modifications
|
||||
created by such Contributor (or portions thereof) either on an
|
||||
unmodified basis, with other Modifications, as Covered Code
|
||||
and/or as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims infringed by the making, using, or
|
||||
selling of Modifications made by that Contributor either alone
|
||||
and/or in combination with its Contributor Version (or portions
|
||||
of such combination), to make, use, sell, offer for sale, have
|
||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
||||
Contributor (or portions thereof); and 2) the combination of
|
||||
Modifications made by that Contributor with its Contributor
|
||||
Version (or portions of such combination).
|
||||
|
||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
||||
effective on the date Contributor first makes Commercial Use of
|
||||
the Covered Code.
|
||||
|
||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
||||
granted: 1) for any code that Contributor has deleted from the
|
||||
Contributor Version; 2) separate from the Contributor Version;
|
||||
3) for infringements caused by: i) third party modifications of
|
||||
Contributor Version or ii) the combination of Modifications made
|
||||
by that Contributor with other software (except as part of the
|
||||
Contributor Version) or other devices; or 4) under Patent Claims
|
||||
infringed by Covered Code in the absence of Modifications made by
|
||||
that Contributor.
|
||||
|
||||
3. Distribution Obligations.
|
||||
|
||||
3.1. Application of License.
|
||||
The Modifications which You create or to which You contribute are
|
||||
governed by the terms of this License, including without limitation
|
||||
Section 2.2. The Source Code version of Covered Code may be
|
||||
distributed only under the terms of this License or a future version
|
||||
of this License released under Section 6.1, and You must include a
|
||||
copy of this License with every copy of the Source Code You
|
||||
distribute. You may not offer or impose any terms on any Source Code
|
||||
version that alters or restricts the applicable version of this
|
||||
License or the recipients' rights hereunder. However, You may include
|
||||
an additional document offering the additional rights described in
|
||||
Section 3.5.
|
||||
|
||||
3.2. Availability of Source Code.
|
||||
Any Modification which You create or to which You contribute must be
|
||||
made available in Source Code form under the terms of this License
|
||||
either on the same media as an Executable version or via an accepted
|
||||
Electronic Distribution Mechanism to anyone to whom you made an
|
||||
Executable version available; and if made available via Electronic
|
||||
Distribution Mechanism, must remain available for at least twelve (12)
|
||||
months after the date it initially became available, or at least six
|
||||
(6) months after a subsequent version of that particular Modification
|
||||
has been made available to such recipients. You are responsible for
|
||||
ensuring that the Source Code version remains available even if the
|
||||
Electronic Distribution Mechanism is maintained by a third party.
|
||||
|
||||
3.3. Description of Modifications.
|
||||
You must cause all Covered Code to which You contribute to contain a
|
||||
file documenting the changes You made to create that Covered Code and
|
||||
the date of any change. You must include a prominent statement that
|
||||
the Modification is derived, directly or indirectly, from Original
|
||||
Code provided by the Initial Developer and including the name of the
|
||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
||||
Executable version or related documentation in which You describe the
|
||||
origin or ownership of the Covered Code.
|
||||
|
||||
3.4. Intellectual Property Matters
|
||||
(a) Third Party Claims.
|
||||
If Contributor has knowledge that a license under a third party's
|
||||
intellectual property rights is required to exercise the rights
|
||||
granted by such Contributor under Sections 2.1 or 2.2,
|
||||
Contributor must include a text file with the Source Code
|
||||
distribution titled "LEGAL" which describes the claim and the
|
||||
party making the claim in sufficient detail that a recipient will
|
||||
know whom to contact. If Contributor obtains such knowledge after
|
||||
the Modification is made available as described in Section 3.2,
|
||||
Contributor shall promptly modify the LEGAL file in all copies
|
||||
Contributor makes available thereafter and shall take other steps
|
||||
(such as notifying appropriate mailing lists or newsgroups)
|
||||
reasonably calculated to inform those who received the Covered
|
||||
Code that new knowledge has been obtained.
|
||||
|
||||
(b) Contributor APIs.
|
||||
If Contributor's Modifications include an application programming
|
||||
interface and Contributor has knowledge of patent licenses which
|
||||
are reasonably necessary to implement that API, Contributor must
|
||||
also include this information in the LEGAL file.
|
||||
|
||||
(c) Representations.
|
||||
Contributor represents that, except as disclosed pursuant to
|
||||
Section 3.4(a) above, Contributor believes that Contributor's
|
||||
Modifications are Contributor's original creation(s) and/or
|
||||
Contributor has sufficient rights to grant the rights conveyed by
|
||||
this License.
|
||||
|
||||
3.5. Required Notices.
|
||||
You must duplicate the notice in Exhibit A in each file of the Source
|
||||
Code. If it is not possible to put such notice in a particular Source
|
||||
Code file due to its structure, then You must include such notice in a
|
||||
location (such as a relevant directory) where a user would be likely
|
||||
to look for such a notice. If You created one or more Modification(s)
|
||||
You may add your name as a Contributor to the notice described in
|
||||
Exhibit A. You must also duplicate this License in any documentation
|
||||
for the Source Code where You describe recipients' rights or ownership
|
||||
rights relating to Covered Code. You may choose to offer, and to
|
||||
charge a fee for, warranty, support, indemnity or liability
|
||||
obligations to one or more recipients of Covered Code. However, You
|
||||
may do so only on Your own behalf, and not on behalf of the Initial
|
||||
Developer or any Contributor. You must make it absolutely clear than
|
||||
any such warranty, support, indemnity or liability obligation is
|
||||
offered by You alone, and You hereby agree to indemnify the Initial
|
||||
Developer and every Contributor for any liability incurred by the
|
||||
Initial Developer or such Contributor as a result of warranty,
|
||||
support, indemnity or liability terms You offer.
|
||||
|
||||
3.6. Distribution of Executable Versions.
|
||||
You may distribute Covered Code in Executable form only if the
|
||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
||||
and if You include a notice stating that the Source Code version of
|
||||
the Covered Code is available under the terms of this License,
|
||||
including a description of how and where You have fulfilled the
|
||||
obligations of Section 3.2. The notice must be conspicuously included
|
||||
in any notice in an Executable version, related documentation or
|
||||
collateral in which You describe recipients' rights relating to the
|
||||
Covered Code. You may distribute the Executable version of Covered
|
||||
Code or ownership rights under a license of Your choice, which may
|
||||
contain terms different from this License, provided that You are in
|
||||
compliance with the terms of this License and that the license for the
|
||||
Executable version does not attempt to limit or alter the recipient's
|
||||
rights in the Source Code version from the rights set forth in this
|
||||
License. If You distribute the Executable version under a different
|
||||
license You must make it absolutely clear that any terms which differ
|
||||
from this License are offered by You alone, not by the Initial
|
||||
Developer or any Contributor. You hereby agree to indemnify the
|
||||
Initial Developer and every Contributor for any liability incurred by
|
||||
the Initial Developer or such Contributor as a result of any such
|
||||
terms You offer.
|
||||
|
||||
3.7. Larger Works.
|
||||
You may create a Larger Work by combining Covered Code with other code
|
||||
not governed by the terms of this License and distribute the Larger
|
||||
Work as a single product. In such a case, You must make sure the
|
||||
requirements of this License are fulfilled for the Covered Code.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation.
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Code due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description
|
||||
must be included in the LEGAL file described in Section 3.4 and must
|
||||
be included with all distributions of the Source Code. Except to the
|
||||
extent prohibited by statute or regulation, such description must be
|
||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
||||
understand it.
|
||||
|
||||
5. Application of this License.
|
||||
|
||||
This License applies to code to which the Initial Developer has
|
||||
attached the notice in Exhibit A and to related Covered Code.
|
||||
|
||||
6. Versions of the License.
|
||||
|
||||
6.1. New Versions.
|
||||
Netscape Communications Corporation ("Netscape") may publish revised
|
||||
and/or new versions of the License from time to time. Each version
|
||||
will be given a distinguishing version number.
|
||||
|
||||
6.2. Effect of New Versions.
|
||||
Once Covered Code has been published under a particular version of the
|
||||
License, You may always continue to use it under the terms of that
|
||||
version. You may also choose to use such Covered Code under the terms
|
||||
of any subsequent version of the License published by Netscape. No one
|
||||
other than Netscape has the right to modify the terms applicable to
|
||||
Covered Code created under this License.
|
||||
|
||||
6.3. Derivative Works.
|
||||
If You create or use a modified version of this License (which you may
|
||||
only do in order to apply it to code which is not already Covered Code
|
||||
governed by this License), You must (a) rename Your license so that
|
||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
||||
license (except to note that your license differs from this License)
|
||||
and (b) otherwise make it clear that Your version of the license
|
||||
contains terms which differ from the Mozilla Public License and
|
||||
Netscape Public License. (Filling in the name of the Initial
|
||||
Developer, Original Code or Contributor in the notice described in
|
||||
Exhibit A shall not of themselves be deemed to be modifications of
|
||||
this License.)
|
||||
|
||||
7. DISCLAIMER OF WARRANTY.
|
||||
|
||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
||||
|
||||
8. TERMINATION.
|
||||
|
||||
8.1. This License and the rights granted hereunder will terminate
|
||||
automatically if You fail to comply with terms herein and fail to cure
|
||||
such breach within 30 days of becoming aware of the breach. All
|
||||
sublicenses to the Covered Code which are properly granted shall
|
||||
survive any termination of this License. Provisions which, by their
|
||||
nature, must remain in effect beyond the termination of this License
|
||||
shall survive.
|
||||
|
||||
8.2. If You initiate litigation by asserting a patent infringement
|
||||
claim (excluding declatory judgment actions) against Initial Developer
|
||||
or a Contributor (the Initial Developer or Contributor against whom
|
||||
You file such action is referred to as "Participant") alleging that:
|
||||
|
||||
(a) such Participant's Contributor Version directly or indirectly
|
||||
infringes any patent, then any and all rights granted by such
|
||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
||||
shall, upon 60 days notice from Participant terminate prospectively,
|
||||
unless if within 60 days after receipt of notice You either: (i)
|
||||
agree in writing to pay Participant a mutually agreeable reasonable
|
||||
royalty for Your past and future use of Modifications made by such
|
||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
||||
the Contributor Version against such Participant. If within 60 days
|
||||
of notice, a reasonable royalty and payment arrangement are not
|
||||
mutually agreed upon in writing by the parties or the litigation claim
|
||||
is not withdrawn, the rights granted by Participant to You under
|
||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
||||
the 60 day notice period specified above.
|
||||
|
||||
(b) any software, hardware, or device, other than such Participant's
|
||||
Contributor Version, directly or indirectly infringes any patent, then
|
||||
any rights granted to You by such Participant under Sections 2.1(b)
|
||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
||||
sold, distributed, or had made, Modifications made by that
|
||||
Participant.
|
||||
|
||||
8.3. If You assert a patent infringement claim against Participant
|
||||
alleging that such Participant's Contributor Version directly or
|
||||
indirectly infringes any patent where such claim is resolved (such as
|
||||
by license or settlement) prior to the initiation of patent
|
||||
infringement litigation, then the reasonable value of the licenses
|
||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
||||
into account in determining the amount or value of any payment or
|
||||
license.
|
||||
|
||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
||||
all end user license agreements (excluding distributors and resellers)
|
||||
which have been validly granted by You or any distributor hereunder
|
||||
prior to termination shall survive termination.
|
||||
|
||||
9. LIMITATION OF LIABILITY.
|
||||
|
||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
||||
|
||||
10. U.S. GOVERNMENT END USERS.
|
||||
|
||||
The Covered Code is a "commercial item," as that term is defined in
|
||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
||||
software" and "commercial computer software documentation," as such
|
||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
||||
all U.S. Government End Users acquire Covered Code with only those
|
||||
rights set forth herein.
|
||||
|
||||
11. MISCELLANEOUS.
|
||||
|
||||
This License represents the complete agreement concerning subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. This License shall be governed by
|
||||
California law provisions (except to the extent applicable law, if
|
||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
||||
With respect to disputes in which at least one party is a citizen of,
|
||||
or an entity chartered or registered to do business in the United
|
||||
States of America, any litigation relating to this License shall be
|
||||
subject to the jurisdiction of the Federal Courts of the Northern
|
||||
District of California, with venue lying in Santa Clara County,
|
||||
California, with the losing party responsible for costs, including
|
||||
without limitation, court costs and reasonable attorneys' fees and
|
||||
expenses. The application of the United Nations Convention on
|
||||
Contracts for the International Sale of Goods is expressly excluded.
|
||||
Any law or regulation which provides that the language of a contract
|
||||
shall be construed against the drafter shall not apply to this
|
||||
License.
|
||||
|
||||
12. RESPONSIBILITY FOR CLAIMS.
|
||||
|
||||
As between Initial Developer and the Contributors, each party is
|
||||
responsible for claims and damages arising, directly or indirectly,
|
||||
out of its utilization of rights under this License and You agree to
|
||||
work with Initial Developer and Contributors to distribute such
|
||||
responsibility on an equitable basis. Nothing herein is intended or
|
||||
shall be deemed to constitute any admission of liability.
|
||||
|
||||
13. MULTIPLE-LICENSED CODE.
|
||||
|
||||
Initial Developer may designate portions of the Covered Code as
|
||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
||||
Developer permits you to utilize portions of the Covered Code under
|
||||
Your choice of the MPL or the alternative licenses, if any, specified
|
||||
by the Initial Developer in the file described in Exhibit A.
|
||||
|
||||
EXHIBIT A -Mozilla Public License.
|
||||
|
||||
``The contents of this file are subject to the Mozilla Public License
|
||||
Version 1.1 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a copy of the License at
|
||||
https://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS"
|
||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing rights and limitations
|
||||
under the License.
|
||||
|
||||
The Original Code is ______________________________________.
|
||||
|
||||
The Initial Developer of the Original Code is ________________________.
|
||||
Portions created by ______________________ are Copyright (C) ______
|
||||
_______________________. All Rights Reserved.
|
||||
|
||||
Contributor(s): ______________________________________.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms
|
||||
of the _____ license (the "[___] License"), in which case the
|
||||
provisions of [______] License are applicable instead of those
|
||||
above. If you wish to allow use of your version of this file only
|
||||
under the terms of the [____] License and not to allow others to use
|
||||
your version of this file under the MPL, indicate your decision by
|
||||
deleting the provisions above and replace them with the notice and
|
||||
other provisions required by the [___] License. If you do not delete
|
||||
the provisions above, a recipient may use your version of this file
|
||||
under either the MPL or the [___] License."
|
||||
|
||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
||||
the notices in the Source Code files of the Original Code. You should
|
||||
use the text of this Exhibit A rather than the text found in the
|
||||
Original Code Source Code for Your Modifications.]
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed 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.
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed 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.
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed 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.
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed 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.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
|
@ -61,6 +61,10 @@
|
|||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.dolphinscheduler</groupId>
|
||||
<artifactId>dolphinscheduler-remote</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.microbench.common;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.base.Rpc;
|
||||
|
||||
/**
|
||||
* IUserService
|
||||
*/
|
||||
public interface IUserService {
|
||||
|
||||
@Rpc(async = true, serviceCallback = UserCallback.class, retries = 9999)
|
||||
Boolean say(String s);
|
||||
|
||||
Integer hi(int num);
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.microbench.common;
|
||||
|
||||
import org.apache.dolphinscheduler.microbench.base.AbstractBaseBenchmark;
|
||||
import org.apache.dolphinscheduler.remote.config.NettyServerConfig;
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
import org.apache.dolphinscheduler.rpc.client.IRpcClient;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcClient;
|
||||
import org.apache.dolphinscheduler.rpc.remote.NettyClient;
|
||||
import org.apache.dolphinscheduler.rpc.remote.NettyServer;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.openjdk.jmh.annotations.Benchmark;
|
||||
import org.openjdk.jmh.annotations.BenchmarkMode;
|
||||
import org.openjdk.jmh.annotations.Measurement;
|
||||
import org.openjdk.jmh.annotations.Mode;
|
||||
import org.openjdk.jmh.annotations.OutputTimeUnit;
|
||||
import org.openjdk.jmh.annotations.Scope;
|
||||
import org.openjdk.jmh.annotations.Setup;
|
||||
import org.openjdk.jmh.annotations.State;
|
||||
import org.openjdk.jmh.annotations.TearDown;
|
||||
import org.openjdk.jmh.annotations.Warmup;
|
||||
|
||||
@Warmup(iterations = 5, time = 1)
|
||||
@Measurement(iterations = 10, time = 1)
|
||||
@State(Scope.Benchmark)
|
||||
@BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
|
||||
public class RpcTest extends AbstractBaseBenchmark {
|
||||
private NettyServer nettyServer;
|
||||
|
||||
private IUserService userService;
|
||||
|
||||
private Host host;
|
||||
private IRpcClient rpcClient = new RpcClient();
|
||||
|
||||
@Setup
|
||||
public void before() throws Exception {
|
||||
nettyServer = new NettyServer(new NettyServerConfig());
|
||||
IRpcClient rpcClient = new RpcClient();
|
||||
host = new Host("127.0.0.1", 12346);
|
||||
userService = rpcClient.create(IUserService.class, host);
|
||||
|
||||
}
|
||||
|
||||
@Benchmark
|
||||
@BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
|
||||
@OutputTimeUnit(TimeUnit.MILLISECONDS)
|
||||
public void sendTest() throws Exception {
|
||||
|
||||
userService = rpcClient.create(IUserService.class, host);
|
||||
Integer result = userService.hi(1);
|
||||
}
|
||||
|
||||
@TearDown
|
||||
public void after() {
|
||||
NettyClient.getInstance().close();
|
||||
nettyServer.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.microbench.common;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.AbstractRpcCallBack;
|
||||
|
||||
/**
|
||||
* UserCallback
|
||||
*/
|
||||
public class UserCallback extends AbstractRpcCallBack {
|
||||
@Override
|
||||
public void run(Object object) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.microbench.common;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.base.RpcService;
|
||||
|
||||
/**
|
||||
* UserService
|
||||
*/
|
||||
@RpcService("IUserService")
|
||||
public class UserService implements IUserService {
|
||||
|
||||
@Override
|
||||
public Boolean say(String s) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer hi(int num) {
|
||||
return ++num;
|
||||
}
|
||||
}
|
||||
|
|
@ -47,11 +47,37 @@
|
|||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.bytebuddy</groupId>
|
||||
<artifactId>byte-buddy</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!--protostuff-->
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-runtime</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
|
|
|
|||
|
|
@ -17,26 +17,27 @@
|
|||
|
||||
package org.apache.dolphinscheduler.remote.codec;
|
||||
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.ReplayingDecoder;
|
||||
import org.apache.dolphinscheduler.remote.command.Command;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandContext;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandHeader;
|
||||
import org.apache.dolphinscheduler.remote.command.CommandType;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.ReplayingDecoder;
|
||||
|
||||
/**
|
||||
* netty decoder
|
||||
* netty decoder
|
||||
*/
|
||||
public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
||||
private static final Logger logger = LoggerFactory.getLogger(NettyDecoder.class);
|
||||
|
||||
public NettyDecoder(){
|
||||
public NettyDecoder() {
|
||||
super(State.MAGIC);
|
||||
}
|
||||
|
||||
|
|
@ -48,11 +49,10 @@ public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
|||
* @param ctx channel handler context
|
||||
* @param in byte buffer
|
||||
* @param out out content
|
||||
* @throws Exception
|
||||
*/
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
||||
switch (state()){
|
||||
switch (state()) {
|
||||
case MAGIC:
|
||||
checkMagic(in.readByte());
|
||||
checkpoint(State.VERSION);
|
||||
|
|
@ -102,13 +102,13 @@ public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
|||
}
|
||||
|
||||
/**
|
||||
* get command type
|
||||
* get command type
|
||||
*
|
||||
* @param type type
|
||||
* @return
|
||||
*/
|
||||
private CommandType commandType(byte type){
|
||||
for(CommandType ct : CommandType.values()){
|
||||
if(ct.ordinal() == type){
|
||||
private CommandType commandType(byte type) {
|
||||
for (CommandType ct : CommandType.values()) {
|
||||
if (ct.ordinal() == type) {
|
||||
return ct;
|
||||
}
|
||||
}
|
||||
|
|
@ -116,7 +116,8 @@ public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
|||
}
|
||||
|
||||
/**
|
||||
* check magic
|
||||
* check magic
|
||||
*
|
||||
* @param magic magic
|
||||
*/
|
||||
private void checkMagic(byte magic) {
|
||||
|
|
@ -126,8 +127,7 @@ public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
|||
}
|
||||
|
||||
/**
|
||||
* check version
|
||||
* @param version
|
||||
* check version
|
||||
*/
|
||||
private void checkVersion(byte version) {
|
||||
if (version != Command.VERSION) {
|
||||
|
|
@ -135,7 +135,7 @@ public class NettyDecoder extends ReplayingDecoder<NettyDecoder.State> {
|
|||
}
|
||||
}
|
||||
|
||||
enum State{
|
||||
enum State {
|
||||
MAGIC,
|
||||
VERSION,
|
||||
COMMAND,
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public class Constants {
|
|||
|
||||
public static final int NETTY_SERVER_HEART_BEAT_TIME = 1000 * 60 * 3 + 1000;
|
||||
|
||||
public static final int NETTY_CLIENT_HEART_BEAT_TIME = 1000 * 60;
|
||||
public static final int NETTY_CLIENT_HEART_BEAT_TIME = 1000 * 6;
|
||||
|
||||
/**
|
||||
* charset
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.base;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.AbstractRpcCallBack;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Rpc
|
||||
*/
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Rpc {
|
||||
|
||||
/**
|
||||
* number of retries
|
||||
*/
|
||||
int retries() default 3;
|
||||
|
||||
boolean async() default false;
|
||||
|
||||
boolean ack() default false;
|
||||
|
||||
boolean callBack() default false;
|
||||
|
||||
//todo It is better to set the timeout period for synchronous calls
|
||||
|
||||
/**
|
||||
* When it is asynchronous transmission, callback must be set
|
||||
*/
|
||||
Class<? extends AbstractRpcCallBack> serviceCallback() default AbstractRpcCallBack.class;
|
||||
|
||||
Class<? extends AbstractRpcCallBack> ackCallback() default AbstractRpcCallBack.class;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.base;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target({ElementType.TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface RpcService {
|
||||
String value() default "";
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.AbstractRpcCallBack;
|
||||
import org.apache.dolphinscheduler.rpc.common.ConsumerConfigConstants;
|
||||
|
||||
/**
|
||||
* We will cache the consumer configuration, when the rpc call is generated, the consumer configuration will be first obtained from here
|
||||
*/
|
||||
public class ConsumerConfig {
|
||||
|
||||
private Class<? extends AbstractRpcCallBack> serviceCallBackClass;
|
||||
|
||||
private Class<? extends AbstractRpcCallBack> ackCallBackClass;
|
||||
|
||||
private String serviceName;
|
||||
|
||||
private Boolean async = ConsumerConfigConstants.DEFAULT_SYNC;
|
||||
|
||||
private Boolean callBack = ConsumerConfigConstants.DEFAULT_CALL_BACK;
|
||||
|
||||
private Integer retries = ConsumerConfigConstants.DEFAULT_RETRIES;
|
||||
|
||||
public Class<? extends AbstractRpcCallBack> getServiceCallBackClass() {
|
||||
return serviceCallBackClass;
|
||||
}
|
||||
|
||||
void setServiceCallBackClass(Class<? extends AbstractRpcCallBack> serviceCallBackClass) {
|
||||
this.serviceCallBackClass = serviceCallBackClass;
|
||||
}
|
||||
|
||||
public Class<? extends AbstractRpcCallBack> getAckCallBackClass() {
|
||||
return ackCallBackClass;
|
||||
}
|
||||
|
||||
void setAckCallBackClass(Class<? extends AbstractRpcCallBack> ackCallBackClass) {
|
||||
this.ackCallBackClass = ackCallBackClass;
|
||||
}
|
||||
|
||||
public String getServiceName() {
|
||||
return serviceName;
|
||||
}
|
||||
|
||||
public void setServiceName(String serviceName) {
|
||||
this.serviceName = serviceName;
|
||||
}
|
||||
|
||||
public Boolean getAsync() {
|
||||
return async;
|
||||
}
|
||||
|
||||
void setAsync(Boolean async) {
|
||||
this.async = async;
|
||||
}
|
||||
|
||||
Integer getRetries() {
|
||||
return retries;
|
||||
}
|
||||
|
||||
void setRetries(Integer retries) {
|
||||
this.retries = retries;
|
||||
}
|
||||
|
||||
public Boolean getCallBack() {
|
||||
return callBack;
|
||||
}
|
||||
|
||||
public void setCallBack(Boolean callBack) {
|
||||
this.callBack = callBack;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* ConsumerConfigCache
|
||||
*/
|
||||
public class ConsumerConfigCache {
|
||||
|
||||
private ConsumerConfigCache() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
private static ConcurrentHashMap<String, ConsumerConfig> consumerMap = new ConcurrentHashMap<>();
|
||||
|
||||
public static ConsumerConfig getConfigByServersName(String serviceName) {
|
||||
return consumerMap.get(serviceName);
|
||||
}
|
||||
|
||||
static void putConfig(String serviceName, ConsumerConfig consumerConfig) {
|
||||
consumerMap.putIfAbsent(serviceName, consumerConfig);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.exceptions.RemotingException;
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
import org.apache.dolphinscheduler.rpc.base.Rpc;
|
||||
import org.apache.dolphinscheduler.rpc.common.AbstractRpcCallBack;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcRequest;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcResponse;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.EventType;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.MessageHeader;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
import org.apache.dolphinscheduler.rpc.remote.NettyClient;
|
||||
import org.apache.dolphinscheduler.rpc.serializer.RpcSerializer;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import net.bytebuddy.implementation.bind.annotation.AllArguments;
|
||||
import net.bytebuddy.implementation.bind.annotation.Origin;
|
||||
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
|
||||
|
||||
/**
|
||||
* ConsumerInterceptor
|
||||
*/
|
||||
public class ConsumerInterceptor {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ConsumerInterceptor.class);
|
||||
private Host host;
|
||||
|
||||
private NettyClient nettyClient = NettyClient.getInstance();
|
||||
|
||||
ConsumerInterceptor(Host host) {
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
@RuntimeType
|
||||
public Object intercept(@AllArguments Object[] args, @Origin Method method) throws RemotingException {
|
||||
RpcRequest request = buildReq(args, method);
|
||||
|
||||
String serviceName = method.getDeclaringClass().getSimpleName() + method.getName();
|
||||
ConsumerConfig consumerConfig = ConsumerConfigCache.getConfigByServersName(serviceName);
|
||||
if (null == consumerConfig) {
|
||||
consumerConfig = cacheServiceConfig(method, serviceName);
|
||||
}
|
||||
boolean async = consumerConfig.getAsync();
|
||||
|
||||
int retries = consumerConfig.getRetries();
|
||||
|
||||
RpcProtocol<RpcRequest> protocol = buildProtocol(request);
|
||||
|
||||
while (retries-- > 0) {
|
||||
RpcResponse rsp;
|
||||
rsp = nettyClient.sendMsg(host, protocol, async);
|
||||
//success
|
||||
if (null != rsp && rsp.getStatus() == 0) {
|
||||
return rsp.getResult();
|
||||
}
|
||||
}
|
||||
// execute fail
|
||||
throw new RemotingException("send msg error");
|
||||
|
||||
}
|
||||
|
||||
private RpcRequest buildReq(Object[] args, Method method) {
|
||||
RpcRequest request = new RpcRequest();
|
||||
request.setClassName(method.getDeclaringClass().getSimpleName());
|
||||
request.setMethodName(method.getName());
|
||||
request.setParameterTypes(method.getParameterTypes());
|
||||
request.setParameters(args);
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
private ConsumerConfig cacheServiceConfig(Method method, String serviceName) {
|
||||
ConsumerConfig consumerConfig = new ConsumerConfig();
|
||||
consumerConfig.setServiceName(serviceName);
|
||||
boolean annotationPresent = method.isAnnotationPresent(Rpc.class);
|
||||
if (annotationPresent) {
|
||||
Rpc rpc = method.getAnnotation(Rpc.class);
|
||||
consumerConfig.setAsync(rpc.async());
|
||||
consumerConfig.setServiceCallBackClass(rpc.serviceCallback());
|
||||
if (!rpc.serviceCallback().isInstance(AbstractRpcCallBack.class)) {
|
||||
consumerConfig.setCallBack(true);
|
||||
}
|
||||
consumerConfig.setAckCallBackClass(rpc.ackCallback());
|
||||
consumerConfig.setRetries(rpc.retries());
|
||||
}
|
||||
|
||||
ConsumerConfigCache.putConfig(serviceName, consumerConfig);
|
||||
|
||||
return consumerConfig;
|
||||
}
|
||||
|
||||
private RpcProtocol<RpcRequest> buildProtocol(RpcRequest req) {
|
||||
RpcProtocol<RpcRequest> protocol = new RpcProtocol<>();
|
||||
MessageHeader header = new MessageHeader();
|
||||
header.setRequestId(RpcRequestTable.getRequestId());
|
||||
header.setEventType(EventType.REQUEST.getType());
|
||||
header.setSerialization(RpcSerializer.PROTOSTUFF.getType());
|
||||
protocol.setMsgHeader(header);
|
||||
protocol.setBody(req);
|
||||
return protocol;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
|
||||
/**
|
||||
* IRpcClient
|
||||
*/
|
||||
public interface IRpcClient {
|
||||
|
||||
<T> T create(Class<T> clazz, Host host) throws Exception;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
|
||||
import net.bytebuddy.ByteBuddy;
|
||||
import net.bytebuddy.implementation.MethodDelegation;
|
||||
|
||||
/**
|
||||
* RpcClient
|
||||
*/
|
||||
public class RpcClient implements IRpcClient {
|
||||
|
||||
@Override
|
||||
public <T> T create(Class<T> clazz, Host host) throws Exception {
|
||||
return new ByteBuddy()
|
||||
.subclass(clazz)
|
||||
.method(isDeclaredBy(clazz)).intercept(MethodDelegation.to(new ConsumerInterceptor(host)))
|
||||
.make()
|
||||
.load(getClass().getClassLoader())
|
||||
.getLoaded()
|
||||
.getDeclaredConstructor().newInstance();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.future.RpcFuture;
|
||||
|
||||
/**
|
||||
* Rpc Request Cache
|
||||
*/
|
||||
public class RpcRequestCache {
|
||||
|
||||
private RpcFuture rpcFuture;
|
||||
|
||||
private String serviceName;
|
||||
|
||||
public RpcFuture getRpcFuture() {
|
||||
return rpcFuture;
|
||||
}
|
||||
|
||||
public void setRpcFuture(RpcFuture rpcFuture) {
|
||||
this.rpcFuture = rpcFuture;
|
||||
}
|
||||
|
||||
public String getServiceName() {
|
||||
return serviceName;
|
||||
}
|
||||
|
||||
public void setServiceName(String serviceName) {
|
||||
this.serviceName = serviceName;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.client;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
/**
|
||||
* RpcRequestTable
|
||||
*/
|
||||
public class RpcRequestTable {
|
||||
|
||||
private RpcRequestTable() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
private static AtomicLong requestIdGen = new AtomicLong(0);
|
||||
|
||||
private static ConcurrentHashMap<Long, RpcRequestCache> requestMap = new ConcurrentHashMap<>();
|
||||
|
||||
public static void put(long requestId, RpcRequestCache rpcRequestCache) {
|
||||
requestMap.put(requestId, rpcRequestCache);
|
||||
}
|
||||
|
||||
public static RpcRequestCache get(Long requestId) {
|
||||
return requestMap.get(requestId);
|
||||
}
|
||||
|
||||
public static void remove(Long requestId) {
|
||||
requestMap.remove(requestId);
|
||||
}
|
||||
|
||||
public static long getRequestId() {
|
||||
return requestIdGen.incrementAndGet();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.codec;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.protocol.EventType;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.MessageHeader;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocolConstants;
|
||||
import org.apache.dolphinscheduler.rpc.serializer.RpcSerializer;
|
||||
import org.apache.dolphinscheduler.rpc.serializer.Serializer;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.ByteToMessageDecoder;
|
||||
|
||||
/**
|
||||
* NettyDecoder
|
||||
*/
|
||||
public class NettyDecoder extends ByteToMessageDecoder {
|
||||
|
||||
private Class<?> genericClass;
|
||||
|
||||
public NettyDecoder(Class<?> genericClass) {
|
||||
this.genericClass = genericClass;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
|
||||
if (byteBuf.readableBytes() < RpcProtocolConstants.HEADER_LENGTH) {
|
||||
return;
|
||||
}
|
||||
|
||||
byteBuf.markReaderIndex();
|
||||
|
||||
short magic = byteBuf.readShort();
|
||||
|
||||
if (RpcProtocolConstants.MAGIC != magic) {
|
||||
throw new IllegalArgumentException("magic number is illegal, " + magic);
|
||||
}
|
||||
byte eventType = byteBuf.readByte();
|
||||
byte version = byteBuf.readByte();
|
||||
byte serialization = byteBuf.readByte();
|
||||
long requestId = byteBuf.readLong();
|
||||
int dataLength = byteBuf.readInt();
|
||||
byte[] data = new byte[dataLength];
|
||||
|
||||
RpcProtocol rpcProtocol = new RpcProtocol();
|
||||
|
||||
MessageHeader header = new MessageHeader();
|
||||
header.setVersion(version);
|
||||
header.setSerialization(serialization);
|
||||
header.setRequestId(requestId);
|
||||
header.setEventType(eventType);
|
||||
header.setMsgLength(dataLength);
|
||||
byteBuf.readBytes(data);
|
||||
rpcProtocol.setMsgHeader(header);
|
||||
if (eventType != EventType.HEARTBEAT.getType()) {
|
||||
Serializer serializer = RpcSerializer.getSerializerByType(serialization);
|
||||
Object obj = serializer.deserialize(data, genericClass);
|
||||
rpcProtocol.setBody(obj);
|
||||
}
|
||||
list.add(rpcProtocol);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.codec;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.protocol.MessageHeader;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
import org.apache.dolphinscheduler.rpc.serializer.RpcSerializer;
|
||||
import org.apache.dolphinscheduler.rpc.serializer.Serializer;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToByteEncoder;
|
||||
|
||||
/**
|
||||
* NettyEncoder
|
||||
*/
|
||||
public class NettyEncoder extends MessageToByteEncoder<RpcProtocol<Object>> {
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext channelHandlerContext, RpcProtocol<Object> msg, ByteBuf byteBuf) throws Exception {
|
||||
MessageHeader msgHeader = msg.getMsgHeader();
|
||||
byteBuf.writeShort(msgHeader.getMagic());
|
||||
byteBuf.writeByte(msgHeader.getEventType());
|
||||
byteBuf.writeByte(msgHeader.getVersion());
|
||||
byteBuf.writeByte(msgHeader.getSerialization());
|
||||
byteBuf.writeLong(msgHeader.getRequestId());
|
||||
byte[] data = new byte[0];
|
||||
int msgLength = msgHeader.getMsgLength();
|
||||
Serializer rpcSerializer = RpcSerializer.getSerializerByType(msgHeader.getSerialization());
|
||||
if (null != rpcSerializer) {
|
||||
data = rpcSerializer.serialize(msg.getBody());
|
||||
msgLength = data.length;
|
||||
}
|
||||
byteBuf.writeInt(msgLength);
|
||||
byteBuf.writeBytes(data);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
/**
|
||||
* AbstractRpcCallBack
|
||||
*/
|
||||
public abstract class AbstractRpcCallBack {
|
||||
|
||||
/**
|
||||
* When sending an asynchronous message, this method will be called after the response is successfully sent.
|
||||
*
|
||||
* @param object response
|
||||
*/
|
||||
public abstract void run(Object object);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
/**
|
||||
* ConsumerConfigConstants
|
||||
*/
|
||||
public class ConsumerConfigConstants {
|
||||
|
||||
private ConsumerConfigConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
public static final Boolean DEFAULT_SYNC = false;
|
||||
|
||||
public static final Integer DEFAULT_RETRIES = 3;
|
||||
|
||||
public static final Boolean DEFAULT_CALL_BACK = false;
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
public enum RequestEventType {
|
||||
|
||||
HEARTBEAT((byte)1,"heartbeat"),
|
||||
BUSINESS((byte)2,"business request");
|
||||
|
||||
|
||||
private Byte type;
|
||||
|
||||
private String description;
|
||||
|
||||
RequestEventType(Byte type, String description) {
|
||||
this.type = type;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Byte getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
package org.apache.dolphinscheduler.rpc.common;/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
public enum ResponseEventType {
|
||||
|
||||
ACK((byte) 1, "ack"),
|
||||
BUSINESS_RSP((byte) 2, "business response");
|
||||
|
||||
private Byte type;
|
||||
|
||||
private String description;
|
||||
|
||||
ResponseEventType(Byte type, String description) {
|
||||
this.type = type;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Byte getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
/**
|
||||
* RpcRequest
|
||||
*/
|
||||
public class RpcRequest {
|
||||
|
||||
private String className;
|
||||
private String methodName;
|
||||
private Class<?>[] parameterTypes;
|
||||
private Object[] parameters;
|
||||
|
||||
/**
|
||||
* @see RequestEventType
|
||||
*/
|
||||
private Byte eventType = RequestEventType.BUSINESS.getType();
|
||||
|
||||
private Boolean ack;
|
||||
|
||||
public Byte getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
public void setEventType(Byte eventType) {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
public String getClassName() {
|
||||
return className;
|
||||
}
|
||||
|
||||
public void setClassName(String className) {
|
||||
this.className = className;
|
||||
}
|
||||
|
||||
public String getMethodName() {
|
||||
return methodName;
|
||||
}
|
||||
|
||||
public void setMethodName(String methodName) {
|
||||
this.methodName = methodName;
|
||||
}
|
||||
|
||||
public Class<?>[] getParameterTypes() {
|
||||
return parameterTypes;
|
||||
}
|
||||
|
||||
public void setParameterTypes(Class<?>[] parameterTypes) {
|
||||
this.parameterTypes = parameterTypes;
|
||||
}
|
||||
|
||||
public Object[] getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public void setParameters(Object[] parameters) {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
public Boolean getAck() {
|
||||
return ack;
|
||||
}
|
||||
|
||||
public void setAck(Boolean ack) {
|
||||
this.ack = ack;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
/**
|
||||
* RpcResponse
|
||||
*/
|
||||
public class RpcResponse {
|
||||
|
||||
private String requestId;
|
||||
private String msg;
|
||||
private Object result;
|
||||
private Byte status;
|
||||
|
||||
/**
|
||||
* @see ResponseEventType
|
||||
*/
|
||||
private Byte responseType;
|
||||
|
||||
public String getRequestId() {
|
||||
return requestId;
|
||||
}
|
||||
|
||||
public void setRequestId(String requestId) {
|
||||
this.requestId = requestId;
|
||||
}
|
||||
|
||||
public String getMsg() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public void setMsg(String msg) {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public Object getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(Object result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public Byte getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Byte status) {
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.common;
|
||||
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public enum ThreadPoolManager {
|
||||
|
||||
INSTANCE;
|
||||
|
||||
ExecutorService executorService;
|
||||
|
||||
private static final int WORK_QUEUE_SIZE = 200;
|
||||
private static final long KEEP_ALIVE_TIME = 60;
|
||||
|
||||
ThreadPoolManager() {
|
||||
executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2, Runtime.getRuntime().availableProcessors() * 4, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
|
||||
new ArrayBlockingQueue<>(WORK_QUEUE_SIZE),
|
||||
new DiscardPolicy());
|
||||
}
|
||||
|
||||
public void addExecuteTask(Runnable task) {
|
||||
executorService.submit(task);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.config;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.base.RpcService;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import org.reflections.Reflections;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* ServiceBean find all rpcService
|
||||
*/
|
||||
public class ServiceBean {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ServiceBean.class);
|
||||
|
||||
private static Map<String, Class> serviceMap = new HashMap<>();
|
||||
|
||||
private static AtomicBoolean initialized = new AtomicBoolean(false);
|
||||
|
||||
private ServiceBean() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
private static synchronized void init() {
|
||||
// todo config
|
||||
if (initialized.get()) {
|
||||
return;
|
||||
}
|
||||
Reflections f = new Reflections("org/apache/dolphinscheduler/");
|
||||
List<Class<?>> list = new ArrayList<>(f.getTypesAnnotatedWith(RpcService.class));
|
||||
list.forEach(rpcClass -> {
|
||||
RpcService rpcService = rpcClass.getAnnotation(RpcService.class);
|
||||
serviceMap.put(rpcService.value(), rpcClass);
|
||||
logger.info("load rpc service {}", rpcService.value());
|
||||
});
|
||||
initialized.set(true);
|
||||
}
|
||||
|
||||
public static Class getServiceClass(String className) {
|
||||
if (initialized.get()) {
|
||||
return serviceMap.get(className);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
return serviceMap.get(className);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.future;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcRequest;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcResponse;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* RpcFuture
|
||||
*/
|
||||
public class RpcFuture implements Future<Object> {
|
||||
|
||||
private CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
private RpcResponse response;
|
||||
|
||||
private RpcRequest request;
|
||||
|
||||
private long requestId;
|
||||
|
||||
public RpcFuture(RpcRequest rpcRequest, long requestId) {
|
||||
this.request = rpcRequest;
|
||||
this.requestId = requestId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean cancel(boolean mayInterruptIfRunning) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDone() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RpcResponse get() throws InterruptedException {
|
||||
// the timeout period should be defined by the business party
|
||||
boolean success = latch.await(5, TimeUnit.SECONDS);
|
||||
if (!success) {
|
||||
throw new RuntimeException("Timeout exception. Request id: " + this.requestId
|
||||
+ ". Request class name: " + this.request.getClassName()
|
||||
+ ". Request method: " + this.request.getMethodName());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RpcResponse get(long timeout, TimeUnit unit) throws InterruptedException {
|
||||
boolean success = latch.await(timeout, unit);
|
||||
if (!success) {
|
||||
throw new RuntimeException("Timeout exception. Request id: " + requestId
|
||||
+ ". Request class name: " + this.request.getClassName()
|
||||
+ ". Request method: " + this.request.getMethodName());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
public void done(RpcResponse response) {
|
||||
this.response = response;
|
||||
latch.countDown();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.protocol;
|
||||
|
||||
public enum EventType {
|
||||
|
||||
HEARTBEAT((byte)1,"heartbeat"),
|
||||
REQUEST((byte)2,"business request"),
|
||||
RESPONSE((byte)3,"business response");
|
||||
|
||||
private Byte type;
|
||||
|
||||
private String description;
|
||||
|
||||
EventType(Byte type, String description) {
|
||||
this.type = type;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Byte getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.rpc.protocol;
|
||||
|
||||
public class MessageHeader {
|
||||
|
||||
private byte version = 1;
|
||||
|
||||
private byte eventType;
|
||||
|
||||
private int msgLength = 0;
|
||||
|
||||
private long requestId = 0L;
|
||||
|
||||
private byte serialization = 0;
|
||||
|
||||
private short magic = RpcProtocolConstants.MAGIC;
|
||||
|
||||
public short getMagic() {
|
||||
return magic;
|
||||
}
|
||||
|
||||
public byte getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(byte version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public byte getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
public void setEventType(byte eventType) {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
public int getMsgLength() {
|
||||
return msgLength;
|
||||
}
|
||||
|
||||
public void setMsgLength(int msgLength) {
|
||||
this.msgLength = msgLength;
|
||||
}
|
||||
|
||||
public long getRequestId() {
|
||||
return requestId;
|
||||
}
|
||||
|
||||
public void setRequestId(long requestId) {
|
||||
this.requestId = requestId;
|
||||
}
|
||||
|
||||
public byte getSerialization() {
|
||||
return serialization;
|
||||
}
|
||||
|
||||
public void setSerialization(byte serialization) {
|
||||
this.serialization = serialization;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.protocol;
|
||||
|
||||
public class RpcProtocol<T> {
|
||||
|
||||
private MessageHeader msgHeader;
|
||||
|
||||
private T body;
|
||||
|
||||
public MessageHeader getMsgHeader() {
|
||||
return msgHeader;
|
||||
}
|
||||
|
||||
public void setMsgHeader(MessageHeader msgHeader) {
|
||||
this.msgHeader = msgHeader;
|
||||
}
|
||||
|
||||
public T getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public void setBody(T body) {
|
||||
this.body = body;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.protocol;
|
||||
|
||||
public class RpcProtocolConstants {
|
||||
|
||||
public RpcProtocolConstants() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
public static final int HEADER_LENGTH = 17;
|
||||
|
||||
public static final short MAGIC = (short) 0xbabe;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,253 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.remote;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.config.NettyClientConfig;
|
||||
import org.apache.dolphinscheduler.remote.utils.Constants;
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
import org.apache.dolphinscheduler.remote.utils.NettyUtils;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcRequestCache;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcRequestTable;
|
||||
import org.apache.dolphinscheduler.rpc.codec.NettyDecoder;
|
||||
import org.apache.dolphinscheduler.rpc.codec.NettyEncoder;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcRequest;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcResponse;
|
||||
import org.apache.dolphinscheduler.rpc.future.RpcFuture;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.netty.bootstrap.Bootstrap;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelOption;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.epoll.EpollEventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.handler.logging.LogLevel;
|
||||
import io.netty.handler.logging.LoggingHandler;
|
||||
import io.netty.handler.timeout.IdleStateHandler;
|
||||
|
||||
/**
|
||||
* NettyClient
|
||||
*/
|
||||
public class NettyClient {
|
||||
|
||||
public static NettyClient getInstance() {
|
||||
return NettyClient.NettyClientInner.INSTANCE;
|
||||
}
|
||||
|
||||
private static class NettyClientInner {
|
||||
|
||||
private static final NettyClient INSTANCE = new NettyClient(new NettyClientConfig());
|
||||
}
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(NettyClient.class);
|
||||
|
||||
/**
|
||||
* worker group
|
||||
*/
|
||||
private final EventLoopGroup workerGroup;
|
||||
|
||||
/**
|
||||
* client config
|
||||
*/
|
||||
private final NettyClientConfig clientConfig;
|
||||
|
||||
|
||||
/**
|
||||
* client bootstrap
|
||||
*/
|
||||
private final Bootstrap bootstrap = new Bootstrap();
|
||||
|
||||
/**
|
||||
* started flag
|
||||
*/
|
||||
private final AtomicBoolean isStarted = new AtomicBoolean(false);
|
||||
|
||||
/**
|
||||
* channels
|
||||
*/
|
||||
private final ConcurrentHashMap<Host, Channel> channels = new ConcurrentHashMap(128);
|
||||
|
||||
/**
|
||||
* get channel
|
||||
*/
|
||||
private Channel getChannel(Host host) {
|
||||
Channel channel = channels.get(host);
|
||||
if (channel != null && channel.isActive()) {
|
||||
return channel;
|
||||
}
|
||||
return createChannel(host, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* create channel
|
||||
*
|
||||
* @param host host
|
||||
* @param isSync sync flag
|
||||
* @return channel
|
||||
*/
|
||||
public Channel createChannel(Host host, boolean isSync) {
|
||||
ChannelFuture future;
|
||||
try {
|
||||
synchronized (bootstrap) {
|
||||
future = bootstrap.connect(new InetSocketAddress(host.getIp(), host.getPort()));
|
||||
}
|
||||
if (isSync) {
|
||||
future.sync();
|
||||
}
|
||||
if (future.isSuccess()) {
|
||||
Channel channel = future.channel();
|
||||
channels.put(host, channel);
|
||||
return channel;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
logger.warn(String.format("connect to %s error", host), ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* client init
|
||||
*
|
||||
* @param clientConfig client config
|
||||
*/
|
||||
private NettyClient(final NettyClientConfig clientConfig) {
|
||||
this.clientConfig = clientConfig;
|
||||
if (NettyUtils.useEpoll()) {
|
||||
this.workerGroup = new EpollEventLoopGroup(clientConfig.getWorkerThreads(), new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyClient_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.workerGroup = new NioEventLoopGroup(clientConfig.getWorkerThreads(), new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyClient_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
}
|
||||
this.start();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* start
|
||||
*/
|
||||
private void start() {
|
||||
|
||||
this.bootstrap
|
||||
.group(this.workerGroup)
|
||||
.channel(NettyUtils.getSocketChannelClass())
|
||||
.option(ChannelOption.SO_KEEPALIVE, clientConfig.isSoKeepalive())
|
||||
.option(ChannelOption.TCP_NODELAY, clientConfig.isTcpNoDelay())
|
||||
.option(ChannelOption.SO_SNDBUF, clientConfig.getSendBufferSize())
|
||||
.option(ChannelOption.SO_RCVBUF, clientConfig.getReceiveBufferSize())
|
||||
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, clientConfig.getConnectTimeoutMillis())
|
||||
.handler(new LoggingHandler(LogLevel.DEBUG))
|
||||
.handler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
public void initChannel(SocketChannel ch) {
|
||||
ch.pipeline()
|
||||
.addLast(new NettyEncoder())
|
||||
.addLast(new NettyDecoder(RpcResponse.class))
|
||||
.addLast("client-idle-handler", new IdleStateHandler(Constants.NETTY_CLIENT_HEART_BEAT_TIME, 0, 0, TimeUnit.MILLISECONDS))
|
||||
.addLast(new NettyClientHandler());
|
||||
}
|
||||
});
|
||||
|
||||
isStarted.compareAndSet(false, true);
|
||||
}
|
||||
|
||||
public RpcResponse sendMsg(Host host, RpcProtocol<RpcRequest> protocol, Boolean async) {
|
||||
|
||||
Channel channel = getChannel(host);
|
||||
assert channel != null;
|
||||
RpcRequest request = protocol.getBody();
|
||||
RpcRequestCache rpcRequestCache = new RpcRequestCache();
|
||||
String serviceName = request.getClassName() + request.getMethodName();
|
||||
rpcRequestCache.setServiceName(serviceName);
|
||||
long reqId = protocol.getMsgHeader().getRequestId();
|
||||
RpcFuture future = null;
|
||||
if (Boolean.FALSE.equals(async)) {
|
||||
future = new RpcFuture(request, reqId);
|
||||
rpcRequestCache.setRpcFuture(future);
|
||||
}
|
||||
RpcRequestTable.put(protocol.getMsgHeader().getRequestId(), rpcRequestCache);
|
||||
channel.writeAndFlush(protocol);
|
||||
RpcResponse result = null;
|
||||
if (Boolean.TRUE.equals(async)) {
|
||||
result = new RpcResponse();
|
||||
result.setStatus((byte) 0);
|
||||
result.setResult(true);
|
||||
return result;
|
||||
}
|
||||
try {
|
||||
assert future != null;
|
||||
result = future.get();
|
||||
} catch (InterruptedException e) {
|
||||
logger.error("send msg error,service name is {}", serviceName, e);
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* close
|
||||
*/
|
||||
public void close() {
|
||||
if (isStarted.compareAndSet(true, false)) {
|
||||
try {
|
||||
closeChannels();
|
||||
if (workerGroup != null) {
|
||||
this.workerGroup.shutdownGracefully();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
logger.error("netty client close exception", ex);
|
||||
}
|
||||
logger.info("netty client closed");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* close channels
|
||||
*/
|
||||
private void closeChannels() {
|
||||
for (Channel channel : this.channels.values()) {
|
||||
channel.close();
|
||||
}
|
||||
this.channels.clear();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.remote;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.client.ConsumerConfig;
|
||||
import org.apache.dolphinscheduler.rpc.client.ConsumerConfigCache;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcRequestCache;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcRequestTable;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcResponse;
|
||||
import org.apache.dolphinscheduler.rpc.common.ThreadPoolManager;
|
||||
import org.apache.dolphinscheduler.rpc.future.RpcFuture;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.EventType;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.MessageHeader;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import io.netty.handler.timeout.IdleStateEvent;
|
||||
|
||||
/**
|
||||
* NettyClientHandler
|
||||
*/
|
||||
@ChannelHandler.Sharable
|
||||
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
|
||||
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(NettyClientHandler.class);
|
||||
|
||||
private static final ThreadPoolManager threadPoolManager = ThreadPoolManager.INSTANCE;
|
||||
|
||||
@Override
|
||||
public void channelInactive(ChannelHandlerContext ctx) {
|
||||
ctx.channel().close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelRead(ChannelHandlerContext ctx, Object msg) {
|
||||
RpcProtocol rpcProtocol = (RpcProtocol) msg;
|
||||
|
||||
RpcResponse rsp = (RpcResponse) rpcProtocol.getBody();
|
||||
long reqId = rpcProtocol.getMsgHeader().getRequestId();
|
||||
RpcRequestCache rpcRequest = RpcRequestTable.get(reqId);
|
||||
|
||||
if (null == rpcRequest) {
|
||||
logger.warn("rpc read error,this request does not exist");
|
||||
return;
|
||||
}
|
||||
threadPoolManager.addExecuteTask(() -> readHandler(rsp, rpcRequest, reqId));
|
||||
}
|
||||
|
||||
private void readHandler(RpcResponse rsp, RpcRequestCache rpcRequest, long reqId) {
|
||||
String serviceName = rpcRequest.getServiceName();
|
||||
ConsumerConfig consumerConfig = ConsumerConfigCache.getConfigByServersName(serviceName);
|
||||
if (Boolean.FALSE.equals(consumerConfig.getAsync())) {
|
||||
RpcFuture future = rpcRequest.getRpcFuture();
|
||||
RpcRequestTable.remove(reqId);
|
||||
future.done(rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Boolean.FALSE.equals(consumerConfig.getCallBack())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (rsp.getStatus() == 0) {
|
||||
|
||||
try {
|
||||
consumerConfig.getServiceCallBackClass().getDeclaredConstructor().newInstance().run(rsp.getResult());
|
||||
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
|
||||
logger.error("rpc service call back error,serviceName {},rsp {}", serviceName, rsp);
|
||||
}
|
||||
} else {
|
||||
logger.error("rpc response error ,serviceName {},rsp {}", serviceName, rsp);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
|
||||
|
||||
if (evt instanceof IdleStateEvent) {
|
||||
RpcProtocol rpcProtocol = new RpcProtocol();
|
||||
MessageHeader messageHeader = new MessageHeader();
|
||||
messageHeader.setEventType(EventType.HEARTBEAT.getType());
|
||||
rpcProtocol.setMsgHeader(messageHeader);
|
||||
ctx.channel().writeAndFlush(rpcProtocol);
|
||||
logger.debug("send heart beat msg...");
|
||||
} else {
|
||||
super.userEventTriggered(ctx, evt);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
||||
logger.error("exceptionCaught : {}", cause.getMessage(), cause);
|
||||
ctx.channel().close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,196 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.remote;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.config.NettyServerConfig;
|
||||
import org.apache.dolphinscheduler.remote.utils.Constants;
|
||||
import org.apache.dolphinscheduler.remote.utils.NettyUtils;
|
||||
import org.apache.dolphinscheduler.rpc.codec.NettyDecoder;
|
||||
import org.apache.dolphinscheduler.rpc.codec.NettyEncoder;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcRequest;
|
||||
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelOption;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.epoll.EpollEventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.handler.logging.LogLevel;
|
||||
import io.netty.handler.logging.LoggingHandler;
|
||||
import io.netty.handler.timeout.IdleStateHandler;
|
||||
|
||||
/**
|
||||
* NettyServer
|
||||
*/
|
||||
public class NettyServer {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(NettyServer.class);
|
||||
|
||||
/**
|
||||
* boss group
|
||||
*/
|
||||
private final EventLoopGroup bossGroup;
|
||||
|
||||
/**
|
||||
* worker group
|
||||
*/
|
||||
private final EventLoopGroup workGroup;
|
||||
|
||||
/**
|
||||
* server config
|
||||
*/
|
||||
private final NettyServerConfig serverConfig;
|
||||
|
||||
/**
|
||||
* server bootstrap
|
||||
*/
|
||||
private final ServerBootstrap serverBootstrap = new ServerBootstrap();
|
||||
|
||||
/**
|
||||
* started flag
|
||||
*/
|
||||
private final AtomicBoolean isStarted = new AtomicBoolean(false);
|
||||
|
||||
/**
|
||||
* server init
|
||||
*
|
||||
* @param serverConfig server config
|
||||
*/
|
||||
public NettyServer(final NettyServerConfig serverConfig) {
|
||||
this.serverConfig = serverConfig;
|
||||
if (NettyUtils.useEpoll()) {
|
||||
this.bossGroup = new EpollEventLoopGroup(1, new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyServerBossThread_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
|
||||
this.workGroup = new EpollEventLoopGroup(serverConfig.getWorkerThread(), new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyServerWorkerThread_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.bossGroup = new NioEventLoopGroup(1, new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyServerBossThread_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
|
||||
this.workGroup = new NioEventLoopGroup(serverConfig.getWorkerThread(), new ThreadFactory() {
|
||||
private AtomicInteger threadIndex = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, String.format("NettyServerWorkerThread_%d", this.threadIndex.incrementAndGet()));
|
||||
}
|
||||
});
|
||||
}
|
||||
this.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* server start
|
||||
*/
|
||||
public void start() {
|
||||
if (isStarted.compareAndSet(false, true)) {
|
||||
this.serverBootstrap
|
||||
.group(this.bossGroup, this.workGroup)
|
||||
.channel(NettyUtils.getServerSocketChannelClass())
|
||||
.option(ChannelOption.SO_REUSEADDR, true)
|
||||
.option(ChannelOption.SO_BACKLOG, serverConfig.getSoBacklog())
|
||||
.childOption(ChannelOption.SO_KEEPALIVE, serverConfig.isSoKeepalive())
|
||||
.childOption(ChannelOption.TCP_NODELAY, serverConfig.isTcpNoDelay())
|
||||
.childOption(ChannelOption.SO_SNDBUF, serverConfig.getSendBufferSize())
|
||||
.childOption(ChannelOption.SO_RCVBUF, serverConfig.getReceiveBufferSize())
|
||||
.handler(new LoggingHandler(LogLevel.DEBUG))
|
||||
.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
|
||||
@Override
|
||||
protected void initChannel(SocketChannel ch) {
|
||||
initNettyChannel(ch);
|
||||
}
|
||||
});
|
||||
|
||||
ChannelFuture future;
|
||||
try {
|
||||
future = serverBootstrap.bind(serverConfig.getListenPort()).sync();
|
||||
} catch (Exception e) {
|
||||
logger.error("NettyRemotingServer bind fail {}, exit", e.getMessage(), e);
|
||||
throw new RuntimeException(String.format("NettyRemotingServer bind %s fail", serverConfig.getListenPort()));
|
||||
}
|
||||
if (future.isSuccess()) {
|
||||
logger.info("NettyRemotingServer bind success at port : {}", serverConfig.getListenPort());
|
||||
} else if (future.cause() != null) {
|
||||
throw new RuntimeException(String.format("NettyRemotingServer bind %s fail", serverConfig.getListenPort()), future.cause());
|
||||
} else {
|
||||
throw new RuntimeException(String.format("NettyRemotingServer bind %s fail", serverConfig.getListenPort()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* init netty channel
|
||||
*
|
||||
* @param ch socket channel
|
||||
*/
|
||||
private void initNettyChannel(SocketChannel ch) {
|
||||
ch.pipeline()
|
||||
.addLast(new NettyDecoder(RpcRequest.class))
|
||||
.addLast(new NettyEncoder())
|
||||
.addLast("server-idle-handle", new IdleStateHandler(0, 0, Constants.NETTY_SERVER_HEART_BEAT_TIME, TimeUnit.MILLISECONDS))
|
||||
.addLast("handler", new NettyServerHandler());
|
||||
}
|
||||
|
||||
public void close() {
|
||||
if (isStarted.compareAndSet(true, false)) {
|
||||
try {
|
||||
if (bossGroup != null) {
|
||||
this.bossGroup.shutdownGracefully();
|
||||
}
|
||||
if (workGroup != null) {
|
||||
this.workGroup.shutdownGracefully();
|
||||
}
|
||||
|
||||
} catch (Exception ex) {
|
||||
logger.error("netty server close exception", ex);
|
||||
}
|
||||
logger.info("netty server closed");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.remote;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcRequest;
|
||||
import org.apache.dolphinscheduler.rpc.common.RpcResponse;
|
||||
import org.apache.dolphinscheduler.rpc.common.ThreadPoolManager;
|
||||
import org.apache.dolphinscheduler.rpc.config.ServiceBean;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.EventType;
|
||||
import org.apache.dolphinscheduler.rpc.protocol.RpcProtocol;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||
import io.netty.handler.timeout.IdleStateEvent;
|
||||
|
||||
/**
|
||||
* NettyServerHandler
|
||||
*/
|
||||
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(NettyServerHandler.class);
|
||||
|
||||
private static final ThreadPoolManager threadPoolManager = ThreadPoolManager.INSTANCE;
|
||||
|
||||
@Override
|
||||
public void channelInactive(ChannelHandlerContext ctx) {
|
||||
logger.info("channel close");
|
||||
ctx.channel().close();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelActive(ChannelHandlerContext ctx) {
|
||||
logger.info("client connect success !" + ctx.channel().remoteAddress());
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void channelRead(ChannelHandlerContext ctx, Object msg) {
|
||||
RpcProtocol<RpcRequest> rpcProtocol = (RpcProtocol<RpcRequest>) msg;
|
||||
if (rpcProtocol.getMsgHeader().getEventType() == EventType.HEARTBEAT.getType()) {
|
||||
logger.info("heart beat");
|
||||
return;
|
||||
}
|
||||
threadPoolManager.addExecuteTask(() -> readHandler(ctx, rpcProtocol));
|
||||
}
|
||||
|
||||
private void readHandler(ChannelHandlerContext ctx, RpcProtocol protocol) {
|
||||
RpcRequest req = (RpcRequest) protocol.getBody();
|
||||
RpcResponse response = new RpcResponse();
|
||||
|
||||
response.setStatus((byte) 0);
|
||||
|
||||
String classname = req.getClassName();
|
||||
|
||||
String methodName = req.getMethodName();
|
||||
|
||||
Class<?>[] parameterTypes = req.getParameterTypes();
|
||||
|
||||
Object[] arguments = req.getParameters();
|
||||
Object result = null;
|
||||
try {
|
||||
Class serviceClass = ServiceBean.getServiceClass(classname);
|
||||
|
||||
Object object = serviceClass.newInstance();
|
||||
|
||||
Method method = serviceClass.getMethod(methodName, parameterTypes);
|
||||
|
||||
result = method.invoke(object, arguments);
|
||||
} catch (Exception e) {
|
||||
logger.error("netty server execute error,service name :{} method name :{} ", classname + methodName, e);
|
||||
response.setStatus((byte) -1);
|
||||
}
|
||||
|
||||
response.setResult(result);
|
||||
protocol.setBody(response);
|
||||
protocol.getMsgHeader().setEventType(EventType.RESPONSE.getType());
|
||||
ctx.writeAndFlush(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
|
||||
if (evt instanceof IdleStateEvent) {
|
||||
logger.debug("IdleStateEvent triggered, send heartbeat to channel " + ctx.channel());
|
||||
} else {
|
||||
super.userEventTriggered(ctx, evt);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
||||
logger.error("exceptionCaught : {}", cause.getMessage(), cause);
|
||||
ctx.channel().close();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
package org.apache.dolphinscheduler.rpc.serializer;/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import io.protostuff.LinkedBuffer;
|
||||
import io.protostuff.ProtostuffIOUtil;
|
||||
import io.protostuff.Schema;
|
||||
import io.protostuff.runtime.RuntimeSchema;
|
||||
|
||||
public class ProtoStuffSerializer implements Serializer {
|
||||
|
||||
private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
|
||||
|
||||
private static Map<Class<?>, Schema<?>> schemaCache = new ConcurrentHashMap<>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T> Schema<T> getSchema(Class<T> clazz) {
|
||||
return (Schema<T>) schemaCache.computeIfAbsent(clazz, RuntimeSchema::createFrom);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> byte[] serialize(T obj) {
|
||||
Class<T> clazz = (Class<T>) obj.getClass();
|
||||
Schema<T> schema = getSchema(clazz);
|
||||
byte[] data;
|
||||
try {
|
||||
data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T deserialize(byte[] data, Class<T> clz) {
|
||||
Schema<T> schema = getSchema(clz);
|
||||
T obj = schema.newMessage();
|
||||
if (null == obj) {
|
||||
return null;
|
||||
}
|
||||
ProtostuffIOUtil.mergeFrom(data, obj, schema);
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.rpc.serializer;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import io.protostuff.LinkedBuffer;
|
||||
import io.protostuff.ProtostuffIOUtil;
|
||||
import io.protostuff.Schema;
|
||||
import io.protostuff.runtime.RuntimeSchema;
|
||||
|
||||
/**
|
||||
* ProtoStuffUtils
|
||||
*/
|
||||
public class ProtoStuffUtils {
|
||||
|
||||
private ProtoStuffUtils() {
|
||||
throw new IllegalStateException("Utility class");
|
||||
}
|
||||
|
||||
private static LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
|
||||
|
||||
private static Map<Class<?>, Schema<?>> schemaCache = new ConcurrentHashMap<>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> byte[] serialize(T obj) {
|
||||
Class<T> clazz = (Class<T>) obj.getClass();
|
||||
Schema<T> schema = getSchema(clazz);
|
||||
byte[] data;
|
||||
try {
|
||||
data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
|
||||
} finally {
|
||||
buffer.clear();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private static <T> Schema<T> getSchema(Class<T> clazz) {
|
||||
return (Schema<T>) schemaCache.computeIfAbsent(clazz, RuntimeSchema::createFrom);
|
||||
}
|
||||
|
||||
public static <T> T deserialize(byte[] bytes, Class<T> clazz) {
|
||||
Schema<T> schema = getSchema(clazz);
|
||||
T obj = schema.newMessage();
|
||||
if (null == obj) {
|
||||
return null;
|
||||
}
|
||||
ProtostuffIOUtil.mergeFrom(bytes, obj, schema);
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
package org.apache.dolphinscheduler.rpc.serializer;/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public enum RpcSerializer {
|
||||
|
||||
|
||||
PROTOSTUFF((byte) 1, new ProtoStuffSerializer());
|
||||
|
||||
byte type;
|
||||
|
||||
Serializer serializer;
|
||||
|
||||
RpcSerializer(byte type, Serializer serializer) {
|
||||
this.type = type;
|
||||
this.serializer = serializer;
|
||||
}
|
||||
|
||||
public byte getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
private static HashMap<Byte, Serializer> SERIALIZERS_MAP = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (RpcSerializer rpcSerializer : RpcSerializer.values()) {
|
||||
SERIALIZERS_MAP.put(rpcSerializer.type, rpcSerializer.serializer);
|
||||
}
|
||||
}
|
||||
|
||||
public static Serializer getSerializerByType(byte type) {
|
||||
return SERIALIZERS_MAP.get(type);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc.serializer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public interface Serializer {
|
||||
|
||||
<T> byte[] serialize(T obj) throws IOException;
|
||||
|
||||
<T> T deserialize(byte[] data, Class<T> clz) throws IOException;
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.base.Rpc;
|
||||
|
||||
/**
|
||||
* IUserService
|
||||
*/
|
||||
public interface IUserService {
|
||||
|
||||
@Rpc(async = true, serviceCallback = UserCallback.class)
|
||||
Boolean say(String s);
|
||||
|
||||
Integer hi(int num);
|
||||
|
||||
@Rpc(async = true)
|
||||
Boolean callBackIsFalse(String s);
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc;
|
||||
|
||||
import org.apache.dolphinscheduler.remote.config.NettyServerConfig;
|
||||
import org.apache.dolphinscheduler.remote.utils.Host;
|
||||
import org.apache.dolphinscheduler.rpc.client.IRpcClient;
|
||||
import org.apache.dolphinscheduler.rpc.client.RpcClient;
|
||||
import org.apache.dolphinscheduler.rpc.remote.NettyClient;
|
||||
import org.apache.dolphinscheduler.rpc.remote.NettyServer;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
public class RpcTest {
|
||||
private NettyServer nettyServer;
|
||||
|
||||
private IUserService userService;
|
||||
|
||||
private Host host;
|
||||
|
||||
@Before
|
||||
public void before() throws Exception {
|
||||
nettyServer = new NettyServer(new NettyServerConfig());
|
||||
IRpcClient rpcClient = new RpcClient();
|
||||
host = new Host("127.0.0.1", 12346);
|
||||
userService = rpcClient.create(IUserService.class, host);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sendTest() {
|
||||
Integer result = userService.hi(3);
|
||||
Assert.assertSame(4, result);
|
||||
result = userService.hi(4);
|
||||
Assert.assertSame(5, result);
|
||||
userService.say("sync");
|
||||
userService.callBackIsFalse("async no call back");
|
||||
userService.hi(999999);
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
NettyClient.getInstance().close();
|
||||
nettyServer.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.common.AbstractRpcCallBack;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* UserCallback
|
||||
*/
|
||||
public class UserCallback extends AbstractRpcCallBack {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(UserCallback.class);
|
||||
|
||||
@Override
|
||||
public void run(Object object) {
|
||||
String msg = (String) object;
|
||||
logger.debug("Kris---------------------------------userCallBack msg is {}", msg);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* 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.dolphinscheduler.rpc;
|
||||
|
||||
import org.apache.dolphinscheduler.rpc.base.RpcService;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* UserService
|
||||
*/
|
||||
@RpcService("IUserService")
|
||||
public class UserService implements IUserService {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
|
||||
|
||||
@Override
|
||||
public Boolean say(String s) {
|
||||
|
||||
logger.info("Kris UserService say-------------------------------Synchronous call msg{}", s);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer hi(int num) {
|
||||
|
||||
logger.info("Kris UserService hi-------------------------------async call msg{}", num);
|
||||
return ++num;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean callBackIsFalse(String s) {
|
||||
logger.info("Kris UserService callBackIsFalse-------------------------------async call msg{}", s);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
# worker listener port
|
||||
#worker.listen.port=1234
|
||||
|
||||
# default worker group
|
||||
# default worker groups
|
||||
#worker.groups=default
|
||||
|
||||
# default worker weight
|
||||
|
|
|
|||
|
|
@ -370,7 +370,7 @@ public class QuartzExecutors {
|
|||
* @return data map
|
||||
*/
|
||||
public static Map<String, Object> buildDataMap(int projectId, int scheduleId, Schedule schedule) {
|
||||
Map<String, Object> dataMap = new HashMap<>(3);
|
||||
Map<String, Object> dataMap = new HashMap<>(8);
|
||||
dataMap.put(PROJECT_ID, projectId);
|
||||
dataMap.put(SCHEDULE_ID, scheduleId);
|
||||
dataMap.put(SCHEDULE, JSONUtils.toJsonString(schedule));
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ public class BrowserCommon {
|
|||
protected Actions actions;
|
||||
|
||||
/**
|
||||
* Javascript
|
||||
* JavaScript
|
||||
*/
|
||||
protected JavascriptExecutor je;
|
||||
|
||||
|
|
|
|||
30
pom.xml
30
pom.xml
|
|
@ -121,6 +121,9 @@
|
|||
<guava-retry.version>2.0.0</guava-retry.version>
|
||||
<dep.airlift.version>0.184</dep.airlift.version>
|
||||
<dep.packaging.version>${dep.airlift.version}</dep.packaging.version>
|
||||
<protostuff.version>1.7.2</protostuff.version>
|
||||
<reflections.version>0.9.12</reflections.version>
|
||||
<byte-buddy.version>1.9.16</byte-buddy.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
|
|
@ -315,6 +318,32 @@
|
|||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!--protostuff-->
|
||||
<!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-core -->
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-core</artifactId>
|
||||
<version>${protostuff.version}</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-runtime -->
|
||||
<dependency>
|
||||
<groupId>io.protostuff</groupId>
|
||||
<artifactId>protostuff-runtime</artifactId>
|
||||
<version>${protostuff.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.bytebuddy</groupId>
|
||||
<artifactId>byte-buddy</artifactId>
|
||||
<version>${byte-buddy.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.reflections</groupId>
|
||||
<artifactId>reflections</artifactId>
|
||||
<version>${reflections.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
|
|
@ -868,6 +897,7 @@
|
|||
<include>**/dao/entity/UdfFuncTest.java</include>
|
||||
<include>**/remote/JsonSerializerTest.java</include>
|
||||
<include>**/remote/RemoveTaskLogResponseCommandTest.java</include>
|
||||
<include>**/rpc/RpcTest.java</include>
|
||||
<include>**/remote/RemoveTaskLogRequestCommandTest.java</include>
|
||||
<include>**/remote/NettyRemotingClientTest.java</include>
|
||||
<include>**/remote/NettyUtilTest.java</include>
|
||||
|
|
|
|||
|
|
@ -36,4 +36,4 @@ echo '=== Third party dependencies: ' && grep -vf self-modules.txt all-dependenc
|
|||
# command in target OS is different from what we used to sort the file `known-dependencies.txt`, i.e. "sort the two file
|
||||
# using the same command (and default arguments)"
|
||||
|
||||
diff -w -B -U0 <(sort < tools/dependencies/known-dependencies.txt) <(sort < third-party-dependencies.txt)
|
||||
diff -w -B -U0 <(sort < tools/dependencies/known-dependencies.txt) <(sort < third-party-dependencies.txt)
|
||||
|
|
@ -102,6 +102,7 @@ jackson-xc-1.9.13.jar
|
|||
jamon-runtime-2.3.1.jar
|
||||
janino-3.0.16.jar
|
||||
java-xmlbuilder-0.4.jar
|
||||
javassist-3.26.0-GA.jar
|
||||
javax.activation-api-1.2.0.jar
|
||||
javax.annotation-api-1.3.2.jar
|
||||
javax.inject-1.jar
|
||||
|
|
@ -192,8 +193,13 @@ poi-3.17.jar
|
|||
postgresql-42.1.4.jar
|
||||
presto-jdbc-0.238.1.jar
|
||||
protobuf-java-2.5.0.jar
|
||||
protostuff-core-1.7.2.jar
|
||||
protostuff-runtime-1.7.2.jar
|
||||
protostuff-api-1.7.2.jar
|
||||
protostuff-collectionschema-1.7.2.jar
|
||||
quartz-2.3.0.jar
|
||||
quartz-jobs-2.3.0.jar
|
||||
reflections-0.9.12.jar
|
||||
resolver-1.5.jar
|
||||
slf4j-api-1.7.5.jar
|
||||
snakeyaml-1.23.jar
|
||||
|
|
|
|||
Loading…
Reference in New Issue