lenboo
4 years ago
77 changed files with 4718 additions and 230 deletions
@ -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 |
|
@ -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. |
@ -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; |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue