Compare commits
213
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d6f19cc33 | ||
|
|
1463463f1e | ||
|
|
77342663e3 | ||
|
|
e01e48ff65 | ||
|
|
4f00f5ea8d | ||
|
|
19707f92d4 | ||
|
|
3930ea0f9b | ||
|
|
676cf47987 | ||
|
|
788c1d9b84 | ||
|
|
84a9aeb46c | ||
|
|
e8da1c884b | ||
|
|
041cbf04c7 | ||
|
|
a1cf292baa | ||
|
|
67436b2bc4 | ||
|
|
ca350a79bd | ||
|
|
214e404e1b | ||
|
|
34bcfbc3cb | ||
|
|
402245dbbf | ||
|
|
2cebfa04dd | ||
|
|
62e8ff6ec8 | ||
|
|
b265bf4669 | ||
|
|
989a69e7be | ||
|
|
780b4f715b | ||
|
|
8e88dc87f7 | ||
|
|
867d6607d4 | ||
|
|
22e3d2f3f1 | ||
|
|
ecdd619da7 | ||
|
|
9ba93bae5f | ||
|
|
0b2f37a272 | ||
|
|
0bd4a1146c | ||
|
|
3dba400624 | ||
|
|
523130cf8b | ||
|
|
525a00ea17 | ||
|
|
b6090da0e5 | ||
|
|
9ea88c7863 | ||
|
|
48c108806a | ||
|
|
8600e9825b | ||
|
|
29815c41b0 | ||
|
|
717e2cb7f3 | ||
|
|
3e5b3e1467 | ||
|
|
a46ac3b814 | ||
|
|
f6c2eb8963 | ||
|
|
07b979f242 | ||
|
|
6b20959a2d | ||
|
|
fdd40224d5 | ||
|
|
a6604978ed | ||
|
|
4d624cf184 | ||
|
|
7e026f2495 | ||
|
|
2e3796cb07 | ||
|
|
b2a5f482ee | ||
|
|
a78622ae02 | ||
|
|
e5444ae658 | ||
|
|
73627df082 | ||
|
|
c0f2d274d7 | ||
|
|
2eb05b5934 | ||
|
|
83689ee519 | ||
|
|
d78b389737 | ||
|
|
20d8ac67dc | ||
|
|
19a56fb77e | ||
|
|
c629e8c899 | ||
|
|
75a5a4d7df | ||
|
|
045a2e5a50 | ||
|
|
11d0712291 | ||
|
|
03ff9512dd | ||
|
|
0ee2e767d2 | ||
|
|
ff97dcbbc9 | ||
|
|
92c1a51726 | ||
|
|
36216e63ea | ||
|
|
db4fc68a55 | ||
|
|
eef58005d9 | ||
|
|
8141ddc4e8 | ||
|
|
004f26465f | ||
|
|
5dc62bbda8 | ||
|
|
f45f1ac74f | ||
|
|
5c11c71783 | ||
|
|
f745c698e9 | ||
|
|
5f4bbab722 | ||
|
|
a483f03711 | ||
|
|
a1207060bf | ||
|
|
5055fdb556 | ||
|
|
a69b69c724 | ||
|
|
90e6d34fb4 | ||
|
|
907ecd43e4 | ||
|
|
c57a921a1a | ||
|
|
83fee4ffbb | ||
|
|
bc7927fe75 | ||
|
|
e67f27018c | ||
|
|
3f38ad6f49 | ||
|
|
96dca0b9e6 | ||
|
|
ad2a96b3f1 | ||
|
|
6284a429a0 | ||
|
|
83d8a39d16 | ||
|
|
4898829384 | ||
|
|
69a7e6d083 | ||
|
|
a5d6c3b747 | ||
|
|
86378cad32 | ||
|
|
8626c6ee24 | ||
|
|
350f8637c3 | ||
|
|
96454d4387 | ||
|
|
8a293e4b0c | ||
|
|
006dd63646 | ||
|
|
b17c11868c | ||
|
|
0c9eecd758 | ||
|
|
5d9d5b1e44 | ||
|
|
b23e814c48 | ||
|
|
b349b400cf | ||
|
|
c86fba6092 | ||
|
|
9742fdc9d9 | ||
|
|
c99b4b8cd1 | ||
|
|
aa8ea96572 | ||
|
|
f6cf88a6bd | ||
|
|
14a5762fbb | ||
|
|
eda24df3fe | ||
|
|
3a5a4b06a9 | ||
|
|
ba173fcd48 | ||
|
|
69170f58df | ||
|
|
c3e38e50e2 | ||
|
|
ae05a3f39f | ||
|
|
6eafc73a65 | ||
|
|
63b3c4ab54 | ||
|
|
ecba855bf9 | ||
|
|
b599846470 | ||
|
|
8aefd7e79b | ||
|
|
4e76a4bd6e | ||
|
|
f1a1cb26cc | ||
|
|
4f1e3bafe7 | ||
|
|
6a03ffaf7b | ||
|
|
d7d969915e | ||
|
|
4898ed7b83 | ||
|
|
11e1d1d600 | ||
|
|
e614c6141d | ||
|
|
8ded94a09e | ||
|
|
38cc81b7da | ||
|
|
533c5cb8f6 | ||
|
|
5932e1e31f | ||
|
|
70dda221f1 | ||
|
|
c32a5d0882 | ||
|
|
fbd99acac2 | ||
|
|
51cfa7fa96 | ||
|
|
652101035e | ||
|
|
1813c1eff9 | ||
|
|
31ea9fa8f0 | ||
|
|
369acd8eed | ||
|
|
891eb960ca | ||
|
|
2e5a165b88 | ||
|
|
6b9c1305ff | ||
|
|
4f504aab31 | ||
|
|
dc28c68bf0 | ||
|
|
38f2f98da3 | ||
|
|
efebbe301a | ||
|
|
bf10b16138 | ||
|
|
37478f3409 | ||
|
|
d2f98cda87 | ||
|
|
ed74d934d3 | ||
|
|
7b29828f60 | ||
|
|
9164fe4ca7 | ||
|
|
51ac311aa1 | ||
|
|
643bd5cb71 | ||
|
|
8375ea4b7d | ||
|
|
72ceb58fa3 | ||
|
|
44f2b74862 | ||
|
|
5a34195201 | ||
|
|
d976932177 | ||
|
|
d887c8f763 | ||
|
|
197a1446b7 | ||
|
|
155c00b256 | ||
|
|
b16f4844a1 | ||
|
|
f2f2bfb538 | ||
|
|
5f6580399c | ||
|
|
10930b9e3d | ||
|
|
d1afeb7540 | ||
|
|
119af9fca1 | ||
|
|
f0ce4b569e | ||
|
|
4459b8acdf | ||
|
|
bb5d5749bd | ||
|
|
169baafb8b | ||
|
|
199f30de87 | ||
|
|
87c14f0b51 | ||
|
|
f35d965f63 | ||
|
|
9956b3557f | ||
|
|
452fae15fc | ||
|
|
3d6174f857 | ||
|
|
21abbbfe47 | ||
|
|
89056490c3 | ||
|
|
c935f06344 | ||
|
|
eeaf5ce910 | ||
|
|
c3f2ad08cd | ||
|
|
7ebb3fd1ab | ||
|
|
ea889cb004 | ||
|
|
596b060649 | ||
|
|
fc9b616f4a | ||
|
|
6a0733bbab | ||
|
|
bdf3b0c861 | ||
|
|
d01e82ce3c | ||
|
|
ae521195c5 | ||
|
|
5529dad14b | ||
|
|
b0143520eb | ||
|
|
5b56a027e5 | ||
|
|
50d4b18556 | ||
|
|
f9edeca6d2 | ||
|
|
5ade057113 | ||
|
|
befc31146a | ||
|
|
ac4970ef3a | ||
|
|
13bf7c85a0 | ||
|
|
a2ae8cda50 | ||
|
|
42b164f860 | ||
|
|
aac4d95b19 | ||
|
|
0e283bb52d | ||
|
|
9ad328c5ad | ||
|
|
5d1e952c6d | ||
|
|
4ba814da26 | ||
|
|
a743235eae | ||
|
|
a0defe575b |
+16
@@ -0,0 +1,16 @@
|
||||
.svn/
|
||||
target/
|
||||
test-output/
|
||||
*.class
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
tmp
|
||||
temp
|
||||
*.log
|
||||
antx.properties
|
||||
otter.properties
|
||||
jtester.properties
|
||||
.idea/
|
||||
*.iml
|
||||
.DS_Store
|
||||
+202
@@ -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,89 @@
|
||||
<div class="blog_content">
|
||||
<div class="iteye-blog-content-contain">
|
||||
|
||||
<h3>最新更新</h3>
|
||||
<ol>
|
||||
<li>canal QQ讨论群已经建立,群号:161559791 ,欢迎加入进行技术讨论。</li>
|
||||
<li>canal消费端项目开源: Otter(分布式数据库同步系统),地址:<a href="https://github.com/alibaba/otter">https://github.com/alibaba/otter</a></li>
|
||||
</ol>
|
||||
|
||||
<h1>背景</h1>
|
||||
<p style="font-size: 14px;"> 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。</p>
|
||||
<p style="font-size: 14px;"> ps. 目前内部版本已经支持mysql和oracle部分版本的日志解析,当前的canal开源版本支持5.7及以下的版本(阿里内部mysql 5.7.13, 5.6.10, mysql 5.5.18和5.1.40/48)</p>
|
||||
<p style="font-size: 14px;"> </p>
|
||||
<p style="font-size: 14px;">基于日志增量订阅&消费支持的业务:</p>
|
||||
<ol style="font-size: 14px;">
|
||||
<li>数据库镜像</li>
|
||||
<li>数据库实时备份</li>
|
||||
<li>多级索引 (卖家和买家各自分库索引)</li>
|
||||
<li>search build</li>
|
||||
<li>业务cache刷新</li>
|
||||
<li>价格变化等重要业务消息</li>
|
||||
</ol>
|
||||
<h1>项目介绍</h1>
|
||||
<p style="font-size: 14px;"> 名称:canal [kə'næl]</p>
|
||||
<p style="font-size: 14px;"> 译意: 水道/管道/沟渠 </p>
|
||||
<p style="font-size: 14px;"> 语言: 纯java开发</p>
|
||||
<p style="font-size: 14px;"> 定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql</p>
|
||||
<p style="font-size: 14px;"> 关键词: mysql binlog parser / real-time / queue&topic </p>
|
||||
<p style="font-size: 14px;"> </p>
|
||||
<h2>工作原理</h2>
|
||||
<h3 style="font-size: 14px;">mysql主备复制实现</h3>
|
||||
<p><img src="http://dl.iteye.com/upload/attachment/0080/3086/468c1a14-e7ad-3290-9d3d-44ac501a7227.jpg" alt=""><br> 从上层来看,复制分成三步:
|
||||
<ol>
|
||||
<li>master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);</li>
|
||||
<li>slave将master的binary log events拷贝到它的中继日志(relay log);</li>
|
||||
<li>slave重做中继日志中的事件,将改变反映它自己的数据。</li>
|
||||
</ol>
|
||||
<h3>canal的工作原理:</h3>
|
||||
<p><img width="590" src="https://camo.githubusercontent.com/46c626b4cde399db43b2634a7911a04aecf273a0/687474703a2f2f646c2e69746579652e636f6d2f75706c6f61642f6174746163686d656e742f303038302f333130372f63383762363762612d333934632d333038362d393537372d3964623035626530346339352e6a7067" alt="" height="273">
|
||||
<p>原理相对比较简单:</p>
|
||||
<ol>
|
||||
<li>canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议</li>
|
||||
<li>mysql master收到dump请求,开始推送binary log给slave(也就是canal)</li>
|
||||
<li>canal解析binary log对象(原始为byte流)</li>
|
||||
</ol>
|
||||
|
||||
<h1>相关文档</h1>
|
||||
|
||||
See the wiki page for : <a href="https://github.com/alibaba/canal/wiki" >wiki文档</a>
|
||||
|
||||
<h3><a name="table-of-contents" class="anchor" href="#table-of-contents"><span class="mini-icon mini-icon-link"></span></a>wiki文档列表</h3>
|
||||
<ul>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/Home">Home</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/Introduction">Introduction</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/QuickStart">QuickStart</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/ClientExample">ClientExample</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/AdminGuide">AdminGuide</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/ClientAPI">ClientAPI</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/DevGuide">DevGuide</a></li>
|
||||
<li><a class="internal present" href="https://github.com/alibaba/canal/wiki/BinlogChange%28mysql5.6%29">BinlogChange(Mysql5.6)</a></li>
|
||||
<li><a href="http://alibaba.github.com/canal/release.html">ReleaseNotes</a></li>
|
||||
<li><a href="https://github.com/alibaba/canal/releases">Download</a></li>
|
||||
</ul>
|
||||
|
||||
<h1>相关资料</h1>
|
||||
|
||||
* ADC阿里技术嘉年华分享ppt (放在google docs上,可能需要翻墙): <a href="https://docs.google.com/presentation/d/1MkszUPYRDkfVPz9IqOT1LLT5d9tuwde_WC8GZvjaDRg/edit?usp=sharing">ppt下载</href>
|
||||
* [与阿里巴巴的RocketMQ配合使用](https://github.com/alibaba/RocketMQ)
|
||||
|
||||
<h1>相关开源</h1>
|
||||
<ol>
|
||||
<li>阿里巴巴分布式数据库同步系统(解决中美异地机房):<a href="http://github.com/alibaba/otter">http://github.com/alibaba/otter</a></li>
|
||||
<li>阿里巴巴去Oracle数据迁移同步工具(目标支持MySQL/DRDS):<a href="http://github.com/alibaba/yugong">http://github.com/alibaba/yugong</a></li>
|
||||
</ol>
|
||||
|
||||
<h1>问题反馈</h1>
|
||||
<ol>
|
||||
<li>qq交流群: 161559791 </li>
|
||||
<li>邮件交流: jianghang115@gmail.com </li>
|
||||
<li>新浪微博: agapple0002 </li>
|
||||
<li>报告issue:<a href="https://github.com/alibaba/canal/issues">issues</a></li>
|
||||
</ol>
|
||||
|
||||
<pre>
|
||||
【招聘】阿里巴巴中间件团队招聘JAVA高级工程师
|
||||
岗位主要为技术型内容(非业务部门),阿里中间件整个体系对于未来想在技术上有所沉淀的同学还是非常有帮助的
|
||||
工作地点:杭州、北京均可. ps. 阿里待遇向来都是不错的,有意者可以QQ、微博私聊.
|
||||
具体招聘内容:https://job.alibaba.com/zhaopin/position_detail.htm?positionId=32666
|
||||
</pre>
|
||||
@@ -0,0 +1,3 @@
|
||||
release link : https://alibaba.github.com/canal/release.html
|
||||
|
||||
download link : https://github.com/alibaba/canal/releases
|
||||
@@ -1,28 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>所有类 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 class="bar">所有类</h1>
|
||||
<div class="indexContainer">
|
||||
<ul>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口" target="classFrame"><i>CanalConnector</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类" target="classFrame">CanalConnectors</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口" target="classFrame"><i>CanalNodeAccessStrategy</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类" target="classFrame">ClientRunningData</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口" target="classFrame"><i>ClientRunningListener</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类" target="classFrame">ClientRunningMonitor</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">ClusterCanalConnector</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">ClusterNodeAccessStrategy</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">SimpleCanalConnector</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">SimpleNodeAccessStrategy</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,28 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>所有类 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 class="bar">所有类</h1>
|
||||
<div class="indexContainer">
|
||||
<ul>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><i>CanalConnector</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><i>CanalNodeAccessStrategy</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><i>ClientRunningListener</i></a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,518 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>CanalConnector (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="CanalConnector (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client</div>
|
||||
<h2 title="接口 CanalConnector" class="title">接口 CanalConnector</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已知实现类:</dt>
|
||||
<dd><a href="../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a>, <a href="../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public interface <span class="strong">CanalConnector</span></pre>
|
||||
<div class="block">canal数据操作客户端</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>zebin.xuzb @ 2012-6-19, jianghang</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">ack</a></strong>(long batchId)</code>
|
||||
<div class="block">进行 batch id 的确认。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">checkValid</a></strong>()</code>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
|
||||
几种case下链接不合法:
|
||||
1.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#connect()">connect</a></strong>()</code>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">disconnect</a></strong>()</code>
|
||||
<div class="block">释放链接</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int)">get</a></strong>(int batchSize)</code>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
|
||||
该方法返回的条件:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">getWithoutAck</a></strong>(int batchSize)</code>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">不指定 position 获取事件.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback()">rollback</a></strong>()</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">rollback</a></strong>(long batchId)</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">subscribe</a></strong>()</code>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">subscribe</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)</code>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
|
||||
说明:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">unsubscribe</a></strong>()</code>
|
||||
<div class="block">取消订阅</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="connect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>connect</h4>
|
||||
<pre>void connect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="disconnect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>disconnect</h4>
|
||||
<pre>void disconnect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">释放链接</div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="checkValid()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>checkValid</h4>
|
||||
<pre>boolean checkValid()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
<pre>
|
||||
几种case下链接不合法:
|
||||
1. 链接canal server失败,一直没有一个可用的链接,返回false
|
||||
2. 当前客户端在进行running抢占的时候,做为备份节点存在,非处于工作节点,返回false
|
||||
|
||||
说明:
|
||||
a. 当前客户端一旦做为备份节点存在,当前所有的对<a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的操作都会处于阻塞状态,直到转为工作节点
|
||||
b. 所以业务方最好定时调用checkValid()方法用,比如调用CanalConnector所在线程的interrupt,直接退出CanalConnector,并根据自己的需要退出自己的资源
|
||||
</pre></div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>void subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
<pre>
|
||||
说明:
|
||||
a. 如果本次订阅中filter信息为空,则直接使用canal server服务端配置的filter信息
|
||||
b. 如果本次订阅中filter信息不为空,目前会直接替换canal server服务端配置的filter信息,以本次提交的为准
|
||||
|
||||
TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表
|
||||
</pre></div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>clientIdentity</code> - </dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>void subscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>clientIdentity</code> - </dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="unsubscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>unsubscribe</h4>
|
||||
<pre>void unsubscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">取消订阅</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>clientIdentity</code> - </dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>com.alibaba.otter.canal.protocol.Message get(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>batchSize</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>com.alibaba.otter.canal.protocol.Message get(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre></div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>batchSize</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>batchSize</code> - </dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">不指定 position 获取事件.
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre>
|
||||
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>batchSize</code> - </dd><dd><code>timeout</code> - </dd><dd><code>unit</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="ack(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>ack</h4>
|
||||
<pre>void ack(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>batchId</code> - </dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>void rollback(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>void rollback()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,322 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>CanalConnectors (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="CanalConnectors (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalConnectors.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalConnectors.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnectors.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client</div>
|
||||
<h2 title="类 CanalConnectors" class="title">类 CanalConnectors</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.CanalConnectors</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">CanalConnectors</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></pre>
|
||||
<div class="block">canal connectors创建工具类</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-10-29 下午11:18:50</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#CanalConnectors()">CanalConnectors</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.util.List, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a><? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>> addresses,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> zkServers,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换,服务器列表自动扫描</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newSingleConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">newSingleConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建单链接的客户端链接</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="CanalConnectors()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>CanalConnectors</h4>
|
||||
<pre>public CanalConnectors()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="newSingleConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>newSingleConnector</h4>
|
||||
<pre>public static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a> newSingleConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</pre>
|
||||
<div class="block">创建单链接的客户端链接</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>address</code> - </dd><dd><code>username</code> - </dd><dd><code>password</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="newClusterConnector(java.util.List, java.lang.String, java.lang.String, java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>newClusterConnector</h4>
|
||||
<pre>public static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a> newClusterConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a><? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>> addresses,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</pre>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>addresses</code> - </dd><dd><code>username</code> - </dd><dd><code>password</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="newClusterConnector(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>newClusterConnector</h4>
|
||||
<pre>public static <a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a> newClusterConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> zkServers,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</pre>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换,服务器列表自动扫描</div>
|
||||
<dl><dt><span class="strong">参数:</span></dt><dd><code>username</code> - </dd><dd><code>password</code> - </dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalConnectors.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalConnectors.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnectors.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,217 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>CanalNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="CanalNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client</div>
|
||||
<h2 title="接口 CanalNodeAccessStrategy" class="title">接口 CanalNodeAccessStrategy</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已知实现类:</dt>
|
||||
<dd><a href="../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a>, <a href="../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public interface <span class="strong">CanalNodeAccessStrategy</span></pre>
|
||||
<div class="block">集群节点访问控制接口</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-10-29 下午07:55:41</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="nextNode()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>nextNode</h4>
|
||||
<pre><a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> nextNode()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/CanalNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,210 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>接口 com.alibaba.otter.canal.client.CanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="接口 com.alibaba.otter.canal.client.CanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="接口 com.alibaba.otter.canal.client.CanalConnector 的使用" class="title">接口 com.alibaba.otter.canal.client.CanalConnector<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client">com.alibaba.otter.canal.client</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>返回<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的<a href="../../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><span class="strong">CanalConnectors.</span><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.util.List, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a><? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>> addresses,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><span class="strong">CanalConnectors.</span><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> zkServers,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换,服务器列表自动扫描</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>static <a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></td>
|
||||
<td class="colLast"><span class="strong">CanalConnectors.</span><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnectors.html#newSingleConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">newSingleConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code>
|
||||
<div class="block">创建单链接的客户端链接</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span>实现<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>class </code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></strong></code>
|
||||
<div class="block">集群版本connector实现,自带了failover功能<br/></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>class </code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></strong></code>
|
||||
<div class="block">基于CanalServerWithNetty定义的网络协议接口,对于canal数据进行get/rollback/ack等操作</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.CanalConnectors的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.CanalConnectors的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalConnectors.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnectors.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.CanalConnectors 的使用" class="title">类 com.alibaba.otter.canal.client.CanalConnectors<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">没有com.alibaba.otter.canal.client.CanalConnectors的用法</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalConnectors.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalConnectors.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,205 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>接口 com.alibaba.otter.canal.client.CanalNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="接口 com.alibaba.otter.canal.client.CanalNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="接口 com.alibaba.otter.canal.client.CanalNodeAccessStrategy 的使用" class="title">接口 com.alibaba.otter.canal.client.CanalNodeAccessStrategy<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span>实现<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>class </code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></strong></code>
|
||||
<div class="block">集群模式的调度策略</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>class </code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></strong></code>
|
||||
<div class="block">简单版本的node访问实现</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>返回<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></code></td>
|
||||
<td class="colLast"><span class="strong">ClusterCanalConnector.</span><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getAccessStrategy()">getAccessStrategy</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>参数类型为<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><span class="strong">ClusterCanalConnector.</span><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setAccessStrategy(com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">setAccessStrategy</a></strong>(<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表构造器和解释">
|
||||
<caption><span>参数类型为<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#ClusterCanalConnector(java.lang.String, java.lang.String, java.lang.String, com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">ClusterCanalConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/class-use/CanalNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="CanalNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,786 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>ClusterCanalConnector (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="ClusterCanalConnector (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClusterCanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl</div>
|
||||
<h2 title="类 ClusterCanalConnector" class="title">类 ClusterCanalConnector</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.ClusterCanalConnector</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已实现的接口:</dt>
|
||||
<dd><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">ClusterCanalConnector</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a>
|
||||
implements <a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></pre>
|
||||
<div class="block">集群版本connector实现,自带了failover功能<br/></div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-10-29 下午08:04:06</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#ClusterCanalConnector(java.lang.String, java.lang.String, java.lang.String, com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">ClusterCanalConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#ack(long)">ack</a></strong>(long batchId)</code>
|
||||
<div class="block">进行 batch id 的确认。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#checkValid()">checkValid</a></strong>()</code>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
|
||||
几种case下链接不合法:
|
||||
1.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#connect()">connect</a></strong>()</code>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#disconnect()">disconnect</a></strong>()</code>
|
||||
<div class="block">释放链接</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#get(int)">get</a></strong>(int batchSize)</code>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
|
||||
该方法返回的条件:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getAccessStrategy()">getAccessStrategy</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getCurrentConnector()">getCurrentConnector</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getPassword()">getPassword</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>int</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getRetryInterval()">getRetryInterval</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>int</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getRetryTimes()">getRetryTimes</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>int</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getSoTimeout()">getSoTimeout</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getUsername()">getUsername</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getWithoutAck(int)">getWithoutAck</a></strong>(int batchSize)</code>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">不指定 position 获取事件.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#rollback()">rollback</a></strong>()</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#rollback(long)">rollback</a></strong>(long batchId)</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setAccessStrategy(com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">setAccessStrategy</a></strong>(<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setPassword(java.lang.String)">setPassword</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setRetryInterval(int)">setRetryInterval</a></strong>(int retryInterval)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setRetryTimes(int)">setRetryTimes</a></strong>(int retryTimes)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setSoTimeout(int)">setSoTimeout</a></strong>(int soTimeout)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setUsername(java.lang.String)">setUsername</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#subscribe()">subscribe</a></strong>()</code>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#subscribe(java.lang.String)">subscribe</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)</code>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
|
||||
说明:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#unsubscribe()">unsubscribe</a></strong>()</code>
|
||||
<div class="block">取消订阅</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="ClusterCanalConnector(java.lang.String, java.lang.String, java.lang.String, com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>ClusterCanalConnector</h4>
|
||||
<pre>public ClusterCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="connect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>connect</h4>
|
||||
<pre>public void connect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#connect()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#connect()">connect</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="checkValid()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>checkValid</h4>
|
||||
<pre>public boolean checkValid()</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
<pre>
|
||||
几种case下链接不合法:
|
||||
1. 链接canal server失败,一直没有一个可用的链接,返回false
|
||||
2. 当前客户端在进行running抢占的时候,做为备份节点存在,非处于工作节点,返回false
|
||||
|
||||
说明:
|
||||
a. 当前客户端一旦做为备份节点存在,当前所有的对<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的操作都会处于阻塞状态,直到转为工作节点
|
||||
b. 所以业务方最好定时调用checkValid()方法用,比如调用CanalConnector所在线程的interrupt,直接退出CanalConnector,并根据自己的需要退出自己的资源
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">checkValid</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="disconnect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>disconnect</h4>
|
||||
<pre>public void disconnect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">释放链接</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">disconnect</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>public void subscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">subscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>public void subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
<pre>
|
||||
说明:
|
||||
a. 如果本次订阅中filter信息为空,则直接使用canal server服务端配置的filter信息
|
||||
b. 如果本次订阅中filter信息不为空,目前会直接替换canal server服务端配置的filter信息,以本次提交的为准
|
||||
|
||||
TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">subscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="unsubscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>unsubscribe</h4>
|
||||
<pre>public void unsubscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">取消订阅</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">unsubscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message get(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int)">get</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message get(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">getWithoutAck</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">不指定 position 获取事件.
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre>
|
||||
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>public void rollback(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">rollback</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>public void rollback()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback()">rollback</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="ack(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>ack</h4>
|
||||
<pre>public void ack(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">ack</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getUsername()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getUsername</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> getUsername()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setUsername(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setUsername</h4>
|
||||
<pre>public void setUsername(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getPassword()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getPassword</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> getPassword()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setPassword(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setPassword</h4>
|
||||
<pre>public void setPassword(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getSoTimeout()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getSoTimeout</h4>
|
||||
<pre>public int getSoTimeout()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setSoTimeout(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setSoTimeout</h4>
|
||||
<pre>public void setSoTimeout(int soTimeout)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getRetryTimes()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getRetryTimes</h4>
|
||||
<pre>public int getRetryTimes()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setRetryTimes(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setRetryTimes</h4>
|
||||
<pre>public void setRetryTimes(int retryTimes)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getRetryInterval()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getRetryInterval</h4>
|
||||
<pre>public int getRetryInterval()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setRetryInterval(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setRetryInterval</h4>
|
||||
<pre>public void setRetryInterval(int retryInterval)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getAccessStrategy()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getAccessStrategy</h4>
|
||||
<pre>public <a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> getAccessStrategy()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setAccessStrategy(com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setAccessStrategy</h4>
|
||||
<pre>public void setAccessStrategy(<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a> accessStrategy)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getCurrentConnector()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>getCurrentConnector</h4>
|
||||
<pre>public <a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a> getCurrentConnector()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClusterCanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,300 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>ClusterNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="ClusterNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClusterNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl</div>
|
||||
<h2 title="类 ClusterNodeAccessStrategy" class="title">类 ClusterNodeAccessStrategy</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已实现的接口:</dt>
|
||||
<dd><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">ClusterNodeAccessStrategy</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a>
|
||||
implements <a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></pre>
|
||||
<div class="block">集群模式的调度策略</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-12-3 下午10:01:04</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#ClusterNodeAccessStrategy(java.lang.String, com.alibaba.otter.canal.common.zookeeper.ZkClientx)">ClusterNodeAccessStrategy</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.common.zookeeper.ZkClientx</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#getZkClient()">getZkClient</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#nextNode()">nextNode</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClient</a></strong>(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="ClusterNodeAccessStrategy(java.lang.String, com.alibaba.otter.canal.common.zookeeper.ZkClientx)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>ClusterNodeAccessStrategy</h4>
|
||||
<pre>public ClusterNodeAccessStrategy(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="nextNode()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>nextNode</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> nextNode()</pre>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setZkClient</h4>
|
||||
<pre>public void setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getZkClient()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>getZkClient</h4>
|
||||
<pre>public com.alibaba.otter.canal.common.zookeeper.ZkClientx getZkClient()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClusterNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,741 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>SimpleCanalConnector (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="SimpleCanalConnector (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/SimpleCanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl</div>
|
||||
<h2 title="类 SimpleCanalConnector" class="title">类 SimpleCanalConnector</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.SimpleCanalConnector</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已实现的接口:</dt>
|
||||
<dd><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">SimpleCanalConnector</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a>
|
||||
implements <a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></pre>
|
||||
<div class="block">基于CanalServerWithNetty定义的网络协议接口,对于canal数据进行get/rollback/ack等操作</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-10-24 下午05:37:20</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">SimpleCanalConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String, int)">SimpleCanalConnector</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
int soTimeout)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#ack(long)">ack</a></strong>(long batchId)</code>
|
||||
<div class="block">进行 batch id 的确认。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#checkValid()">checkValid</a></strong>()</code>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
|
||||
几种case下链接不合法:
|
||||
1.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#connect()">connect</a></strong>()</code>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#disconnect()">disconnect</a></strong>()</code>
|
||||
<div class="block">释放链接</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#get(int)">get</a></strong>(int batchSize)</code>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
|
||||
该方法返回的条件:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getAddress()">getAddress</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getPassword()">getPassword</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>int</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getSoTimeout()">getSoTimeout</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getUsername()">getUsername</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getWithoutAck(int)">getWithoutAck</a></strong>(int batchSize)</code>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>com.alibaba.otter.canal.protocol.Message</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck</a></strong>(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)</code>
|
||||
<div class="block">不指定 position 获取事件.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#rollback()">rollback</a></strong>()</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#rollback(long)">rollback</a></strong>(long batchId)</code>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setRollbackOnConnect(boolean)">setRollbackOnConnect</a></strong>(boolean rollbackOnConnect)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setRollbackOnDisConnect(boolean)">setRollbackOnDisConnect</a></strong>(boolean rollbackOnDisConnect)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setSoTimeout(int)">setSoTimeout</a></strong>(int soTimeout)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setZkClientx(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClientx</a></strong>(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClientx)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#subscribe()">subscribe</a></strong>()</code>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#subscribe(java.lang.String)">subscribe</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)</code>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
|
||||
说明:
|
||||
a.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#unsubscribe()">unsubscribe</a></strong>()</code>
|
||||
<div class="block">取消订阅</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>SimpleCanalConnector</h4>
|
||||
<pre>public SimpleCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String, int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>SimpleCanalConnector</h4>
|
||||
<pre>public SimpleCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> address,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> username,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> password,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination,
|
||||
int soTimeout)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="connect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>connect</h4>
|
||||
<pre>public void connect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#connect()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#connect()">connect</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="disconnect()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>disconnect</h4>
|
||||
<pre>public void disconnect()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">释放链接</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">disconnect</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>public void subscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">subscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="subscribe(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>subscribe</h4>
|
||||
<pre>public void subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> filter)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
<pre>
|
||||
说明:
|
||||
a. 如果本次订阅中filter信息为空,则直接使用canal server服务端配置的filter信息
|
||||
b. 如果本次订阅中filter信息不为空,目前会直接替换canal server服务端配置的filter信息,以本次提交的为准
|
||||
|
||||
TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">subscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="unsubscribe()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>unsubscribe</h4>
|
||||
<pre>public void unsubscribe()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">取消订阅</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">unsubscribe</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message get(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int)">get</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="get(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>get</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message get(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">getWithoutAck</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getWithoutAck</h4>
|
||||
<pre>public com.alibaba.otter.canal.protocol.Message getWithoutAck(int batchSize,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a> timeout,
|
||||
<a href="http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="java.util.concurrent中的类或接口">TimeUnit</a> unit)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">不指定 position 获取事件.
|
||||
|
||||
<pre>
|
||||
该方法返回的条件:
|
||||
a. 拿够batchSize条记录或者超过timeout时间
|
||||
b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
</pre>
|
||||
|
||||
canal 会记住此 client 最新的position。 <br/>
|
||||
如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">返回:</span></dt><dd></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="ack(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>ack</h4>
|
||||
<pre>public void ack(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">ack</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback(long)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>public void rollback(long batchId)
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">CanalConnector</a></code></strong></div>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">rollback</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="rollback()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>rollback</h4>
|
||||
<pre>public void rollback()
|
||||
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#rollback()">rollback</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
<dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code>com.alibaba.otter.canal.protocol.exception.CanalClientException</code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="checkValid()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>checkValid</h4>
|
||||
<pre>public boolean checkValid()</pre>
|
||||
<div class="block"><strong>从接口复制的说明: <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">CanalConnector</a></code></strong></div>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
<pre>
|
||||
几种case下链接不合法:
|
||||
1. 链接canal server失败,一直没有一个可用的链接,返回false
|
||||
2. 当前客户端在进行running抢占的时候,做为备份节点存在,非处于工作节点,返回false
|
||||
|
||||
说明:
|
||||
a. 当前客户端一旦做为备份节点存在,当前所有的对<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>的操作都会处于阻塞状态,直到转为工作节点
|
||||
b. 所以业务方最好定时调用checkValid()方法用,比如调用CanalConnector所在线程的interrupt,直接退出CanalConnector,并根据自己的需要退出自己的资源
|
||||
</pre></div>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">checkValid</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getAddress()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getAddress</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> getAddress()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getUsername()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getUsername</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> getUsername()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getPassword()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getPassword</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> getPassword()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getSoTimeout()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getSoTimeout</h4>
|
||||
<pre>public int getSoTimeout()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setSoTimeout(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setSoTimeout</h4>
|
||||
<pre>public void setSoTimeout(int soTimeout)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setZkClientx(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setZkClientx</h4>
|
||||
<pre>public void setZkClientx(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClientx)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setRollbackOnConnect(boolean)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setRollbackOnConnect</h4>
|
||||
<pre>public void setRollbackOnConnect(boolean rollbackOnConnect)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setRollbackOnDisConnect(boolean)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>setRollbackOnDisConnect</h4>
|
||||
<pre>public void setRollbackOnDisConnect(boolean rollbackOnDisConnect)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/SimpleCanalConnector.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,272 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>SimpleNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="SimpleNodeAccessStrategy (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/SimpleNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl</div>
|
||||
<h2 title="类 SimpleNodeAccessStrategy" class="title">类 SimpleNodeAccessStrategy</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已实现的接口:</dt>
|
||||
<dd><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">SimpleNodeAccessStrategy</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a>
|
||||
implements <a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></pre>
|
||||
<div class="block">简单版本的node访问实现</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-10-29 下午08:00:23</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html#SimpleNodeAccessStrategy(java.util.List)">SimpleNodeAccessStrategy</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a><? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>> nodes)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html#nextNode()">nextNode</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="SimpleNodeAccessStrategy(java.util.List)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>SimpleNodeAccessStrategy</h4>
|
||||
<pre>public SimpleNodeAccessStrategy(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a><? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>> nodes)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="nextNode()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>nextNode</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a> nextNode()</pre>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode</a></code> 在接口中 <code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/SimpleNodeAccessStrategy.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.ClusterCanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.ClusterCanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/ClusterCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.ClusterCanalConnector 的使用" class="title">类 com.alibaba.otter.canal.client.impl.ClusterCanalConnector<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">没有com.alibaba.otter.canal.client.impl.ClusterCanalConnector的用法</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/ClusterCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/ClusterNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy 的使用" class="title">类 com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">没有com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy的用法</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/ClusterNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="ClusterNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-157
@@ -1,157 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.SimpleCanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.SimpleCanalConnector的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/SimpleCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.SimpleCanalConnector 的使用" class="title">类 com.alibaba.otter.canal.client.impl.SimpleCanalConnector<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中<a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>返回<a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a>的<a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></code></td>
|
||||
<td class="colLast"><span class="strong">ClusterCanalConnector.</span><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getCurrentConnector()">getCurrentConnector</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/SimpleCanalConnector.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleCanalConnector.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/SimpleNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy 的使用" class="title">类 com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">没有com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy的用法</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/class-use/SimpleNodeAccessStrategy.html" target="_top">框架</a></li>
|
||||
<li><a href="SimpleNodeAccessStrategy.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,23 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 class="bar"><a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html" target="classFrame">com.alibaba.otter.canal.client.impl</a></h1>
|
||||
<div class="indexContainer">
|
||||
<h2 title="类">类</h2>
|
||||
<ul title="类">
|
||||
<li><a href="ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">ClusterCanalConnector</a></li>
|
||||
<li><a href="ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">ClusterNodeAccessStrategy</a></li>
|
||||
<li><a href="SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">SimpleCanalConnector</a></li>
|
||||
<li><a href="SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类" target="classFrame">SimpleNodeAccessStrategy</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,155 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client.impl (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/package-summary.html">上一个程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">下一个程序包</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包" class="title">程序包 com.alibaba.otter.canal.client.impl</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="类概要表, 列表类和解释">
|
||||
<caption><span>类概要</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">类</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">集群版本connector实现,自带了failover功能<br/></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">集群模式的调度策略</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">基于CanalServerWithNetty定义的网络协议接口,对于canal数据进行get/rollback/ack等操作</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">简单版本的node访问实现</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/package-summary.html">上一个程序包</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">下一个程序包</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,133 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client.impl 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/package-tree.html">上一个</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/running/package-tree.html">下一个</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 class="title">程序包com.alibaba.otter.canal.client.impl的分层结构</h1>
|
||||
<span class="strong">程序包分层结构:</span>
|
||||
<ul class="horizontal">
|
||||
<li><a href="../../../../../../overview-tree.html">所有程序包</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<h2 title="类分层结构">类分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口"><span class="strong">Object</span></a>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterCanalConnector</span></a> (implements com.alibaba.otter.canal.client.<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="../../../../../../com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterNodeAccessStrategy</span></a> (implements com.alibaba.otter.canal.client.<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleCanalConnector</span></a> (implements com.alibaba.otter.canal.client.<a href="../../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleNodeAccessStrategy</span></a> (implements com.alibaba.otter.canal.client.<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/package-tree.html">上一个</a></li>
|
||||
<li><a href="../../../../../../com/alibaba/otter/canal/client/impl/running/package-tree.html">下一个</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,152 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>程序包 com.alibaba.otter.canal.client.impl的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="程序包 com.alibaba.otter.canal.client.impl的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包 com.alibaba.otter.canal.client.impl 的使用" class="title">程序包 com.alibaba.otter.canal.client.impl<br>的使用</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl">
|
||||
<!-- -->
|
||||
</a>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span><a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>使用的<a href="../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><a href="../../../../../../com/alibaba/otter/canal/client/impl/class-use/SimpleCanalConnector.html#com.alibaba.otter.canal.client.impl">SimpleCanalConnector</a>
|
||||
<div class="block">基于CanalServerWithNetty定义的网络协议接口,对于canal数据进行get/rollback/ack等操作</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../index.html?com/alibaba/otter/canal/client/impl/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,328 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>ClientRunningData (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="ClientRunningData (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningData.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningData.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl.running</div>
|
||||
<h2 title="类 ClientRunningData" class="title">类 ClientRunningData</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.running.ClientRunningData</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">ClientRunningData</span>
|
||||
extends <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></pre>
|
||||
<div class="block">client running状态信息</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-11-22 下午03:41:50</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#ClientRunningData()">ClientRunningData</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#getAddress()">getAddress</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>short</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#getClientId()">getClientId</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#isActive()">isActive</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setActive(boolean)">setActive</a></strong>(boolean active)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setAddress(java.lang.String)">setAddress</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> address)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setClientId(short)">setClientId</a></strong>(short clientId)</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="ClientRunningData()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>ClientRunningData</h4>
|
||||
<pre>public ClientRunningData()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="getClientId()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getClientId</h4>
|
||||
<pre>public short getClientId()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setClientId(short)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setClientId</h4>
|
||||
<pre>public void setClientId(short clientId)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="getAddress()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>getAddress</h4>
|
||||
<pre>public <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> getAddress()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setAddress(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setAddress</h4>
|
||||
<pre>public void setAddress(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> address)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="isActive()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>isActive</h4>
|
||||
<pre>public boolean isActive()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setActive(boolean)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>setActive</h4>
|
||||
<pre>public void setActive(boolean active)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningData.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个类</li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningData.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-232
@@ -1,232 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>ClientRunningListener (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="ClientRunningListener (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningListener.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningListener.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl.running</div>
|
||||
<h2 title="接口 ClientRunningListener" class="title">接口 ClientRunningListener</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public interface <span class="strong">ClientRunningListener</span></pre>
|
||||
<div class="block">触发一下mainstem发生切换</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-9-11 下午02:26:03</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code><a href="http://docs.oracle.com/javase/6/docs/api/java/net/InetSocketAddress.html?is-external=true" title="java.net中的类或接口">InetSocketAddress</a></code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html#processActiveEnter()">processActiveEnter</a></strong>()</code>
|
||||
<div class="block">触发现在轮到自己做为active,需要载入上一个active的上下文数据</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html#processActiveExit()">processActiveExit</a></strong>()</code>
|
||||
<div class="block">触发一下当前active模式失败</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="processActiveEnter()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>processActiveEnter</h4>
|
||||
<pre><a href="http://docs.oracle.com/javase/6/docs/api/java/net/InetSocketAddress.html?is-external=true" title="java.net中的类或接口">InetSocketAddress</a> processActiveEnter()</pre>
|
||||
<div class="block">触发现在轮到自己做为active,需要载入上一个active的上下文数据</div>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="processActiveExit()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>processActiveExit</h4>
|
||||
<pre>void processActiveExit()</pre>
|
||||
<div class="block">触发一下当前active模式失败</div>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningListener.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">上一个类</span></a></li>
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">下一个类</span></a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningListener.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li>构造器 | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,430 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>ClientRunningMonitor (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="ClientRunningMonitor (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningMonitor.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningMonitor.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<!-- ======== START OF CLASS DATA ======== -->
|
||||
<div class="header">
|
||||
<div class="subTitle">com.alibaba.otter.canal.client.impl.running</div>
|
||||
<h2 title="类 ClientRunningMonitor" class="title">类 ClientRunningMonitor</h2>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="inheritance">
|
||||
<li><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">java.lang.Object</a></li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.common.AbstractCanalLifeCycle</li>
|
||||
<li>
|
||||
<ul class="inheritance">
|
||||
<li>com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="description">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<dl>
|
||||
<dt>所有已实现的接口:</dt>
|
||||
<dd>com.alibaba.otter.canal.common.CanalLifeCycle</dd>
|
||||
</dl>
|
||||
<hr>
|
||||
<br>
|
||||
<pre>public class <span class="strong">ClientRunningMonitor</span>
|
||||
extends com.alibaba.otter.canal.common.AbstractCanalLifeCycle</pre>
|
||||
<div class="block">clinet running控制</div>
|
||||
<dl><dt><span class="strong">版本:</span></dt>
|
||||
<dd>1.0.0</dd>
|
||||
<dt><span class="strong">作者:</span></dt>
|
||||
<dd>jianghang 2012-11-22 下午03:43:01</dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="summary">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="构造器概要表, 列表构造器和解释">
|
||||
<caption><span>构造器</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">构造器和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#ClientRunningMonitor()">ClientRunningMonitor</a></strong>()</code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ========== METHOD SUMMARY =========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_summary">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法概要</h3>
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="方法概要表, 列表方法和解释">
|
||||
<caption><span>方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#check()">check</a></strong>()</code>
|
||||
<div class="block">检查当前的状态</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#initRunning()">initRunning</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>boolean</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#releaseRunning()">releaseRunning</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setClientData(com.alibaba.otter.canal.client.impl.running.ClientRunningData)">setClientData</a></strong>(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a> clientData)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setDelayTime(int)">setDelayTime</a></strong>(int delayTime)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setDestination(java.lang.String)">setDestination</a></strong>(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setListener(com.alibaba.otter.canal.client.impl.running.ClientRunningListener)">setListener</a></strong>(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a> listener)</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClient</a></strong>(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#start()">start</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#stop()">stop</a></strong>()</code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><code><strong><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#waitForActive()">waitForActive</a></strong>()</code>
|
||||
<div class="block">阻塞等待自己成为active,如果自己成为active,立马返回</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_com.alibaba.otter.canal.common.AbstractCanalLifeCycle">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 com.alibaba.otter.canal.common.AbstractCanalLifeCycle</h3>
|
||||
<code>isStart</code></li>
|
||||
</ul>
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>从类继承的方法 java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口">Object</a></h3>
|
||||
<code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="java.lang中的类或接口">equals</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#getClass()" title="java.lang中的类或接口">getClass</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="java.lang中的类或接口">hashCode</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notify()" title="java.lang中的类或接口">notify</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="java.lang中的类或接口">notifyAll</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#toString()" title="java.lang中的类或接口">toString</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait()" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="java.lang中的类或接口">wait</a>, <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true#wait(long, int)" title="java.lang中的类或接口">wait</a></code></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="details">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<!-- ========= CONSTRUCTOR DETAIL ======== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="constructor_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>构造器详细资料</h3>
|
||||
<a name="ClientRunningMonitor()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>ClientRunningMonitor</h4>
|
||||
<pre>public ClientRunningMonitor()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- ============ METHOD DETAIL ========== -->
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="method_detail">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3>方法详细资料</h3>
|
||||
<a name="start()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>start</h4>
|
||||
<pre>public void start()</pre>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code>start</code> 在接口中 <code>com.alibaba.otter.canal.common.CanalLifeCycle</code></dd>
|
||||
<dt><strong>覆盖:</strong></dt>
|
||||
<dd><code>start</code> 在类中 <code>com.alibaba.otter.canal.common.AbstractCanalLifeCycle</code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="stop()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>stop</h4>
|
||||
<pre>public void stop()</pre>
|
||||
<dl>
|
||||
<dt><strong>指定者:</strong></dt>
|
||||
<dd><code>stop</code> 在接口中 <code>com.alibaba.otter.canal.common.CanalLifeCycle</code></dd>
|
||||
<dt><strong>覆盖:</strong></dt>
|
||||
<dd><code>stop</code> 在类中 <code>com.alibaba.otter.canal.common.AbstractCanalLifeCycle</code></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="initRunning()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>initRunning</h4>
|
||||
<pre>public void initRunning()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="waitForActive()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>waitForActive</h4>
|
||||
<pre>public void waitForActive()
|
||||
throws <a href="http://docs.oracle.com/javase/6/docs/api/java/lang/InterruptedException.html?is-external=true" title="java.lang中的类或接口">InterruptedException</a></pre>
|
||||
<div class="block">阻塞等待自己成为active,如果自己成为active,立马返回</div>
|
||||
<dl><dt><span class="strong">抛出:</span></dt>
|
||||
<dd><code><a href="http://docs.oracle.com/javase/6/docs/api/java/lang/InterruptedException.html?is-external=true" title="java.lang中的类或接口">InterruptedException</a></code></dd></dl>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="check()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>check</h4>
|
||||
<pre>public boolean check()</pre>
|
||||
<div class="block">检查当前的状态</div>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="releaseRunning()">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>releaseRunning</h4>
|
||||
<pre>public boolean releaseRunning()</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setListener(com.alibaba.otter.canal.client.impl.running.ClientRunningListener)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setListener</h4>
|
||||
<pre>public void setListener(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a> listener)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setDestination(java.lang.String)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setDestination</h4>
|
||||
<pre>public void setDestination(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a> destination)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setClientData(com.alibaba.otter.canal.client.impl.running.ClientRunningData)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setClientData</h4>
|
||||
<pre>public void setClientData(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a> clientData)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setDelayTime(int)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>setDelayTime</h4>
|
||||
<pre>public void setDelayTime(int delayTime)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockListLast">
|
||||
<li class="blockList">
|
||||
<h4>setZkClient</h4>
|
||||
<pre>public void setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx zkClient)</pre>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ========= END OF CLASS DATA ========= -->
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li class="navBarCell1Rev">类</li>
|
||||
<li><a href="class-use/ClientRunningMonitor.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">上一个类</span></a></li>
|
||||
<li>下一个类</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningMonitor.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<div>
|
||||
<ul class="subNavList">
|
||||
<li>概要: </li>
|
||||
<li>嵌套 | </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_summary">构造器</a> | </li>
|
||||
<li><a href="#method_summary">方法</a></li>
|
||||
</ul>
|
||||
<ul class="subNavList">
|
||||
<li>详细资料: </li>
|
||||
<li>字段 | </li>
|
||||
<li><a href="#constructor_detail">构造器</a> | </li>
|
||||
<li><a href="#method_detail">方法</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-157
@@ -1,157 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.running.ClientRunningData的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.running.ClientRunningData的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningData.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningData.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.running.ClientRunningData 的使用" class="title">类 com.alibaba.otter.canal.client.impl.running.ClientRunningData<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl.running">com.alibaba.otter.canal.client.impl.running</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl.running">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>参数类型为<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a>的<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><span class="strong">ClientRunningMonitor.</span><code><strong><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setClientData(com.alibaba.otter.canal.client.impl.running.ClientRunningData)">setClientData</a></strong>(<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a> clientData)</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningData.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningData.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-157
@@ -1,157 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>接口 com.alibaba.otter.canal.client.impl.running.ClientRunningListener的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="接口 com.alibaba.otter.canal.client.impl.running.ClientRunningListener的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningListener.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningListener.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="接口 com.alibaba.otter.canal.client.impl.running.ClientRunningListener 的使用" class="title">接口 com.alibaba.otter.canal.client.impl.running.ClientRunningListener<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl.running">com.alibaba.otter.canal.client.impl.running</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<ul class="blockList">
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl.running">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h3><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a>的使用</h3>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表方法和解释">
|
||||
<caption><span>参数类型为<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a>的<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的方法</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">限定符和类型</th>
|
||||
<th class="colLast" scope="col">方法和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><code>void</code></td>
|
||||
<td class="colLast"><span class="strong">ClientRunningMonitor.</span><code><strong><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setListener(com.alibaba.otter.canal.client.impl.running.ClientRunningListener)">setListener</a></strong>(<a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a> listener)</code> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningListener.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningListener.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
-117
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类 com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类 com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningMonitor.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningMonitor.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h2 title="类 com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor 的使用" class="title">类 com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor<br>的使用</h2>
|
||||
</div>
|
||||
<div class="classUseContainer">没有com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor的用法</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="../package-summary.html">程序包</a></li>
|
||||
<li><a href="../../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">类</a></li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="../package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningMonitor.html" target="_top">框架</a></li>
|
||||
<li><a href="ClientRunningMonitor.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,25 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl.running (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 class="bar"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html" target="classFrame">com.alibaba.otter.canal.client.impl.running</a></h1>
|
||||
<div class="indexContainer">
|
||||
<h2 title="接口">接口</h2>
|
||||
<ul title="接口">
|
||||
<li><a href="ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口" target="classFrame"><i>ClientRunningListener</i></a></li>
|
||||
</ul>
|
||||
<h2 title="类">类</h2>
|
||||
<ul title="类">
|
||||
<li><a href="ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类" target="classFrame">ClientRunningData</a></li>
|
||||
<li><a href="ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类" target="classFrame">ClientRunningMonitor</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,160 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl.running (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client.impl.running (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">上一个程序包</a></li>
|
||||
<li>下一个程序包</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包" class="title">程序包 com.alibaba.otter.canal.client.impl.running</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="接口概要表, 列表接口和解释">
|
||||
<caption><span>接口概要</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">接口</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">触发一下mainstem发生切换</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="类概要表, 列表类和解释">
|
||||
<caption><span>类概要</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">类</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">client running状态信息</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">clinet running控制</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">上一个程序包</a></li>
|
||||
<li>下一个程序包</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,139 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client.impl.running 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client.impl.running 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-tree.html">上一个</a></li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 class="title">程序包com.alibaba.otter.canal.client.impl.running的分层结构</h1>
|
||||
<span class="strong">程序包分层结构:</span>
|
||||
<ul class="horizontal">
|
||||
<li><a href="../../../../../../../overview-tree.html">所有程序包</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<h2 title="类分层结构">类分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口"><span class="strong">Object</span></a>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.common.AbstractCanalLifeCycle (implements com.alibaba.otter.canal.common.CanalLifeCycle)
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningMonitor</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningData</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 title="接口分层结构">接口分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">ClientRunningListener</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../com/alibaba/otter/canal/client/impl/package-tree.html">上一个</a></li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,157 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>程序包 com.alibaba.otter.canal.client.impl.running的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="程序包 com.alibaba.otter.canal.client.impl.running的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包 com.alibaba.otter.canal.client.impl.running 的使用" class="title">程序包 com.alibaba.otter.canal.client.impl.running<br>的使用</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl.running">com.alibaba.otter.canal.client.impl.running</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl.running">
|
||||
<!-- -->
|
||||
</a>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>使用的<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningData.html#com.alibaba.otter.canal.client.impl.running">ClientRunningData</a>
|
||||
<div class="block">client running状态信息</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/class-use/ClientRunningListener.html#com.alibaba.otter.canal.client.impl.running">ClientRunningListener</a>
|
||||
<div class="block">触发一下mainstem发生切换</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../../../index.html?com/alibaba/otter/canal/client/impl/running/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,25 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 class="bar"><a href="../../../../../com/alibaba/otter/canal/client/package-summary.html" target="classFrame">com.alibaba.otter.canal.client</a></h1>
|
||||
<div class="indexContainer">
|
||||
<h2 title="接口">接口</h2>
|
||||
<ul title="接口">
|
||||
<li><a href="CanalConnector.html" title="com.alibaba.otter.canal.client中的接口" target="classFrame"><i>CanalConnector</i></a></li>
|
||||
<li><a href="CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口" target="classFrame"><i>CanalNodeAccessStrategy</i></a></li>
|
||||
</ul>
|
||||
<h2 title="类">类</h2>
|
||||
<ul title="类">
|
||||
<li><a href="CanalConnectors.html" title="com.alibaba.otter.canal.client中的类" target="classFrame">CanalConnectors</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,160 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个程序包</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">下一个程序包</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包" class="title">程序包 com.alibaba.otter.canal.client</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="接口概要表, 列表接口和解释">
|
||||
<caption><span>接口概要</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">接口</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">canal数据操作客户端</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">集群节点访问控制接口</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList">
|
||||
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="类概要表, 列表类和解释">
|
||||
<caption><span>类概要</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">类</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></td>
|
||||
<td class="colLast">
|
||||
<div class="block">canal connectors创建工具类</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li class="navBarCell1Rev">程序包</li>
|
||||
<li>类</li>
|
||||
<li><a href="package-use.html">使用</a></li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个程序包</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">下一个程序包</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="package-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,135 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>com.alibaba.otter.canal.client 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="com.alibaba.otter.canal.client 类分层结构 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/impl/package-tree.html">下一个</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 class="title">程序包com.alibaba.otter.canal.client的分层结构</h1>
|
||||
<span class="strong">程序包分层结构:</span>
|
||||
<ul class="horizontal">
|
||||
<li><a href="../../../../../overview-tree.html">所有程序包</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<h2 title="类分层结构">类分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口"><span class="strong">Object</span></a>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="../../../../../com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">CanalConnectors</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 title="接口分层结构">接口分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalConnector</span></a></li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalNodeAccessStrategy</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li><a href="../../../../../com/alibaba/otter/canal/client/impl/package-tree.html">下一个</a></li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="package-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,178 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>程序包 com.alibaba.otter.canal.client的使用 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="程序包 com.alibaba.otter.canal.client的使用 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="程序包 com.alibaba.otter.canal.client 的使用" class="title">程序包 com.alibaba.otter.canal.client<br>的使用</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表程序包和解释">
|
||||
<caption><span>使用<a href="../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>的程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client">com.alibaba.otter.canal.client</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="#com.alibaba.otter.canal.client.impl">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client">
|
||||
<!-- -->
|
||||
</a>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span><a href="../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>使用的<a href="../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><a href="../../../../../com/alibaba/otter/canal/client/class-use/CanalConnector.html#com.alibaba.otter.canal.client">CanalConnector</a>
|
||||
<div class="block">canal数据操作客户端</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
<li class="blockList"><a name="com.alibaba.otter.canal.client.impl">
|
||||
<!-- -->
|
||||
</a>
|
||||
<table border="0" cellpadding="3" cellspacing="0" summary="使用表, 列表类和解释">
|
||||
<caption><span><a href="../../../../../com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>使用的<a href="../../../../../com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的类</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colOne" scope="col">类和说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><a href="../../../../../com/alibaba/otter/canal/client/class-use/CanalConnector.html#com.alibaba.otter.canal.client.impl">CanalConnector</a>
|
||||
<div class="block">canal数据操作客户端</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><a href="../../../../../com/alibaba/otter/canal/client/class-use/CanalNodeAccessStrategy.html#com.alibaba.otter.canal.client.impl">CanalNodeAccessStrategy</a>
|
||||
<div class="block">集群节点访问控制接口</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="../../../../../overview-summary.html">概览</a></li>
|
||||
<li><a href="package-summary.html">程序包</a></li>
|
||||
<li>类</li>
|
||||
<li class="navBarCell1Rev">使用</li>
|
||||
<li><a href="package-tree.html">树</a></li>
|
||||
<li><a href="../../../../../deprecated-list.html">已过时</a></li>
|
||||
<li><a href="../../../../../index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="../../../../../index.html?com/alibaba/otter/canal/client/package-use.html" target="_top">框架</a></li>
|
||||
<li><a href="package-use.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="../../../../../allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>常量字段值 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="常量字段值 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?constant-values.html" target="_top">框架</a></li>
|
||||
<li><a href="constant-values.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="常量字段值" class="title">常量字段值</h1>
|
||||
<h2 title="目录">目录</h2>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?constant-values.html" target="_top">框架</a></li>
|
||||
<li><a href="constant-values.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>已过时的列表 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="已过时的列表 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li class="navBarCell1Rev">已过时</li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?deprecated-list.html" target="_top">框架</a></li>
|
||||
<li><a href="deprecated-list.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 title="已过时的 API" class="title">已过时的 API</h1>
|
||||
<h2 title="目录">目录</h2>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li class="navBarCell1Rev">已过时</li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?deprecated-list.html" target="_top">框架</a></li>
|
||||
<li><a href="deprecated-list.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,469 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>索引 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="./stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="索引 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="./overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="./overview-tree.html">树</a></li>
|
||||
<li><a href="./deprecated-list.html">已过时</a></li>
|
||||
<li class="navBarCell1Rev">索引</li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="./index.html?index-all.html" target="_top">框架</a></li>
|
||||
<li><a href="index-all.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="./allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="contentContainer"><a href="#_A_">A</a> <a href="#_C_">C</a> <a href="#_D_">D</a> <a href="#_G_">G</a> <a href="#_I_">I</a> <a href="#_N_">N</a> <a href="#_P_">P</a> <a href="#_R_">R</a> <a href="#_S_">S</a> <a href="#_U_">U</a> <a href="#_W_">W</a> <a name="_A_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">A</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#ack(long)">ack(long)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">进行 batch id 的确认。</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#ack(long)">ack(long)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#ack(long)">ack(long)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_C_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">C</h2>
|
||||
<dl>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalConnector</span></a> - <a href="./com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的接口</dt>
|
||||
<dd>
|
||||
<div class="block">canal数据操作客户端</div>
|
||||
</dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">CanalConnectors</span></a> - <a href="./com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">canal connectors创建工具类</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnectors.html#CanalConnectors()">CanalConnectors()</a></span> - 类 的构造器com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalNodeAccessStrategy</span></a> - <a href="./com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a>中的接口</dt>
|
||||
<dd>
|
||||
<div class="block">集群节点访问控制接口</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#check()">check()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd>
|
||||
<div class="block">检查当前的状态</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#checkValid()">checkValid()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">检查下链接是否合法
|
||||
|
||||
|
||||
几种case下链接不合法:
|
||||
1.</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#checkValid()">checkValid()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#checkValid()">checkValid()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningData</span></a> - <a href="./com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">client running状态信息</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#ClientRunningData()">ClientRunningData()</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">ClientRunningListener</span></a> - <a href="./com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的接口</dt>
|
||||
<dd>
|
||||
<div class="block">触发一下mainstem发生切换</div>
|
||||
</dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningMonitor</span></a> - <a href="./com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">clinet running控制</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#ClientRunningMonitor()">ClientRunningMonitor()</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterCanalConnector</span></a> - <a href="./com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">集群版本connector实现,自带了failover功能<br/></div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#ClusterCanalConnector(java.lang.String, java.lang.String, java.lang.String, com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">ClusterCanalConnector(String, String, String, CanalNodeAccessStrategy)</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterNodeAccessStrategy</span></a> - <a href="./com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">集群模式的调度策略</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#ClusterNodeAccessStrategy(java.lang.String, com.alibaba.otter.canal.common.zookeeper.ZkClientx)">ClusterNodeAccessStrategy(String, ZkClientx)</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a> - 程序包 com.alibaba.otter.canal.client</dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a> - 程序包 com.alibaba.otter.canal.client.impl</dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a> - 程序包 com.alibaba.otter.canal.client.impl.running</dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#connect()">connect()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">链接对应的canal server</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#connect()">connect()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#connect()">connect()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_D_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">D</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#disconnect()">disconnect()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">释放链接</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#disconnect()">disconnect()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#disconnect()">disconnect()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_G_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">G</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#get(int)">get(int)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get(int, Long, TimeUnit)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">获取数据,自动进行确认
|
||||
|
||||
|
||||
该方法返回的条件:
|
||||
a.</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#get(int)">get(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get(int, Long, TimeUnit)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#get(int)">get(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#get(int, java.lang.Long, java.util.concurrent.TimeUnit)">get(int, Long, TimeUnit)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getAccessStrategy()">getAccessStrategy()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#getAddress()">getAddress()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getAddress()">getAddress()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#getClientId()">getClientId()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getCurrentConnector()">getCurrentConnector()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getPassword()">getPassword()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getPassword()">getPassword()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getRetryInterval()">getRetryInterval()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getRetryTimes()">getRetryTimes()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getSoTimeout()">getSoTimeout()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getSoTimeout()">getSoTimeout()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getUsername()">getUsername()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getUsername()">getUsername()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int)">getWithoutAck(int)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
canal 会记住此 client 最新的position。</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck(int, Long, TimeUnit)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">不指定 position 获取事件.</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getWithoutAck(int)">getWithoutAck(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck(int, Long, TimeUnit)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getWithoutAck(int)">getWithoutAck(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#getWithoutAck(int, java.lang.Long, java.util.concurrent.TimeUnit)">getWithoutAck(int, Long, TimeUnit)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#getZkClient()">getZkClient()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_I_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">I</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#initRunning()">initRunning()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#isActive()">isActive()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_N_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">N</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.util.List, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector(List<? extends SocketAddress>, String, String, String)</a></span> - 类 中的静态方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></dt>
|
||||
<dd>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnectors.html#newClusterConnector(java.lang.String, java.lang.String, java.lang.String, java.lang.String)">newClusterConnector(String, String, String, String)</a></span> - 类 中的静态方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></dt>
|
||||
<dd>
|
||||
<div class="block">创建带cluster模式的客户端链接,自动完成failover切换,服务器列表自动扫描</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnectors.html#newSingleConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">newSingleConnector(SocketAddress, String, String, String)</a></span> - 类 中的静态方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类">CanalConnectors</a></dt>
|
||||
<dd>
|
||||
<div class="block">创建单链接的客户端链接</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#nextNode()">nextNode()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html#nextNode()">nextNode()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_P_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">P</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html#processActiveEnter()">processActiveEnter()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a></dt>
|
||||
<dd>
|
||||
<div class="block">触发现在轮到自己做为active,需要载入上一个active的上下文数据</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html#processActiveExit()">processActiveExit()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a></dt>
|
||||
<dd>
|
||||
<div class="block">触发一下当前active模式失败</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<a name="_R_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">R</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#releaseRunning()">releaseRunning()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#rollback(long)">rollback(long)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,指定回滚具体的batchId</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#rollback()">rollback()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">回滚到未进行 <code>ack</code> 的地方,下次fetch的时候,可以从最后一个没有 <code>ack</code> 的地方开始拿</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#rollback(long)">rollback(long)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#rollback()">rollback()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#rollback(long)">rollback(long)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#rollback()">rollback()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_S_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">S</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setAccessStrategy(com.alibaba.otter.canal.client.CanalNodeAccessStrategy)">setAccessStrategy(CanalNodeAccessStrategy)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setActive(boolean)">setActive(boolean)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setAddress(java.lang.String)">setAddress(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setClientData(com.alibaba.otter.canal.client.impl.running.ClientRunningData)">setClientData(ClientRunningData)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html#setClientId(short)">setClientId(short)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setDelayTime(int)">setDelayTime(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setDestination(java.lang.String)">setDestination(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setListener(com.alibaba.otter.canal.client.impl.running.ClientRunningListener)">setListener(ClientRunningListener)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setPassword(java.lang.String)">setPassword(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setRetryInterval(int)">setRetryInterval(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setRetryTimes(int)">setRetryTimes(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setRollbackOnConnect(boolean)">setRollbackOnConnect(boolean)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setRollbackOnDisConnect(boolean)">setRollbackOnDisConnect(boolean)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setSoTimeout(int)">setSoTimeout(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setSoTimeout(int)">setSoTimeout(int)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#setUsername(java.lang.String)">setUsername(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html#setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClient(ZkClientx)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClient(ZkClientx)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#setZkClientx(com.alibaba.otter.canal.common.zookeeper.ZkClientx)">setZkClientx(ZkClientx)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleCanalConnector</span></a> - <a href="./com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">基于CanalServerWithNetty定义的网络协议接口,对于canal数据进行get/rollback/ack等操作</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String)">SimpleCanalConnector(SocketAddress, String, String, String)</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#SimpleCanalConnector(java.net.SocketAddress, java.lang.String, java.lang.String, java.lang.String, int)">SimpleCanalConnector(SocketAddress, String, String, String, int)</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><a href="./com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleNodeAccessStrategy</span></a> - <a href="./com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a>中的类</dt>
|
||||
<dd>
|
||||
<div class="block">简单版本的node访问实现</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html#SimpleNodeAccessStrategy(java.util.List)">SimpleNodeAccessStrategy(List<? extends SocketAddress>)</a></span> - 类 的构造器com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleNodeAccessStrategy</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#start()">start()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#stop()">stop()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#subscribe(java.lang.String)">subscribe(String)</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">客户端订阅,重复订阅时会更新对应的filter信息
|
||||
|
||||
|
||||
说明:
|
||||
a.</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#subscribe()">subscribe()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">客户端订阅,不提交客户端filter,以服务端的filter为准</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#subscribe()">subscribe()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#subscribe(java.lang.String)">subscribe(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#subscribe()">subscribe()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#subscribe(java.lang.String)">subscribe(String)</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_U_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">U</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/CanalConnector.html#unsubscribe()">unsubscribe()</a></span> - 接口 中的方法com.alibaba.otter.canal.client.<a href="./com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a></dt>
|
||||
<dd>
|
||||
<div class="block">取消订阅</div>
|
||||
</dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html#unsubscribe()">unsubscribe()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">ClusterCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html#unsubscribe()">unsubscribe()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.<a href="./com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a></dt>
|
||||
<dd> </dd>
|
||||
</dl>
|
||||
<a name="_W_">
|
||||
<!-- -->
|
||||
</a>
|
||||
<h2 class="title">W</h2>
|
||||
<dl>
|
||||
<dt><span class="strong"><a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html#waitForActive()">waitForActive()</a></span> - 类 中的方法com.alibaba.otter.canal.client.impl.running.<a href="./com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningMonitor</a></dt>
|
||||
<dd>
|
||||
<div class="block">阻塞等待自己成为active,如果自己成为active,立马返回</div>
|
||||
</dd>
|
||||
</dl>
|
||||
<a href="#_A_">A</a> <a href="#_C_">C</a> <a href="#_D_">D</a> <a href="#_G_">G</a> <a href="#_I_">I</a> <a href="#_N_">N</a> <a href="#_P_">P</a> <a href="#_R_">R</a> <a href="#_S_">S</a> <a href="#_U_">U</a> <a href="#_W_">W</a> </div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="./overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="./overview-tree.html">树</a></li>
|
||||
<li><a href="./deprecated-list.html">已过时</a></li>
|
||||
<li class="navBarCell1Rev">索引</li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="./index.html?index-all.html" target="_top">框架</a></li>
|
||||
<li><a href="index-all.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="./allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,68 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>canal client module for otter 1.0.13 1.0.13 API</title>
|
||||
<script type="text/javascript">
|
||||
targetPage = "" + window.location.search;
|
||||
if (targetPage != "" && targetPage != "undefined")
|
||||
targetPage = targetPage.substring(1);
|
||||
if (targetPage.indexOf(":") != -1 || (targetPage != "" && !validURL(targetPage)))
|
||||
targetPage = "undefined";
|
||||
function validURL(url) {
|
||||
var pos = url.indexOf(".html");
|
||||
if (pos == -1 || pos != url.length - 5)
|
||||
return false;
|
||||
var allowNumber = false;
|
||||
var allowSep = false;
|
||||
var seenDot = false;
|
||||
for (var i = 0; i < url.length - 5; i++) {
|
||||
var ch = url.charAt(i);
|
||||
if ('a' <= ch && ch <= 'z' ||
|
||||
'A' <= ch && ch <= 'Z' ||
|
||||
ch == '$' ||
|
||||
ch == '_') {
|
||||
allowNumber = true;
|
||||
allowSep = true;
|
||||
} else if ('0' <= ch && ch <= '9'
|
||||
|| ch == '-') {
|
||||
if (!allowNumber)
|
||||
return false;
|
||||
} else if (ch == '/' || ch == '.') {
|
||||
if (!allowSep)
|
||||
return false;
|
||||
allowNumber = false;
|
||||
allowSep = false;
|
||||
if (ch == '.')
|
||||
seenDot = true;
|
||||
if (ch == '/' && seenDot)
|
||||
return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function loadFrames() {
|
||||
if (targetPage != "" && targetPage != "undefined")
|
||||
top.classFrame.location = top.targetPage;
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
|
||||
<frameset rows="30%,70%" title="Left frames" onload="top.loadFrames()">
|
||||
<frame src="overview-frame.html" name="packageListFrame" title="所有程序包">
|
||||
<frame src="allclasses-frame.html" name="packageFrame" title="所有类和接口 (除了非静态嵌套类型)">
|
||||
</frameset>
|
||||
<frame src="overview-summary.html" name="classFrame" title="程序包, 类和接口说明" scrolling="yes">
|
||||
<noframes>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<h2>框架预警</h2>
|
||||
<p>请使用框架功能查看此文档。如果看到此消息, 则表明您使用的是不支持框架的 Web 客户机。链接到<a href="overview-summary.html">非框架版本</a>。</p>
|
||||
</noframes>
|
||||
</frameset>
|
||||
</html>
|
||||
@@ -1,24 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>概览列表 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<h1 title="canal.client-1.0.13" class="bar">canal.client-1.0.13</h1>
|
||||
<div class="indexHeader"><a href="allclasses-frame.html" target="packageFrame">所有类</a></div>
|
||||
<div class="indexContainer">
|
||||
<h2 title="程序包">程序包</h2>
|
||||
<ul title="程序包">
|
||||
<li><a href="com/alibaba/otter/canal/client/package-frame.html" target="packageFrame">com.alibaba.otter.canal.client</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/package-frame.html" target="packageFrame">com.alibaba.otter.canal.client.impl</a></li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/package-frame.html" target="packageFrame">com.alibaba.otter.canal.client.impl.running</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<p> </p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,139 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>概览 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="概览 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li class="navBarCell1Rev">概览</li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?overview-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="overview-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 class="title">canal.client-1.0.13</h1>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="程序包表, 列表程序包和解释">
|
||||
<caption><span>程序包</span><span class="tabEnd"> </span></caption>
|
||||
<tr>
|
||||
<th class="colFirst" scope="col">程序包</th>
|
||||
<th class="colLast" scope="col">说明</th>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="com/alibaba/otter/canal/client/package-summary.html">com.alibaba.otter.canal.client</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colFirst"><a href="com/alibaba/otter/canal/client/impl/package-summary.html">com.alibaba.otter.canal.client.impl</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colFirst"><a href="com/alibaba/otter/canal/client/impl/running/package-summary.html">com.alibaba.otter.canal.client.impl.running</a></td>
|
||||
<td class="colLast"> </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li class="navBarCell1Rev">概览</li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li><a href="overview-tree.html">树</a></li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?overview-summary.html" target="_top">框架</a></li>
|
||||
<li><a href="overview-summary.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,148 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<!-- NewPage -->
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<!-- Generated by javadoc (version 1.7.0_40) on Tue Oct 29 14:30:30 CST 2013 -->
|
||||
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
|
||||
<title>类分层结构 (canal client module for otter 1.0.13 1.0.13 API)</title>
|
||||
<meta name="date" content="2013-10-29">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript"><!--
|
||||
if (location.href.indexOf('is-external=true') == -1) {
|
||||
parent.document.title="类分层结构 (canal client module for otter 1.0.13 1.0.13 API)";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
<noscript>
|
||||
<div>您的浏览器已禁用 JavaScript。</div>
|
||||
</noscript>
|
||||
<!-- ========= START OF TOP NAVBAR ======= -->
|
||||
<div class="topNav"><a name="navbar_top">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_top" title="跳过导航链接"></a><a name="navbar_top_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?overview-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="overview-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_top">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_top");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_top">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||
<div class="header">
|
||||
<h1 class="title">所有程序包的分层结构</h1>
|
||||
<span class="strong">程序包分层结构:</span>
|
||||
<ul class="horizontal">
|
||||
<li><a href="com/alibaba/otter/canal/client/package-tree.html">com.alibaba.otter.canal.client</a>, </li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/package-tree.html">com.alibaba.otter.canal.client.impl</a>, </li>
|
||||
<li><a href="com/alibaba/otter/canal/client/impl/running/package-tree.html">com.alibaba.otter.canal.client.impl.running</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="contentContainer">
|
||||
<h2 title="类分层结构">类分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">java.lang.<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html?is-external=true" title="java.lang中的类或接口"><span class="strong">Object</span></a>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.common.AbstractCanalLifeCycle (implements com.alibaba.otter.canal.common.CanalLifeCycle)
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="com/alibaba/otter/canal/client/impl/running/ClientRunningMonitor.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningMonitor</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalConnectors.html" title="com.alibaba.otter.canal.client中的类"><span class="strong">CanalConnectors</span></a></li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类"><span class="strong">ClientRunningData</span></a></li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="com/alibaba/otter/canal/client/impl/ClusterCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterCanalConnector</span></a> (implements com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="com/alibaba/otter/canal/client/impl/ClusterNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">ClusterNodeAccessStrategy</span></a> (implements com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleCanalConnector</span></a> (implements com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>)</li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.<a href="com/alibaba/otter/canal/client/impl/SimpleNodeAccessStrategy.html" title="com.alibaba.otter.canal.client.impl中的类"><span class="strong">SimpleNodeAccessStrategy</span></a> (implements com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2 title="接口分层结构">接口分层结构</h2>
|
||||
<ul>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalConnector</span></a></li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.<a href="com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口"><span class="strong">CanalNodeAccessStrategy</span></a></li>
|
||||
<li type="circle">com.alibaba.otter.canal.client.impl.running.<a href="com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口"><span class="strong">ClientRunningListener</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||
<div class="bottomNav"><a name="navbar_bottom">
|
||||
<!-- -->
|
||||
</a><a href="#skip-navbar_bottom" title="跳过导航链接"></a><a name="navbar_bottom_firstrow">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="navList" title="导航">
|
||||
<li><a href="overview-summary.html">概览</a></li>
|
||||
<li>程序包</li>
|
||||
<li>类</li>
|
||||
<li>使用</li>
|
||||
<li class="navBarCell1Rev">树</li>
|
||||
<li><a href="deprecated-list.html">已过时</a></li>
|
||||
<li><a href="index-all.html">索引</a></li>
|
||||
</ul>
|
||||
<div class="aboutLanguage"><em>canal.client-1.0.13</em></div>
|
||||
</div>
|
||||
<div class="subNav">
|
||||
<ul class="navList">
|
||||
<li>上一个</li>
|
||||
<li>下一个</li>
|
||||
</ul>
|
||||
<ul class="navList">
|
||||
<li><a href="index.html?overview-tree.html" target="_top">框架</a></li>
|
||||
<li><a href="overview-tree.html" target="_top">无框架</a></li>
|
||||
</ul>
|
||||
<ul class="navList" id="allclasses_navbar_bottom">
|
||||
<li><a href="allclasses-noframe.html">所有类</a></li>
|
||||
</ul>
|
||||
<div>
|
||||
<script type="text/javascript"><!--
|
||||
allClassesLink = document.getElementById("allclasses_navbar_bottom");
|
||||
if(window==top) {
|
||||
allClassesLink.style.display = "block";
|
||||
}
|
||||
else {
|
||||
allClassesLink.style.display = "none";
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</div>
|
||||
<a name="skip-navbar_bottom">
|
||||
<!-- -->
|
||||
</a></div>
|
||||
<!-- ======== END OF BOTTOM NAVBAR ======= -->
|
||||
<p class="legalCopy"><small>Copyright © 2013. All rights reserved.</small></p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,3 +0,0 @@
|
||||
com.alibaba.otter.canal.client
|
||||
com.alibaba.otter.canal.client.impl
|
||||
com.alibaba.otter.canal.client.impl.running
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.3 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 291 B |
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 849 B |
@@ -1,474 +0,0 @@
|
||||
/* Javadoc style sheet */
|
||||
/*
|
||||
Overall document style
|
||||
*/
|
||||
body {
|
||||
background-color:#ffffff;
|
||||
color:#353833;
|
||||
font-family:Arial, Helvetica, sans-serif;
|
||||
font-size:76%;
|
||||
margin:0;
|
||||
}
|
||||
a:link, a:visited {
|
||||
text-decoration:none;
|
||||
color:#4c6b87;
|
||||
}
|
||||
a:hover, a:focus {
|
||||
text-decoration:none;
|
||||
color:#bb7a2a;
|
||||
}
|
||||
a:active {
|
||||
text-decoration:none;
|
||||
color:#4c6b87;
|
||||
}
|
||||
a[name] {
|
||||
color:#353833;
|
||||
}
|
||||
a[name]:hover {
|
||||
text-decoration:none;
|
||||
color:#353833;
|
||||
}
|
||||
pre {
|
||||
font-size:1.3em;
|
||||
}
|
||||
h1 {
|
||||
font-size:1.8em;
|
||||
}
|
||||
h2 {
|
||||
font-size:1.5em;
|
||||
}
|
||||
h3 {
|
||||
font-size:1.4em;
|
||||
}
|
||||
h4 {
|
||||
font-size:1.3em;
|
||||
}
|
||||
h5 {
|
||||
font-size:1.2em;
|
||||
}
|
||||
h6 {
|
||||
font-size:1.1em;
|
||||
}
|
||||
ul {
|
||||
list-style-type:disc;
|
||||
}
|
||||
code, tt {
|
||||
font-size:1.2em;
|
||||
}
|
||||
dt code {
|
||||
font-size:1.2em;
|
||||
}
|
||||
table tr td dt code {
|
||||
font-size:1.2em;
|
||||
vertical-align:top;
|
||||
}
|
||||
sup {
|
||||
font-size:.6em;
|
||||
}
|
||||
/*
|
||||
Document title and Copyright styles
|
||||
*/
|
||||
.clear {
|
||||
clear:both;
|
||||
height:0px;
|
||||
overflow:hidden;
|
||||
}
|
||||
.aboutLanguage {
|
||||
float:right;
|
||||
padding:0px 21px;
|
||||
font-size:.8em;
|
||||
z-index:200;
|
||||
margin-top:-7px;
|
||||
}
|
||||
.legalCopy {
|
||||
margin-left:.5em;
|
||||
}
|
||||
.bar a, .bar a:link, .bar a:visited, .bar a:active {
|
||||
color:#FFFFFF;
|
||||
text-decoration:none;
|
||||
}
|
||||
.bar a:hover, .bar a:focus {
|
||||
color:#bb7a2a;
|
||||
}
|
||||
.tab {
|
||||
background-color:#0066FF;
|
||||
background-image:url(resources/titlebar.gif);
|
||||
background-position:left top;
|
||||
background-repeat:no-repeat;
|
||||
color:#ffffff;
|
||||
padding:8px;
|
||||
width:5em;
|
||||
font-weight:bold;
|
||||
}
|
||||
/*
|
||||
Navigation bar styles
|
||||
*/
|
||||
.bar {
|
||||
background-image:url(resources/background.gif);
|
||||
background-repeat:repeat-x;
|
||||
color:#FFFFFF;
|
||||
padding:.8em .5em .4em .8em;
|
||||
height:auto;/*height:1.8em;*/
|
||||
font-size:1em;
|
||||
margin:0;
|
||||
}
|
||||
.topNav {
|
||||
background-image:url(resources/background.gif);
|
||||
background-repeat:repeat-x;
|
||||
color:#FFFFFF;
|
||||
float:left;
|
||||
padding:0;
|
||||
width:100%;
|
||||
clear:right;
|
||||
height:2.8em;
|
||||
padding-top:10px;
|
||||
overflow:hidden;
|
||||
}
|
||||
.bottomNav {
|
||||
margin-top:10px;
|
||||
background-image:url(resources/background.gif);
|
||||
background-repeat:repeat-x;
|
||||
color:#FFFFFF;
|
||||
float:left;
|
||||
padding:0;
|
||||
width:100%;
|
||||
clear:right;
|
||||
height:2.8em;
|
||||
padding-top:10px;
|
||||
overflow:hidden;
|
||||
}
|
||||
.subNav {
|
||||
background-color:#dee3e9;
|
||||
border-bottom:1px solid #9eadc0;
|
||||
float:left;
|
||||
width:100%;
|
||||
overflow:hidden;
|
||||
}
|
||||
.subNav div {
|
||||
clear:left;
|
||||
float:left;
|
||||
padding:0 0 5px 6px;
|
||||
}
|
||||
ul.navList, ul.subNavList {
|
||||
float:left;
|
||||
margin:0 25px 0 0;
|
||||
padding:0;
|
||||
}
|
||||
ul.navList li{
|
||||
list-style:none;
|
||||
float:left;
|
||||
padding:3px 6px;
|
||||
}
|
||||
ul.subNavList li{
|
||||
list-style:none;
|
||||
float:left;
|
||||
font-size:90%;
|
||||
}
|
||||
.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
|
||||
color:#FFFFFF;
|
||||
text-decoration:none;
|
||||
}
|
||||
.topNav a:hover, .bottomNav a:hover {
|
||||
text-decoration:none;
|
||||
color:#bb7a2a;
|
||||
}
|
||||
.navBarCell1Rev {
|
||||
background-image:url(resources/tab.gif);
|
||||
background-color:#a88834;
|
||||
color:#FFFFFF;
|
||||
margin: auto 5px;
|
||||
border:1px solid #c9aa44;
|
||||
}
|
||||
/*
|
||||
Page header and footer styles
|
||||
*/
|
||||
.header, .footer {
|
||||
clear:both;
|
||||
margin:0 20px;
|
||||
padding:5px 0 0 0;
|
||||
}
|
||||
.indexHeader {
|
||||
margin:10px;
|
||||
position:relative;
|
||||
}
|
||||
.indexHeader h1 {
|
||||
font-size:1.3em;
|
||||
}
|
||||
.title {
|
||||
color:#2c4557;
|
||||
margin:10px 0;
|
||||
}
|
||||
.subTitle {
|
||||
margin:5px 0 0 0;
|
||||
}
|
||||
.header ul {
|
||||
margin:0 0 25px 0;
|
||||
padding:0;
|
||||
}
|
||||
.footer ul {
|
||||
margin:20px 0 5px 0;
|
||||
}
|
||||
.header ul li, .footer ul li {
|
||||
list-style:none;
|
||||
font-size:1.2em;
|
||||
}
|
||||
/*
|
||||
Heading styles
|
||||
*/
|
||||
div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
|
||||
background-color:#dee3e9;
|
||||
border-top:1px solid #9eadc0;
|
||||
border-bottom:1px solid #9eadc0;
|
||||
margin:0 0 6px -8px;
|
||||
padding:2px 5px;
|
||||
}
|
||||
ul.blockList ul.blockList ul.blockList li.blockList h3 {
|
||||
background-color:#dee3e9;
|
||||
border-top:1px solid #9eadc0;
|
||||
border-bottom:1px solid #9eadc0;
|
||||
margin:0 0 6px -8px;
|
||||
padding:2px 5px;
|
||||
}
|
||||
ul.blockList ul.blockList li.blockList h3 {
|
||||
padding:0;
|
||||
margin:15px 0;
|
||||
}
|
||||
ul.blockList li.blockList h2 {
|
||||
padding:0px 0 20px 0;
|
||||
}
|
||||
/*
|
||||
Page layout container styles
|
||||
*/
|
||||
.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
|
||||
clear:both;
|
||||
padding:10px 20px;
|
||||
position:relative;
|
||||
}
|
||||
.indexContainer {
|
||||
margin:10px;
|
||||
position:relative;
|
||||
font-size:1.0em;
|
||||
}
|
||||
.indexContainer h2 {
|
||||
font-size:1.1em;
|
||||
padding:0 0 3px 0;
|
||||
}
|
||||
.indexContainer ul {
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
.indexContainer ul li {
|
||||
list-style:none;
|
||||
}
|
||||
.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
|
||||
font-size:1.1em;
|
||||
font-weight:bold;
|
||||
margin:10px 0 0 0;
|
||||
color:#4E4E4E;
|
||||
}
|
||||
.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
|
||||
margin:10px 0 10px 20px;
|
||||
}
|
||||
.serializedFormContainer dl.nameValue dt {
|
||||
margin-left:1px;
|
||||
font-size:1.1em;
|
||||
display:inline;
|
||||
font-weight:bold;
|
||||
}
|
||||
.serializedFormContainer dl.nameValue dd {
|
||||
margin:0 0 0 1px;
|
||||
font-size:1.1em;
|
||||
display:inline;
|
||||
}
|
||||
/*
|
||||
List styles
|
||||
*/
|
||||
ul.horizontal li {
|
||||
display:inline;
|
||||
font-size:0.9em;
|
||||
}
|
||||
ul.inheritance {
|
||||
margin:0;
|
||||
padding:0;
|
||||
}
|
||||
ul.inheritance li {
|
||||
display:inline;
|
||||
list-style:none;
|
||||
}
|
||||
ul.inheritance li ul.inheritance {
|
||||
margin-left:15px;
|
||||
padding-left:15px;
|
||||
padding-top:1px;
|
||||
}
|
||||
ul.blockList, ul.blockListLast {
|
||||
margin:10px 0 10px 0;
|
||||
padding:0;
|
||||
}
|
||||
ul.blockList li.blockList, ul.blockListLast li.blockList {
|
||||
list-style:none;
|
||||
margin-bottom:25px;
|
||||
}
|
||||
ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
|
||||
padding:0px 20px 5px 10px;
|
||||
border:1px solid #9eadc0;
|
||||
background-color:#f9f9f9;
|
||||
}
|
||||
ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
|
||||
padding:0 0 5px 8px;
|
||||
background-color:#ffffff;
|
||||
border:1px solid #9eadc0;
|
||||
border-top:none;
|
||||
}
|
||||
ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
|
||||
margin-left:0;
|
||||
padding-left:0;
|
||||
padding-bottom:15px;
|
||||
border:none;
|
||||
border-bottom:1px solid #9eadc0;
|
||||
}
|
||||
ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
|
||||
list-style:none;
|
||||
border-bottom:none;
|
||||
padding-bottom:0;
|
||||
}
|
||||
table tr td dl, table tr td dl dt, table tr td dl dd {
|
||||
margin-top:0;
|
||||
margin-bottom:1px;
|
||||
}
|
||||
/*
|
||||
Table styles
|
||||
*/
|
||||
.contentContainer table, .classUseContainer table, .constantValuesContainer table {
|
||||
border-bottom:1px solid #9eadc0;
|
||||
width:100%;
|
||||
}
|
||||
.contentContainer ul li table, .classUseContainer ul li table, .constantValuesContainer ul li table {
|
||||
width:100%;
|
||||
}
|
||||
.contentContainer .description table, .contentContainer .details table {
|
||||
border-bottom:none;
|
||||
}
|
||||
.contentContainer ul li table th.colOne, .contentContainer ul li table th.colFirst, .contentContainer ul li table th.colLast, .classUseContainer ul li table th, .constantValuesContainer ul li table th, .contentContainer ul li table td.colOne, .contentContainer ul li table td.colFirst, .contentContainer ul li table td.colLast, .classUseContainer ul li table td, .constantValuesContainer ul li table td{
|
||||
vertical-align:top;
|
||||
padding-right:20px;
|
||||
}
|
||||
.contentContainer ul li table th.colLast, .classUseContainer ul li table th.colLast,.constantValuesContainer ul li table th.colLast,
|
||||
.contentContainer ul li table td.colLast, .classUseContainer ul li table td.colLast,.constantValuesContainer ul li table td.colLast,
|
||||
.contentContainer ul li table th.colOne, .classUseContainer ul li table th.colOne,
|
||||
.contentContainer ul li table td.colOne, .classUseContainer ul li table td.colOne {
|
||||
padding-right:3px;
|
||||
}
|
||||
.overviewSummary caption, .packageSummary caption, .contentContainer ul.blockList li.blockList caption, .summary caption, .classUseContainer caption, .constantValuesContainer caption {
|
||||
position:relative;
|
||||
text-align:left;
|
||||
background-repeat:no-repeat;
|
||||
color:#FFFFFF;
|
||||
font-weight:bold;
|
||||
clear:none;
|
||||
overflow:hidden;
|
||||
padding:0px;
|
||||
margin:0px;
|
||||
}
|
||||
caption a:link, caption a:hover, caption a:active, caption a:visited {
|
||||
color:#FFFFFF;
|
||||
}
|
||||
.overviewSummary caption span, .packageSummary caption span, .contentContainer ul.blockList li.blockList caption span, .summary caption span, .classUseContainer caption span, .constantValuesContainer caption span {
|
||||
white-space:nowrap;
|
||||
padding-top:8px;
|
||||
padding-left:8px;
|
||||
display:block;
|
||||
float:left;
|
||||
background-image:url(resources/titlebar.gif);
|
||||
height:18px;
|
||||
}
|
||||
.overviewSummary .tabEnd, .packageSummary .tabEnd, .contentContainer ul.blockList li.blockList .tabEnd, .summary .tabEnd, .classUseContainer .tabEnd, .constantValuesContainer .tabEnd {
|
||||
width:10px;
|
||||
background-image:url(resources/titlebar_end.gif);
|
||||
background-repeat:no-repeat;
|
||||
background-position:top right;
|
||||
position:relative;
|
||||
float:left;
|
||||
}
|
||||
ul.blockList ul.blockList li.blockList table {
|
||||
margin:0 0 12px 0px;
|
||||
width:100%;
|
||||
}
|
||||
.tableSubHeadingColor {
|
||||
background-color: #EEEEFF;
|
||||
}
|
||||
.altColor {
|
||||
background-color:#eeeeef;
|
||||
}
|
||||
.rowColor {
|
||||
background-color:#ffffff;
|
||||
}
|
||||
.overviewSummary td, .packageSummary td, .contentContainer ul.blockList li.blockList td, .summary td, .classUseContainer td, .constantValuesContainer td {
|
||||
text-align:left;
|
||||
padding:3px 3px 3px 7px;
|
||||
}
|
||||
th.colFirst, th.colLast, th.colOne, .constantValuesContainer th {
|
||||
background:#dee3e9;
|
||||
border-top:1px solid #9eadc0;
|
||||
border-bottom:1px solid #9eadc0;
|
||||
text-align:left;
|
||||
padding:3px 3px 3px 7px;
|
||||
}
|
||||
td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
|
||||
font-weight:bold;
|
||||
}
|
||||
td.colFirst, th.colFirst {
|
||||
border-left:1px solid #9eadc0;
|
||||
white-space:nowrap;
|
||||
}
|
||||
td.colLast, th.colLast {
|
||||
border-right:1px solid #9eadc0;
|
||||
}
|
||||
td.colOne, th.colOne {
|
||||
border-right:1px solid #9eadc0;
|
||||
border-left:1px solid #9eadc0;
|
||||
}
|
||||
table.overviewSummary {
|
||||
padding:0px;
|
||||
margin-left:0px;
|
||||
}
|
||||
table.overviewSummary td.colFirst, table.overviewSummary th.colFirst,
|
||||
table.overviewSummary td.colOne, table.overviewSummary th.colOne {
|
||||
width:25%;
|
||||
vertical-align:middle;
|
||||
}
|
||||
table.packageSummary td.colFirst, table.overviewSummary th.colFirst {
|
||||
width:25%;
|
||||
vertical-align:middle;
|
||||
}
|
||||
/*
|
||||
Content styles
|
||||
*/
|
||||
.description pre {
|
||||
margin-top:0;
|
||||
}
|
||||
.deprecatedContent {
|
||||
margin:0;
|
||||
padding:10px 0;
|
||||
}
|
||||
.docSummary {
|
||||
padding:0;
|
||||
}
|
||||
/*
|
||||
Formatting effect styles
|
||||
*/
|
||||
.sourceLineNo {
|
||||
color:green;
|
||||
padding:0 30px 0 0;
|
||||
}
|
||||
h1.hidden {
|
||||
visibility:hidden;
|
||||
overflow:hidden;
|
||||
font-size:.9em;
|
||||
}
|
||||
.block {
|
||||
display:block;
|
||||
margin:3px 0 0 0;
|
||||
}
|
||||
.strong {
|
||||
font-weight:bold;
|
||||
}
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" ">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal</artifactId>
|
||||
<version>1.0.25-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.client</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>canal client module for otter ${project.version}</name>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.protocol</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- junit -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>dev</id>
|
||||
<activation>
|
||||
<activeByDefault>true</activeByDefault>
|
||||
<property>
|
||||
<name>env</name>
|
||||
<value>!javadoc</value>
|
||||
</property>
|
||||
</activation>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>javadoc</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>env</name>
|
||||
<value>javadoc</value>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>2.9.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<aggregate>true</aggregate>
|
||||
<show>public</show>
|
||||
<nohelp>true</nohelp>
|
||||
<header>${project.artifactId}-${project.version}</header>
|
||||
<footer>${project.artifactId}-${project.version}</footer>
|
||||
<doctitle>${project.artifactId}-${project.version}</doctitle>
|
||||
<links>
|
||||
<link>https://github.com/alibaba/canal</link>
|
||||
</links>
|
||||
<outputDirectory>${project.build.directory}/apidocs/apidocs/${pom.version}</outputDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-scm-publish-plugin</artifactId>
|
||||
<version>1.0-beta-2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>publish-scm</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<checkoutDirectory>${project.build.directory}/scmpublish</checkoutDirectory>
|
||||
<checkinComment>Publishing javadoc for ${project.artifactId}:${project.version}</checkinComment>
|
||||
<content>${project.build.directory}/apidocs</content>
|
||||
<skipDeletedFiles>true</skipDeletedFiles>
|
||||
<pubScmUrl>scm:git:git@github.com:alibaba/canal.git</pubScmUrl>
|
||||
<scmBranch>gh-pages</scmBranch>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -0,0 +1,153 @@
|
||||
package com.alibaba.otter.canal.client;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import com.alibaba.otter.canal.protocol.Message;
|
||||
import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
||||
|
||||
/**
|
||||
* canal数据操作客户端
|
||||
*
|
||||
* @author zebin.xuzb @ 2012-6-19
|
||||
* @author jianghang
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalConnector {
|
||||
|
||||
/**
|
||||
* 链接对应的canal server
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void connect() throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 释放链接
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void disconnect() throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 检查下链接是否合法
|
||||
*
|
||||
* <pre>
|
||||
* 几种case下链接不合法:
|
||||
* 1. 链接canal server失败,一直没有一个可用的链接,返回false
|
||||
* 2. 当前客户端在进行running抢占的时候,做为备份节点存在,非处于工作节点,返回false
|
||||
*
|
||||
* 说明:
|
||||
* a. 当前客户端一旦做为备份节点存在,当前所有的对{@linkplain CanalConnector}的操作都会处于阻塞状态,直到转为工作节点
|
||||
* b. 所以业务方最好定时调用checkValid()方法用,比如调用CanalConnector所在线程的interrupt,直接退出CanalConnector,并根据自己的需要退出自己的资源
|
||||
* </pre>
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
boolean checkValid() throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 客户端订阅,重复订阅时会更新对应的filter信息
|
||||
*
|
||||
* <pre>
|
||||
* 说明:
|
||||
* a. 如果本次订阅中filter信息为空,则直接使用canal server服务端配置的filter信息
|
||||
* b. 如果本次订阅中filter信息不为空,目前会直接替换canal server服务端配置的filter信息,以本次提交的为准
|
||||
*
|
||||
* TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表
|
||||
* </pre>
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void subscribe(String filter) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 客户端订阅,不提交客户端filter,以服务端的filter为准
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void subscribe() throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 取消订阅
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void unsubscribe() throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 获取数据,自动进行确认,该方法返回的条件:尝试拿batchSize条记录,有多少取多少,不会阻塞等待
|
||||
*
|
||||
* @param batchSize
|
||||
* @return
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
Message get(int batchSize) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 获取数据,自动进行确认
|
||||
*
|
||||
* <pre>
|
||||
* 该方法返回的条件:
|
||||
* a. 拿够batchSize条记录或者超过timeout时间
|
||||
* b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
* </pre>
|
||||
*
|
||||
* @param batchSize
|
||||
* @return
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
Message get(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 不指定 position 获取事件,该方法返回的条件: 尝试拿batchSize条记录,有多少取多少,不会阻塞等待<br/>
|
||||
* canal 会记住此 client 最新的position。 <br/>
|
||||
* 如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。
|
||||
*
|
||||
* @param batchSize
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
Message getWithoutAck(int batchSize) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 不指定 position 获取事件.
|
||||
*
|
||||
* <pre>
|
||||
* 该方法返回的条件:
|
||||
* a. 拿够batchSize条记录或者超过timeout时间
|
||||
* b. 如果timeout=0,则阻塞至拿到batchSize记录才返回
|
||||
* </pre>
|
||||
*
|
||||
* canal 会记住此 client 最新的position。 <br/>
|
||||
* 如果是第一次 fetch,则会从 canal 中保存的最老一条数据开始输出。
|
||||
*
|
||||
* @param batchSize
|
||||
* @param timeout
|
||||
* @param unit
|
||||
* @return
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
Message getWithoutAck(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。
|
||||
*
|
||||
* @param batchId
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void ack(long batchId) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 回滚到未进行 {@link #ack} 的地方,指定回滚具体的batchId
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void rollback(long batchId) throws CanalClientException;
|
||||
|
||||
/**
|
||||
* 回滚到未进行 {@link #ack} 的地方,下次fetch的时候,可以从最后一个没有 {@link #ack} 的地方开始拿
|
||||
*
|
||||
* @throws CanalClientException
|
||||
*/
|
||||
void rollback() throws CanalClientException;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.alibaba.otter.canal.client;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.otter.canal.client.impl.ClusterCanalConnector;
|
||||
import com.alibaba.otter.canal.client.impl.ClusterNodeAccessStrategy;
|
||||
import com.alibaba.otter.canal.client.impl.SimpleCanalConnector;
|
||||
import com.alibaba.otter.canal.client.impl.SimpleNodeAccessStrategy;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
|
||||
/**
|
||||
* canal connectors创建工具类
|
||||
*
|
||||
* @author jianghang 2012-10-29 下午11:18:50
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class CanalConnectors {
|
||||
|
||||
/**
|
||||
* 创建单链接的客户端链接
|
||||
*
|
||||
* @param address
|
||||
* @param destination
|
||||
* @param username
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
public static CanalConnector newSingleConnector(SocketAddress address, String destination, String username,
|
||||
String password) {
|
||||
SimpleCanalConnector canalConnector = new SimpleCanalConnector(address, username, password, destination);
|
||||
canalConnector.setSoTimeout(30 * 1000);
|
||||
return canalConnector;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建带cluster模式的客户端链接,自动完成failover切换
|
||||
*
|
||||
* @param addresses
|
||||
* @param destination
|
||||
* @param username
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
public static CanalConnector newClusterConnector(List<? extends SocketAddress> addresses, String destination,
|
||||
String username, String password) {
|
||||
ClusterCanalConnector canalConnector = new ClusterCanalConnector(username,
|
||||
password,
|
||||
destination,
|
||||
new SimpleNodeAccessStrategy(addresses));
|
||||
canalConnector.setSoTimeout(30 * 1000);
|
||||
return canalConnector;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建带cluster模式的客户端链接,自动完成failover切换,服务器列表自动扫描
|
||||
*
|
||||
* @param zkServers
|
||||
* @param destination
|
||||
* @param username
|
||||
* @param password
|
||||
* @return
|
||||
*/
|
||||
public static CanalConnector newClusterConnector(String zkServers, String destination, String username,
|
||||
String password) {
|
||||
ClusterCanalConnector canalConnector = new ClusterCanalConnector(username,
|
||||
password,
|
||||
destination,
|
||||
new ClusterNodeAccessStrategy(destination, ZkClientx.getZkClient(zkServers)));
|
||||
canalConnector.setSoTimeout(30 * 1000);
|
||||
return canalConnector;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.alibaba.otter.canal.client;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
|
||||
/**
|
||||
* 集群节点访问控制接口
|
||||
*
|
||||
* @author jianghang 2012-10-29 下午07:55:41
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalNodeAccessStrategy {
|
||||
|
||||
SocketAddress currentNode();
|
||||
|
||||
SocketAddress nextNode();
|
||||
}
|
||||
@@ -0,0 +1,325 @@
|
||||
package com.alibaba.otter.canal.client.impl;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.alibaba.otter.canal.client.CanalConnector;
|
||||
import com.alibaba.otter.canal.client.CanalNodeAccessStrategy;
|
||||
import com.alibaba.otter.canal.protocol.Message;
|
||||
import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
||||
|
||||
/**
|
||||
* 集群版本connector实现,自带了failover功能<br/>
|
||||
*
|
||||
* @author jianghang 2012-10-29 下午08:04:06
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ClusterCanalConnector implements CanalConnector {
|
||||
|
||||
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||
private String username;
|
||||
private String password;
|
||||
private int soTimeout = 10000;
|
||||
private int retryTimes = 3;
|
||||
private int retryInterval = 5000; // 重试的时间间隔,默认5秒
|
||||
private CanalNodeAccessStrategy accessStrategy;
|
||||
private SimpleCanalConnector currentConnector;
|
||||
private String destination;
|
||||
private String filter; // 记录上一次的filter提交值,便于自动重试时提交
|
||||
|
||||
public ClusterCanalConnector(String username, String password, String destination,
|
||||
CanalNodeAccessStrategy accessStrategy){
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.destination = destination;
|
||||
this.accessStrategy = accessStrategy;
|
||||
}
|
||||
|
||||
public void connect() throws CanalClientException {
|
||||
while (currentConnector == null) {
|
||||
int times = 0;
|
||||
while (true) {
|
||||
try {
|
||||
currentConnector = new SimpleCanalConnector(null, username, password, destination) {
|
||||
|
||||
@Override
|
||||
public SocketAddress getNextAddress() {
|
||||
return accessStrategy.nextNode();
|
||||
}
|
||||
|
||||
};
|
||||
currentConnector.setSoTimeout(soTimeout);
|
||||
if (filter != null) {
|
||||
currentConnector.setFilter(filter);
|
||||
}
|
||||
if (accessStrategy instanceof ClusterNodeAccessStrategy) {
|
||||
currentConnector.setZkClientx(((ClusterNodeAccessStrategy) accessStrategy).getZkClient());
|
||||
}
|
||||
|
||||
currentConnector.connect();
|
||||
break;
|
||||
} catch (Exception e) {
|
||||
logger.warn("failed to connect to:{} after retry {} times", accessStrategy.currentNode(), times);
|
||||
currentConnector.disconnect();
|
||||
currentConnector = null;
|
||||
// retry for #retryTimes for each node when trying to
|
||||
// connect to it.
|
||||
times = times + 1;
|
||||
if (times >= retryTimes) {
|
||||
throw new CanalClientException(e);
|
||||
} else {
|
||||
// fixed issue #55,增加sleep控制,避免重试connect时cpu使用过高
|
||||
try {
|
||||
Thread.sleep(retryInterval);
|
||||
} catch (InterruptedException e1) {
|
||||
throw new CanalClientException(e1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkValid() {
|
||||
return currentConnector != null && currentConnector.checkValid();
|
||||
}
|
||||
|
||||
public void disconnect() throws CanalClientException {
|
||||
if (currentConnector != null) {
|
||||
currentConnector.disconnect();
|
||||
currentConnector = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void subscribe() throws CanalClientException {
|
||||
subscribe(""); // 传递空字符即可
|
||||
}
|
||||
|
||||
public void subscribe(String filter) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
currentConnector.subscribe(filter);
|
||||
this.filter = filter;
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format(
|
||||
"something goes wrong when subscribing from server: %s",
|
||||
currentConnector != null ? currentConnector.getAddress() : "null"),
|
||||
t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
|
||||
throw new CanalClientException("failed to subscribe after " + times + " times retry.");
|
||||
}
|
||||
|
||||
public void unsubscribe() throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
currentConnector.unsubscribe();
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when unsubscribing from server:%s",
|
||||
currentConnector != null ? currentConnector.getAddress() : "null"), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to unsubscribe after " + times + " times retry.");
|
||||
}
|
||||
|
||||
public Message get(int batchSize) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
Message msg = currentConnector.get(batchSize);
|
||||
return msg;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when getting data from server:%s",
|
||||
currentConnector != null ? currentConnector.getAddress() : "null"), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to fetch the data after " + times + " times retry");
|
||||
}
|
||||
|
||||
public Message get(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
Message msg = currentConnector.get(batchSize, timeout, unit);
|
||||
return msg;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when getting data from server:%s",
|
||||
currentConnector != null ? currentConnector.getAddress() : "null"), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to fetch the data after " + times + " times retry");
|
||||
}
|
||||
|
||||
public Message getWithoutAck(int batchSize) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
Message msg = currentConnector.getWithoutAck(batchSize);
|
||||
return msg;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when getWithoutAck data from server:%s",
|
||||
currentConnector.getAddress()), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to fetch the data after " + times + " times retry");
|
||||
}
|
||||
|
||||
public Message getWithoutAck(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
Message msg = currentConnector.getWithoutAck(batchSize, timeout, unit);
|
||||
return msg;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when getWithoutAck data from server:%s",
|
||||
currentConnector.getAddress()), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to fetch the data after " + times + " times retry");
|
||||
}
|
||||
|
||||
public void rollback(long batchId) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
currentConnector.rollback(batchId);
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when rollbacking data from server:%s",
|
||||
currentConnector.getAddress()), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
throw new CanalClientException("failed to rollback after " + times + " times retry");
|
||||
}
|
||||
|
||||
public void rollback() throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
currentConnector.rollback();
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when rollbacking data from server:%s",
|
||||
currentConnector.getAddress()), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
|
||||
throw new CanalClientException("failed to rollback after " + times + " times retry");
|
||||
}
|
||||
|
||||
public void ack(long batchId) throws CanalClientException {
|
||||
int times = 0;
|
||||
while (times < retryTimes) {
|
||||
try {
|
||||
currentConnector.ack(batchId);
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
logger.warn(String.format("something goes wrong when acking data from server:%s",
|
||||
currentConnector.getAddress()), t);
|
||||
times++;
|
||||
restart();
|
||||
logger.info("restart the connector for next round retry.");
|
||||
}
|
||||
}
|
||||
|
||||
throw new CanalClientException("failed to ack after " + times + " times retry");
|
||||
}
|
||||
|
||||
private void restart() throws CanalClientException {
|
||||
disconnect();
|
||||
try {
|
||||
Thread.sleep(retryInterval);
|
||||
} catch (InterruptedException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
connect();
|
||||
}
|
||||
|
||||
// ============================= setter / getter
|
||||
// ============================
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public int getSoTimeout() {
|
||||
return soTimeout;
|
||||
}
|
||||
|
||||
public void setSoTimeout(int soTimeout) {
|
||||
this.soTimeout = soTimeout;
|
||||
}
|
||||
|
||||
public int getRetryTimes() {
|
||||
return retryTimes;
|
||||
}
|
||||
|
||||
public void setRetryTimes(int retryTimes) {
|
||||
this.retryTimes = retryTimes;
|
||||
}
|
||||
|
||||
public int getRetryInterval() {
|
||||
return retryInterval;
|
||||
}
|
||||
|
||||
public void setRetryInterval(int retryInterval) {
|
||||
this.retryInterval = retryInterval;
|
||||
}
|
||||
|
||||
public CanalNodeAccessStrategy getAccessStrategy() {
|
||||
return accessStrategy;
|
||||
}
|
||||
|
||||
public void setAccessStrategy(CanalNodeAccessStrategy accessStrategy) {
|
||||
this.accessStrategy = accessStrategy;
|
||||
}
|
||||
|
||||
public SimpleCanalConnector getCurrentConnector() {
|
||||
return currentConnector;
|
||||
}
|
||||
|
||||
}
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
package com.alibaba.otter.canal.client.impl;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.I0Itec.zkclient.IZkChildListener;
|
||||
import org.I0Itec.zkclient.IZkDataListener;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import com.alibaba.otter.canal.client.CanalNodeAccessStrategy;
|
||||
import com.alibaba.otter.canal.common.utils.JsonUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.running.ServerRunningData;
|
||||
import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
||||
|
||||
/**
|
||||
* 集群模式的调度策略
|
||||
*
|
||||
* @author jianghang 2012-12-3 下午10:01:04
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ClusterNodeAccessStrategy implements CanalNodeAccessStrategy {
|
||||
|
||||
private IZkChildListener childListener; // 监听所有的服务器列表
|
||||
private IZkDataListener dataListener; // 监听当前的工作节点
|
||||
private ZkClientx zkClient;
|
||||
private volatile List<InetSocketAddress> currentAddress = new ArrayList<InetSocketAddress>();
|
||||
private volatile InetSocketAddress runningAddress = null;
|
||||
|
||||
public ClusterNodeAccessStrategy(String destination, ZkClientx zkClient){
|
||||
this.zkClient = zkClient;
|
||||
childListener = new IZkChildListener() {
|
||||
|
||||
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
|
||||
initClusters(currentChilds);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
dataListener = new IZkDataListener() {
|
||||
|
||||
public void handleDataDeleted(String dataPath) throws Exception {
|
||||
runningAddress = null;
|
||||
}
|
||||
|
||||
public void handleDataChange(String dataPath, Object data) throws Exception {
|
||||
initRunning(data);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
String clusterPath = ZookeeperPathUtils.getDestinationClusterRoot(destination);
|
||||
this.zkClient.subscribeChildChanges(clusterPath, childListener);
|
||||
initClusters(this.zkClient.getChildren(clusterPath));
|
||||
|
||||
String runningPath = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
this.zkClient.subscribeDataChanges(runningPath, dataListener);
|
||||
initRunning(this.zkClient.readData(runningPath, true));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SocketAddress currentNode() {
|
||||
return nextNode();
|
||||
}
|
||||
|
||||
public SocketAddress nextNode() {
|
||||
if (runningAddress != null) {// 如果服务已经启动,直接选择当前正在工作的节点
|
||||
return runningAddress;
|
||||
} else if (!currentAddress.isEmpty()) { // 如果不存在已经启动的服务,可能服务是一种lazy启动,随机选择一台触发服务器进行启动
|
||||
return currentAddress.get(0);// 默认返回第一个节点,之前已经做过shuffle
|
||||
} else {
|
||||
throw new CanalClientException("no alive canal server");
|
||||
}
|
||||
}
|
||||
|
||||
private void initClusters(List<String> currentChilds) {
|
||||
if (currentChilds == null || currentChilds.isEmpty()) {
|
||||
currentAddress = new ArrayList<InetSocketAddress>();
|
||||
} else {
|
||||
List<InetSocketAddress> addresses = new ArrayList<InetSocketAddress>();
|
||||
for (String address : currentChilds) {
|
||||
String[] strs = StringUtils.split(address, ":");
|
||||
if (strs != null && strs.length == 2) {
|
||||
addresses.add(new InetSocketAddress(strs[0], Integer.valueOf(strs[1])));
|
||||
}
|
||||
}
|
||||
|
||||
Collections.shuffle(addresses);
|
||||
currentAddress = addresses;// 直接切换引用
|
||||
}
|
||||
}
|
||||
|
||||
private void initRunning(Object data) {
|
||||
if (data == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
ServerRunningData runningData = JsonUtils.unmarshalFromByte((byte[]) data, ServerRunningData.class);
|
||||
String[] strs = StringUtils.split(runningData.getAddress(), ':');
|
||||
if (strs.length == 2) {
|
||||
runningAddress = new InetSocketAddress(strs[0], Integer.valueOf(strs[1]));
|
||||
}
|
||||
}
|
||||
|
||||
public void setZkClient(ZkClientx zkClient) {
|
||||
this.zkClient = zkClient;
|
||||
}
|
||||
|
||||
public ZkClientx getZkClient() {
|
||||
return zkClient;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,505 @@
|
||||
package com.alibaba.otter.canal.client.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.SocketAddress;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.channels.Channel;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.nio.channels.WritableByteChannel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.alibaba.otter.canal.client.CanalConnector;
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningData;
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningListener;
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor;
|
||||
import com.alibaba.otter.canal.common.utils.AddressUtils;
|
||||
import com.alibaba.otter.canal.common.utils.BooleanMutex;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.protocol.CanalEntry.Entry;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Ack;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.ClientAck;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.ClientAuth;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.ClientRollback;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Compression;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Get;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Handshake;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Messages;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Packet;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.PacketType;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Sub;
|
||||
import com.alibaba.otter.canal.protocol.CanalPacket.Unsub;
|
||||
import com.alibaba.otter.canal.protocol.ClientIdentity;
|
||||
import com.alibaba.otter.canal.protocol.Message;
|
||||
import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
||||
import com.google.protobuf.ByteString;
|
||||
|
||||
/**
|
||||
* 基于{@linkplain CanalServerWithNetty}定义的网络协议接口,对于canal数据进行get/rollback/ack等操作
|
||||
*
|
||||
* @author jianghang 2012-10-24 下午05:37:20
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class SimpleCanalConnector implements CanalConnector {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(SimpleCanalConnector.class);
|
||||
private SocketAddress address;
|
||||
private String username;
|
||||
private String password;
|
||||
private int soTimeout = 60000; // milliseconds
|
||||
private String filter; // 记录上一次的filter提交值,便于自动重试时提交
|
||||
|
||||
private final ByteBuffer readHeader = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN);
|
||||
private final ByteBuffer writeHeader = ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN);
|
||||
private SocketChannel channel;
|
||||
private ReadableByteChannel readableChannel;
|
||||
private WritableByteChannel writableChannel;
|
||||
private List<Compression> supportedCompressions = new ArrayList<Compression>();
|
||||
private ClientIdentity clientIdentity;
|
||||
private ClientRunningMonitor runningMonitor; // 运行控制
|
||||
private ZkClientx zkClientx;
|
||||
private BooleanMutex mutex = new BooleanMutex(false);
|
||||
private volatile boolean connected = false; // 代表connected是否已正常执行,因为有HA,不代表在工作中
|
||||
private boolean rollbackOnConnect = true; // 是否在connect链接成功后,自动执行rollback操作
|
||||
private boolean rollbackOnDisConnect = false; // 是否在connect链接成功后,自动执行rollback操作
|
||||
|
||||
// 读写数据分别使用不同的锁进行控制,减小锁粒度,读也需要排他锁,并发度容易造成数据包混乱,反序列化失败
|
||||
private Object readDataLock = new Object();
|
||||
private Object writeDataLock = new Object();
|
||||
|
||||
public SimpleCanalConnector(SocketAddress address, String username, String password, String destination){
|
||||
this(address, username, password, destination, 60000);
|
||||
}
|
||||
|
||||
public SimpleCanalConnector(SocketAddress address, String username, String password, String destination,
|
||||
int soTimeout){
|
||||
this.address = address;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.soTimeout = soTimeout;
|
||||
this.clientIdentity = new ClientIdentity(destination, (short) 1001);
|
||||
}
|
||||
|
||||
public void connect() throws CanalClientException {
|
||||
if (connected) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (runningMonitor != null) {
|
||||
if (!runningMonitor.isStart()) {
|
||||
runningMonitor.start();
|
||||
}
|
||||
} else {
|
||||
waitClientRunning();
|
||||
doConnect();
|
||||
if (filter != null) { // 如果存在条件,说明是自动切换,基于上一次的条件订阅一次
|
||||
subscribe(filter);
|
||||
}
|
||||
if (rollbackOnConnect) {
|
||||
rollback();
|
||||
}
|
||||
}
|
||||
|
||||
connected = true;
|
||||
}
|
||||
|
||||
public void disconnect() throws CanalClientException {
|
||||
if (rollbackOnDisConnect && channel.isConnected()) {
|
||||
rollback();
|
||||
}
|
||||
|
||||
connected = false;
|
||||
if (runningMonitor != null) {
|
||||
if (runningMonitor.isStart()) {
|
||||
runningMonitor.stop();
|
||||
}
|
||||
} else {
|
||||
doDisconnnect();
|
||||
}
|
||||
}
|
||||
|
||||
private InetSocketAddress doConnect() throws CanalClientException {
|
||||
try {
|
||||
channel = SocketChannel.open();
|
||||
channel.socket().setSoTimeout(soTimeout);
|
||||
SocketAddress address = getAddress();
|
||||
if (address == null) {
|
||||
address = getNextAddress();
|
||||
}
|
||||
channel.connect(address);
|
||||
readableChannel = Channels.newChannel(channel.socket().getInputStream());
|
||||
writableChannel = Channels.newChannel(channel.socket().getOutputStream());
|
||||
Packet p = Packet.parseFrom(readNextPacket());
|
||||
if (p.getVersion() != 1) {
|
||||
throw new CanalClientException("unsupported version at this client.");
|
||||
}
|
||||
|
||||
if (p.getType() != PacketType.HANDSHAKE) {
|
||||
throw new CanalClientException("expect handshake but found other type.");
|
||||
}
|
||||
//
|
||||
Handshake handshake = Handshake.parseFrom(p.getBody());
|
||||
supportedCompressions.addAll(handshake.getSupportedCompressionsList());
|
||||
//
|
||||
ClientAuth ca = ClientAuth.newBuilder()
|
||||
.setUsername(username != null ? username : "")
|
||||
.setPassword(ByteString.copyFromUtf8(password != null ? password : ""))
|
||||
.setNetReadTimeout(soTimeout)
|
||||
.setNetWriteTimeout(soTimeout)
|
||||
.build();
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.CLIENTAUTHENTICATION)
|
||||
.setBody(ca.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
//
|
||||
Packet ack = Packet.parseFrom(readNextPacket());
|
||||
if (ack.getType() != PacketType.ACK) {
|
||||
throw new CanalClientException("unexpected packet type when ack is expected");
|
||||
}
|
||||
|
||||
Ack ackBody = Ack.parseFrom(ack.getBody());
|
||||
if (ackBody.getErrorCode() > 0) {
|
||||
throw new CanalClientException("something goes wrong when doing authentication: "
|
||||
+ ackBody.getErrorMessage());
|
||||
}
|
||||
|
||||
connected = true;
|
||||
return new InetSocketAddress(channel.socket().getLocalAddress(), channel.socket().getLocalPort());
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void doDisconnnect() throws CanalClientException {
|
||||
if (readableChannel != null) {
|
||||
quietlyClose(readableChannel);
|
||||
readableChannel = null;
|
||||
}
|
||||
if (writableChannel != null) {
|
||||
quietlyClose(writableChannel);
|
||||
writableChannel = null;
|
||||
}
|
||||
if (channel != null) {
|
||||
quietlyClose(channel);
|
||||
channel = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void quietlyClose(Channel channel) {
|
||||
try {
|
||||
channel.close();
|
||||
} catch (IOException e) {
|
||||
logger.warn("exception on closing channel:{} \n {}", channel, e);
|
||||
}
|
||||
}
|
||||
|
||||
public void subscribe() throws CanalClientException {
|
||||
subscribe(""); // 传递空字符即可
|
||||
}
|
||||
|
||||
public void subscribe(String filter) throws CanalClientException {
|
||||
waitClientRunning();
|
||||
try {
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.SUBSCRIPTION)
|
||||
.setBody(Sub.newBuilder()
|
||||
.setDestination(clientIdentity.getDestination())
|
||||
.setClientId(String.valueOf(clientIdentity.getClientId()))
|
||||
.setFilter(filter != null ? filter : "")
|
||||
.build()
|
||||
.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
//
|
||||
Packet p = Packet.parseFrom(readNextPacket());
|
||||
Ack ack = Ack.parseFrom(p.getBody());
|
||||
if (ack.getErrorCode() > 0) {
|
||||
throw new CanalClientException("failed to subscribe with reason: " + ack.getErrorMessage());
|
||||
}
|
||||
|
||||
clientIdentity.setFilter(filter);
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void unsubscribe() throws CanalClientException {
|
||||
waitClientRunning();
|
||||
try {
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.UNSUBSCRIPTION)
|
||||
.setBody(Unsub.newBuilder()
|
||||
.setDestination(clientIdentity.getDestination())
|
||||
.setClientId(String.valueOf(clientIdentity.getClientId()))
|
||||
.build()
|
||||
.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
//
|
||||
Packet p = Packet.parseFrom(readNextPacket());
|
||||
Ack ack = Ack.parseFrom(p.getBody());
|
||||
if (ack.getErrorCode() > 0) {
|
||||
throw new CanalClientException("failed to unSubscribe with reason: " + ack.getErrorMessage());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public Message get(int batchSize) throws CanalClientException {
|
||||
return get(batchSize, null, null);
|
||||
}
|
||||
|
||||
public Message get(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException {
|
||||
Message message = getWithoutAck(batchSize, timeout, unit);
|
||||
ack(message.getId());
|
||||
return message;
|
||||
}
|
||||
|
||||
public Message getWithoutAck(int batchSize) throws CanalClientException {
|
||||
return getWithoutAck(batchSize, null, null);
|
||||
}
|
||||
|
||||
public Message getWithoutAck(int batchSize, Long timeout, TimeUnit unit) throws CanalClientException {
|
||||
waitClientRunning();
|
||||
try {
|
||||
int size = (batchSize <= 0) ? 1000 : batchSize;
|
||||
long time = (timeout == null || timeout < 0) ? -1 : timeout; // -1代表不做timeout控制
|
||||
if (unit == null) {
|
||||
unit = TimeUnit.MILLISECONDS;
|
||||
}
|
||||
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.GET)
|
||||
.setBody(Get.newBuilder()
|
||||
.setAutoAck(false)
|
||||
.setDestination(clientIdentity.getDestination())
|
||||
.setClientId(String.valueOf(clientIdentity.getClientId()))
|
||||
.setFetchSize(size)
|
||||
.setTimeout(time)
|
||||
.setUnit(unit.ordinal())
|
||||
.build()
|
||||
.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
return receiveMessages();
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private Message receiveMessages() throws IOException {
|
||||
Packet p = Packet.parseFrom(readNextPacket());
|
||||
switch (p.getType()) {
|
||||
case MESSAGES: {
|
||||
if (!p.getCompression().equals(Compression.NONE)) {
|
||||
throw new CanalClientException("compression is not supported in this connector");
|
||||
}
|
||||
|
||||
Messages messages = Messages.parseFrom(p.getBody());
|
||||
Message result = new Message(messages.getBatchId());
|
||||
for (ByteString byteString : messages.getMessagesList()) {
|
||||
result.addEntry(Entry.parseFrom(byteString));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
case ACK: {
|
||||
Ack ack = Ack.parseFrom(p.getBody());
|
||||
throw new CanalClientException("something goes wrong with reason: " + ack.getErrorMessage());
|
||||
}
|
||||
default: {
|
||||
throw new CanalClientException("unexpected packet type: " + p.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ack(long batchId) throws CanalClientException {
|
||||
waitClientRunning();
|
||||
ClientAck ca = ClientAck.newBuilder()
|
||||
.setDestination(clientIdentity.getDestination())
|
||||
.setClientId(String.valueOf(clientIdentity.getClientId()))
|
||||
.setBatchId(batchId)
|
||||
.build();
|
||||
try {
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.CLIENTACK)
|
||||
.setBody(ca.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void rollback(long batchId) throws CanalClientException {
|
||||
waitClientRunning();
|
||||
ClientRollback ca = ClientRollback.newBuilder()
|
||||
.setDestination(clientIdentity.getDestination())
|
||||
.setClientId(String.valueOf(clientIdentity.getClientId()))
|
||||
.setBatchId(batchId)
|
||||
.build();
|
||||
try {
|
||||
writeWithHeader(Packet.newBuilder()
|
||||
.setType(PacketType.CLIENTROLLBACK)
|
||||
.setBody(ca.toByteString())
|
||||
.build()
|
||||
.toByteArray());
|
||||
} catch (IOException e) {
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void rollback() throws CanalClientException {
|
||||
waitClientRunning();
|
||||
rollback(0);// 0代笔未设置
|
||||
}
|
||||
|
||||
// ==================== helper method ====================
|
||||
|
||||
private void writeWithHeader(byte[] body) throws IOException {
|
||||
writeWithHeader(writableChannel, body);
|
||||
}
|
||||
|
||||
private byte[] readNextPacket() throws IOException {
|
||||
return readNextPacket(readableChannel);
|
||||
}
|
||||
|
||||
private void writeWithHeader(WritableByteChannel channel, byte[] body) throws IOException {
|
||||
synchronized (writeDataLock) {
|
||||
writeHeader.clear();
|
||||
writeHeader.putInt(body.length);
|
||||
writeHeader.flip();
|
||||
channel.write(writeHeader);
|
||||
channel.write(ByteBuffer.wrap(body));
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] readNextPacket(ReadableByteChannel channel) throws IOException {
|
||||
synchronized (readDataLock) {
|
||||
readHeader.clear();
|
||||
read(channel, readHeader);
|
||||
int bodyLen = readHeader.getInt(0);
|
||||
ByteBuffer bodyBuf = ByteBuffer.allocate(bodyLen).order(ByteOrder.BIG_ENDIAN);
|
||||
read(channel, bodyBuf);
|
||||
return bodyBuf.array();
|
||||
}
|
||||
}
|
||||
|
||||
private void read(ReadableByteChannel channel, ByteBuffer buffer) throws IOException {
|
||||
while (buffer.hasRemaining()) {
|
||||
int r = channel.read(buffer);
|
||||
if (r == -1) {
|
||||
throw new IOException("end of stream when reading header");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void initClientRunningMonitor(ClientIdentity clientIdentity) {
|
||||
if (zkClientx != null && clientIdentity != null && runningMonitor == null) {
|
||||
ClientRunningData clientData = new ClientRunningData();
|
||||
clientData.setClientId(clientIdentity.getClientId());
|
||||
clientData.setAddress(AddressUtils.getHostIp());
|
||||
|
||||
runningMonitor = new ClientRunningMonitor();
|
||||
runningMonitor.setDestination(clientIdentity.getDestination());
|
||||
runningMonitor.setZkClient(zkClientx);
|
||||
runningMonitor.setClientData(clientData);
|
||||
runningMonitor.setListener(new ClientRunningListener() {
|
||||
|
||||
public InetSocketAddress processActiveEnter() {
|
||||
InetSocketAddress address = doConnect();
|
||||
mutex.set(true);
|
||||
if (filter != null) { // 如果存在条件,说明是自动切换,基于上一次的条件订阅一次
|
||||
subscribe(filter);
|
||||
}
|
||||
|
||||
if (rollbackOnConnect) {
|
||||
rollback();
|
||||
}
|
||||
|
||||
return address;
|
||||
}
|
||||
|
||||
public void processActiveExit() {
|
||||
mutex.set(false);
|
||||
doDisconnnect();
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void waitClientRunning() {
|
||||
try {
|
||||
if (zkClientx != null) {
|
||||
if (!connected) {// 未调用connect
|
||||
throw new CanalClientException("should connect first");
|
||||
}
|
||||
|
||||
mutex.get();// 阻塞等待
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new CanalClientException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkValid() {
|
||||
if (zkClientx != null) {
|
||||
return mutex.state();
|
||||
} else {
|
||||
return true;// 默认都放过
|
||||
}
|
||||
}
|
||||
|
||||
public SocketAddress getNextAddress() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public SocketAddress getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public int getSoTimeout() {
|
||||
return soTimeout;
|
||||
}
|
||||
|
||||
public void setSoTimeout(int soTimeout) {
|
||||
this.soTimeout = soTimeout;
|
||||
}
|
||||
|
||||
public void setZkClientx(ZkClientx zkClientx) {
|
||||
this.zkClientx = zkClientx;
|
||||
initClientRunningMonitor(this.clientIdentity);
|
||||
}
|
||||
|
||||
public void setRollbackOnConnect(boolean rollbackOnConnect) {
|
||||
this.rollbackOnConnect = rollbackOnConnect;
|
||||
}
|
||||
|
||||
public void setRollbackOnDisConnect(boolean rollbackOnDisConnect) {
|
||||
this.rollbackOnDisConnect = rollbackOnDisConnect;
|
||||
}
|
||||
|
||||
public void setFilter(String filter) {
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package com.alibaba.otter.canal.client.impl;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.otter.canal.client.CanalNodeAccessStrategy;
|
||||
|
||||
/**
|
||||
* 简单版本的node访问实现
|
||||
*
|
||||
* @author jianghang 2012-10-29 下午08:00:23
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class SimpleNodeAccessStrategy implements CanalNodeAccessStrategy {
|
||||
|
||||
private List<SocketAddress> nodes = new ArrayList<SocketAddress>();
|
||||
private int index = 0;
|
||||
|
||||
public SimpleNodeAccessStrategy(List<? extends SocketAddress> nodes){
|
||||
if (nodes == null || nodes.size() < 1) {
|
||||
throw new IllegalArgumentException("at least 1 node required.");
|
||||
}
|
||||
this.nodes.addAll(nodes);
|
||||
}
|
||||
|
||||
public SocketAddress nextNode() {
|
||||
try {
|
||||
return nodes.get(index);
|
||||
} finally {
|
||||
index = (index + 1) % nodes.size();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public SocketAddress currentNode() {
|
||||
return nodes.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package com.alibaba.otter.canal.client.impl.running;
|
||||
|
||||
/**
|
||||
* client running状态信息
|
||||
*
|
||||
* @author jianghang 2012-11-22 下午03:41:50
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ClientRunningData {
|
||||
|
||||
private short clientId;
|
||||
private String address;
|
||||
private boolean active = true;
|
||||
|
||||
public short getClientId() {
|
||||
return clientId;
|
||||
}
|
||||
|
||||
public void setClientId(short clientId) {
|
||||
this.clientId = clientId;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public boolean isActive() {
|
||||
return active;
|
||||
}
|
||||
|
||||
public void setActive(boolean active) {
|
||||
this.active = active;
|
||||
}
|
||||
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.alibaba.otter.canal.client.impl.running;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* 触发一下mainstem发生切换
|
||||
*
|
||||
* @author jianghang 2012-9-11 下午02:26:03
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface ClientRunningListener {
|
||||
|
||||
/**
|
||||
* 触发现在轮到自己做为active,需要载入上一个active的上下文数据
|
||||
*/
|
||||
public InetSocketAddress processActiveEnter();
|
||||
|
||||
/**
|
||||
* 触发一下当前active模式失败
|
||||
*/
|
||||
public void processActiveExit();
|
||||
|
||||
}
|
||||
+247
@@ -0,0 +1,247 @@
|
||||
package com.alibaba.otter.canal.client.impl.running;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.I0Itec.zkclient.IZkDataListener;
|
||||
import org.I0Itec.zkclient.exception.ZkException;
|
||||
import org.I0Itec.zkclient.exception.ZkInterruptedException;
|
||||
import org.I0Itec.zkclient.exception.ZkNoNodeException;
|
||||
import org.I0Itec.zkclient.exception.ZkNodeExistsException;
|
||||
import org.apache.zookeeper.CreateMode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.MDC;
|
||||
|
||||
import com.alibaba.otter.canal.common.AbstractCanalLifeCycle;
|
||||
import com.alibaba.otter.canal.common.utils.BooleanMutex;
|
||||
import com.alibaba.otter.canal.common.utils.JsonUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
|
||||
import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
||||
|
||||
/**
|
||||
* clinet running控制
|
||||
*
|
||||
* @author jianghang 2012-11-22 下午03:43:01
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ClientRunningMonitor extends AbstractCanalLifeCycle {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ClientRunningMonitor.class);
|
||||
private ZkClientx zkClient;
|
||||
private String destination;
|
||||
private ClientRunningData clientData;
|
||||
private IZkDataListener dataListener;
|
||||
private BooleanMutex mutex = new BooleanMutex(false);
|
||||
private volatile boolean release = false;
|
||||
private volatile ClientRunningData activeData;
|
||||
private ScheduledExecutorService delayExector = Executors.newScheduledThreadPool(1);
|
||||
private ClientRunningListener listener;
|
||||
private int delayTime = 5;
|
||||
|
||||
public ClientRunningMonitor(){
|
||||
dataListener = new IZkDataListener() {
|
||||
|
||||
public void handleDataChange(String dataPath, Object data) throws Exception {
|
||||
MDC.put("destination", destination);
|
||||
ClientRunningData runningData = JsonUtils.unmarshalFromByte((byte[]) data, ClientRunningData.class);
|
||||
if (!isMine(runningData.getAddress())) {
|
||||
mutex.set(false);
|
||||
}
|
||||
|
||||
if (!runningData.isActive() && isMine(runningData.getAddress())) { // 说明出现了主动释放的操作,并且本机之前是active
|
||||
release = true;
|
||||
releaseRunning();// 彻底释放mainstem
|
||||
}
|
||||
|
||||
activeData = (ClientRunningData) runningData;
|
||||
}
|
||||
|
||||
public void handleDataDeleted(String dataPath) throws Exception {
|
||||
MDC.put("destination", destination);
|
||||
mutex.set(false);
|
||||
// 触发一下退出,可能是人为干预的释放操作或者网络闪断引起的session expired timeout
|
||||
processActiveExit();
|
||||
if (!release && activeData != null && isMine(activeData.getAddress())) {
|
||||
// 如果上一次active的状态就是本机,则即时触发一下active抢占
|
||||
initRunning();
|
||||
} else {
|
||||
// 否则就是等待delayTime,避免因网络瞬端或者zk异常,导致出现频繁的切换操作
|
||||
delayExector.schedule(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
initRunning();
|
||||
}
|
||||
}, delayTime, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public void start() {
|
||||
super.start();
|
||||
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination, clientData.getClientId());
|
||||
zkClient.subscribeDataChanges(path, dataListener);
|
||||
initRunning();
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
super.stop();
|
||||
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination, clientData.getClientId());
|
||||
zkClient.unsubscribeDataChanges(path, dataListener);
|
||||
releaseRunning(); // 尝试一下release
|
||||
}
|
||||
|
||||
// 改动记录:
|
||||
// 1,在方法上加synchronized关键字,保证同步顺序执行;
|
||||
// 2,判断Zk上已经存在的activeData是否是本机,是的话把mutex重置为true,否则会导致死锁
|
||||
// 3,增加异常处理,保证出现异常时,running节点能被删除,否则会导致死锁
|
||||
public synchronized void initRunning() {
|
||||
if (!isStart()) {
|
||||
return;
|
||||
}
|
||||
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination, clientData.getClientId());
|
||||
// 序列化
|
||||
byte[] bytes = JsonUtils.marshalToByte(clientData);
|
||||
try {
|
||||
mutex.set(false);
|
||||
zkClient.create(path, bytes, CreateMode.EPHEMERAL);
|
||||
processActiveEnter();// 触发一下事件
|
||||
activeData = clientData;
|
||||
mutex.set(true);
|
||||
} catch (ZkNodeExistsException e) {
|
||||
bytes = zkClient.readData(path, true);
|
||||
if (bytes == null) {// 如果不存在节点,立即尝试一次
|
||||
initRunning();
|
||||
} else {
|
||||
activeData = JsonUtils.unmarshalFromByte(bytes, ClientRunningData.class);
|
||||
// 如果发现已经存在,判断一下是否自己,避免活锁
|
||||
if (activeData.getAddress().contains(":") && isMine(activeData.getAddress())) {
|
||||
mutex.set(true);
|
||||
}
|
||||
}
|
||||
} catch (ZkNoNodeException e) {
|
||||
zkClient.createPersistent(ZookeeperPathUtils.getClientIdNodePath(this.destination, clientData.getClientId()),
|
||||
true); // 尝试创建父节点
|
||||
initRunning();
|
||||
} catch (Throwable t) {
|
||||
logger.error(MessageFormat.format("There is an error when execute initRunning method, with destination [{0}].",
|
||||
destination),
|
||||
t);
|
||||
// 出现任何异常尝试release
|
||||
releaseRunning();
|
||||
throw new CanalClientException("something goes wrong in initRunning method. ", t);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 阻塞等待自己成为active,如果自己成为active,立马返回
|
||||
*
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void waitForActive() throws InterruptedException {
|
||||
initRunning();
|
||||
mutex.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查当前的状态
|
||||
*/
|
||||
public boolean check() {
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination, clientData.getClientId());
|
||||
try {
|
||||
byte[] bytes = zkClient.readData(path);
|
||||
ClientRunningData eventData = JsonUtils.unmarshalFromByte(bytes, ClientRunningData.class);
|
||||
activeData = eventData;// 更新下为最新值
|
||||
// 检查下nid是否为自己
|
||||
boolean result = isMine(activeData.getAddress());
|
||||
if (!result) {
|
||||
logger.warn("canal is running in [{}] , but not in [{}]",
|
||||
activeData.getAddress(),
|
||||
clientData.getAddress());
|
||||
}
|
||||
return result;
|
||||
} catch (ZkNoNodeException e) {
|
||||
logger.warn("canal is not run any in node");
|
||||
return false;
|
||||
} catch (ZkInterruptedException e) {
|
||||
logger.warn("canal check is interrupt");
|
||||
Thread.interrupted();// 清除interrupt标记
|
||||
return check();
|
||||
} catch (ZkException e) {
|
||||
logger.warn("canal check is failed");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean releaseRunning() {
|
||||
if (check()) {
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination, clientData.getClientId());
|
||||
zkClient.delete(path);
|
||||
mutex.set(false);
|
||||
processActiveExit();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ====================== helper method ======================
|
||||
|
||||
private boolean isMine(String address) {
|
||||
return address.equals(clientData.getAddress());
|
||||
}
|
||||
|
||||
private void processActiveEnter() {
|
||||
if (listener != null) {
|
||||
// 触发回调,建立与server的socket链接
|
||||
InetSocketAddress connectAddress = listener.processActiveEnter();
|
||||
String address = connectAddress.getAddress().getHostAddress() + ":" + connectAddress.getPort();
|
||||
this.clientData.setAddress(address);
|
||||
|
||||
String path = ZookeeperPathUtils.getDestinationClientRunning(this.destination,
|
||||
this.clientData.getClientId());
|
||||
// 序列化
|
||||
byte[] bytes = JsonUtils.marshalToByte(clientData);
|
||||
zkClient.writeData(path, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
private void processActiveExit() {
|
||||
if (listener != null) {
|
||||
listener.processActiveExit();
|
||||
}
|
||||
}
|
||||
|
||||
public void setListener(ClientRunningListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
// ===================== setter / getter =======================
|
||||
|
||||
public void setDestination(String destination) {
|
||||
this.destination = destination;
|
||||
}
|
||||
|
||||
public void setClientData(ClientRunningData clientData) {
|
||||
this.clientData = clientData;
|
||||
}
|
||||
|
||||
public void setDelayTime(int delayTime) {
|
||||
this.delayTime = delayTime;
|
||||
}
|
||||
|
||||
public void setZkClient(ZkClientx zkClient) {
|
||||
this.zkClient = zkClient;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.alibaba.otter.canal.client.running;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
public class AbstractZkTest {
|
||||
|
||||
protected String destination = "ljhtest1";
|
||||
protected String cluster1 = "127.0.0.1:2188";
|
||||
protected String cluster2 = "127.0.0.1:2188,127.0.0.1:2188";
|
||||
|
||||
public void sleep(long time) {
|
||||
try {
|
||||
Thread.sleep(time);
|
||||
} catch (InterruptedException e) {
|
||||
Assert.fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
package com.alibaba.otter.canal.client.running;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import org.apache.commons.lang.math.RandomUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningData;
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningListener;
|
||||
import com.alibaba.otter.canal.client.impl.running.ClientRunningMonitor;
|
||||
import com.alibaba.otter.canal.common.utils.AddressUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
|
||||
|
||||
public class ClientRunningTest extends AbstractZkTest {
|
||||
|
||||
private ZkClientx zkclientx = new ZkClientx(cluster1 + ";" + cluster2);
|
||||
private short clientId = 1001;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
String path = ZookeeperPathUtils.getDestinationPath(destination);
|
||||
zkclientx.deleteRecursive(path);
|
||||
|
||||
zkclientx.createPersistent(ZookeeperPathUtils.getClientIdNodePath(this.destination, clientId), true);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
String path = ZookeeperPathUtils.getDestinationPath(destination);
|
||||
zkclientx.deleteRecursive(path);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneServer() {
|
||||
final CountDownLatch countLatch = new CountDownLatch(2);
|
||||
ClientRunningMonitor runningMonitor = buildClientRunning(countLatch, clientId, 2088);
|
||||
runningMonitor.start();
|
||||
sleep(2000L);
|
||||
runningMonitor.stop();
|
||||
sleep(2000L);
|
||||
|
||||
if (countLatch.getCount() != 0) {
|
||||
Assert.fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiServer() {
|
||||
final CountDownLatch countLatch = new CountDownLatch(30);
|
||||
final ClientRunningMonitor runningMonitor1 = buildClientRunning(countLatch, clientId, 2088);
|
||||
final ClientRunningMonitor runningMonitor2 = buildClientRunning(countLatch, clientId, 2089);
|
||||
final ClientRunningMonitor runningMonitor3 = buildClientRunning(countLatch, clientId, 2090);
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(3);
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor1.isStart()) {
|
||||
runningMonitor1.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
runningMonitor1.stop();
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor2.isStart()) {
|
||||
runningMonitor2.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
runningMonitor2.stop();
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor3.isStart()) {
|
||||
runningMonitor3.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
runningMonitor3.stop();
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
sleep(30000L);
|
||||
}
|
||||
|
||||
private ClientRunningMonitor buildClientRunning(final CountDownLatch countLatch, final short clientId,
|
||||
final int port) {
|
||||
ClientRunningData clientData = new ClientRunningData();
|
||||
clientData.setClientId(clientId);
|
||||
clientData.setAddress(AddressUtils.getHostIp());
|
||||
|
||||
ClientRunningMonitor runningMonitor = new ClientRunningMonitor();
|
||||
runningMonitor.setDestination(destination);
|
||||
runningMonitor.setZkClient(zkclientx);
|
||||
runningMonitor.setClientData(clientData);
|
||||
runningMonitor.setListener(new ClientRunningListener() {
|
||||
|
||||
public InetSocketAddress processActiveEnter() {
|
||||
System.out.println(String.format("clientId:%s port:%s has start", clientId, port));
|
||||
countLatch.countDown();
|
||||
return new InetSocketAddress(AddressUtils.getHostIp(), port);
|
||||
}
|
||||
|
||||
public void processActiveExit() {
|
||||
countLatch.countDown();
|
||||
System.out.println(String.format("clientId:%s port:%s has stop", clientId, port));
|
||||
}
|
||||
|
||||
});
|
||||
runningMonitor.setDelayTime(1);
|
||||
return runningMonitor;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<configuration scan="true" scanPeriod=" 5 seconds">
|
||||
|
||||
<jmxConfigurator />
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56} - %msg%n
|
||||
</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="INFO">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
+291
@@ -0,0 +1,291 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<profiles version="12">
|
||||
<profile kind="CodeFormatterProfile" name="canal-format" version="12">
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="4"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="84"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="18"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
|
||||
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="true"/>
|
||||
</profile>
|
||||
</profiles>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
|
||||
* @return the ${bare_field_name}
|
||||
*/</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
|
||||
* @param ${param} the ${bare_field_name} to set
|
||||
*/</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
|
||||
* ${tags}
|
||||
*/</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment"/><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
|
||||
* @author ${user} ${date} ${time}
|
||||
* @since 1.0.0
|
||||
*/</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
|
||||
*
|
||||
*/</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
|
||||
* ${tags}
|
||||
*/</template><template autoinsert="false" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment"/><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
|
||||
* ${tags}
|
||||
* ${see_to_target}
|
||||
*/</template><template autoinsert="false" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">${filecomment}
|
||||
${package_declaration}
|
||||
${typecomment}
|
||||
${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
|
||||
</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
|
||||
</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
|
||||
</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
|
||||
</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
|
||||
${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
|
||||
${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
|
||||
// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template></templates>
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal</artifactId>
|
||||
<version>1.0.25-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<artifactId>canal.common</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>canal common module for otter ${project.version}</name>
|
||||
<url>http://b2b-doc.alibaba-inc.com/display/opentech/Otter</url>
|
||||
<dependencies>
|
||||
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-all</artifactId>
|
||||
</dependency>
|
||||
<!-- zk -->
|
||||
<dependency>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.101tec</groupId>
|
||||
<artifactId>zkclient</artifactId>
|
||||
</dependency>
|
||||
<!-- external -->
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
<artifactId>commons-lang</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
<!-- log -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-orm</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
<version>${spring_version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- junit -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,33 @@
|
||||
package com.alibaba.otter.canal.common;
|
||||
|
||||
/**
|
||||
* 基本实现
|
||||
*
|
||||
* @author jianghang 2012-7-12 上午10:11:07
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public abstract class AbstractCanalLifeCycle implements CanalLifeCycle {
|
||||
|
||||
protected volatile boolean running = false; // 是否处于运行中
|
||||
|
||||
public boolean isStart() {
|
||||
return running;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (running) {
|
||||
throw new CanalException(this.getClass().getName() + " has startup , don't repeat start");
|
||||
}
|
||||
|
||||
running = true;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (!running) {
|
||||
throw new CanalException(this.getClass().getName() + " isn't start , please check");
|
||||
}
|
||||
|
||||
running = false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.alibaba.otter.canal.common;
|
||||
|
||||
import org.apache.commons.lang.exception.NestableRuntimeException;
|
||||
|
||||
/**
|
||||
* @author jianghang 2012-7-12 上午10:10:31
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class CanalException extends NestableRuntimeException {
|
||||
|
||||
private static final long serialVersionUID = -654893533794556357L;
|
||||
|
||||
public CanalException(String errorCode){
|
||||
super(errorCode);
|
||||
}
|
||||
|
||||
public CanalException(String errorCode, Throwable cause){
|
||||
super(errorCode, cause);
|
||||
}
|
||||
|
||||
public CanalException(String errorCode, String errorDesc){
|
||||
super(errorCode + ":" + errorDesc);
|
||||
}
|
||||
|
||||
public CanalException(String errorCode, String errorDesc, Throwable cause){
|
||||
super(errorCode + ":" + errorDesc, cause);
|
||||
}
|
||||
|
||||
public CanalException(Throwable cause){
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public Throwable fillInStackTrace() {
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package com.alibaba.otter.canal.common;
|
||||
|
||||
/**
|
||||
* @author jianghang 2012-7-12 上午09:39:33
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalLifeCycle {
|
||||
|
||||
void start();
|
||||
|
||||
void stop();
|
||||
|
||||
boolean isStart();
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.alibaba.otter.canal.common.alarm;
|
||||
|
||||
import com.alibaba.otter.canal.common.CanalLifeCycle;
|
||||
|
||||
/**
|
||||
* canal报警处理机制
|
||||
*
|
||||
* @author jianghang 2012-8-22 下午10:08:56
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface CanalAlarmHandler extends CanalLifeCycle {
|
||||
|
||||
/**
|
||||
* 发送对应destination的报警
|
||||
*
|
||||
* @param destination
|
||||
* @param msg
|
||||
*/
|
||||
void sendAlarm(String destination, String msg);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.alibaba.otter.canal.common.alarm;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.alibaba.otter.canal.common.AbstractCanalLifeCycle;
|
||||
|
||||
/**
|
||||
* 基于log的alarm机制实现
|
||||
*
|
||||
* @author jianghang 2012-8-22 下午10:12:35
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class LogAlarmHandler extends AbstractCanalLifeCycle implements CanalAlarmHandler {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(LogAlarmHandler.class);
|
||||
|
||||
public void sendAlarm(String destination, String msg) {
|
||||
logger.error("destination:{}[{}]", new Object[] { destination, msg });
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.Enumeration;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class AddressUtils {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(AddressUtils.class);
|
||||
private static final String LOCALHOST_IP = "127.0.0.1";
|
||||
private static final String EMPTY_IP = "0.0.0.0";
|
||||
private static final Pattern IP_PATTERN = Pattern.compile("[0-9]{1,3}(\\.[0-9]{1,3}){3,}");
|
||||
|
||||
public static boolean isAvailablePort(int port) {
|
||||
ServerSocket ss = null;
|
||||
try {
|
||||
ss = new ServerSocket(port);
|
||||
ss.bind(null);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} finally {
|
||||
if (ss != null) {
|
||||
try {
|
||||
ss.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isValidHostAddress(InetAddress address) {
|
||||
if (address == null || address.isLoopbackAddress()) return false;
|
||||
String name = address.getHostAddress();
|
||||
return (name != null && !EMPTY_IP.equals(name) && !LOCALHOST_IP.equals(name) && IP_PATTERN.matcher(name)
|
||||
.matches());
|
||||
}
|
||||
|
||||
public static String getHostIp() {
|
||||
InetAddress address = getHostAddress();
|
||||
return address == null ? null : address.getHostAddress();
|
||||
}
|
||||
|
||||
public static String getHostName() {
|
||||
InetAddress address = getHostAddress();
|
||||
return address == null ? null : address.getHostName();
|
||||
}
|
||||
|
||||
public static InetAddress getHostAddress() {
|
||||
InetAddress localAddress = null;
|
||||
try {
|
||||
localAddress = InetAddress.getLocalHost();
|
||||
if (isValidHostAddress(localAddress)) {
|
||||
return localAddress;
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.warn("Failed to retriving local host ip address, try scan network card ip address. cause: "
|
||||
+ e.getMessage());
|
||||
}
|
||||
try {
|
||||
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
|
||||
if (interfaces != null) {
|
||||
while (interfaces.hasMoreElements()) {
|
||||
try {
|
||||
NetworkInterface network = interfaces.nextElement();
|
||||
Enumeration<InetAddress> addresses = network.getInetAddresses();
|
||||
if (addresses != null) {
|
||||
while (addresses.hasMoreElements()) {
|
||||
try {
|
||||
InetAddress address = addresses.nextElement();
|
||||
if (isValidHostAddress(address)) {
|
||||
return address;
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.warn("Failed to retriving network card ip address. cause:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.warn("Failed to retriving network card ip address. cause:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
logger.warn("Failed to retriving network card ip address. cause:" + e.getMessage());
|
||||
}
|
||||
logger.error("Could not get local host ip address, will use 127.0.0.1 instead.");
|
||||
return localAddress;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
|
||||
|
||||
/**
|
||||
* 实现一个互斥实现,基于Cocurrent中的{@linkplain AbstractQueuedSynchronizer}实现了自己的sync <br/>
|
||||
* 应用场景:系统初始化/授权控制,没权限时阻塞等待。有权限时所有线程都可以快速通过
|
||||
*
|
||||
* <pre>
|
||||
* false : 代表需要被阻塞挂起,等待mutex变为true被唤醒
|
||||
* true : 唤醒被阻塞在false状态下的thread
|
||||
*
|
||||
* BooleanMutex mutex = new BooleanMutex(true);
|
||||
* try {
|
||||
* mutex.get(); //当前状态为true, 不会被阻塞
|
||||
* } catch (InterruptedException e) {
|
||||
* // do something
|
||||
* }
|
||||
*
|
||||
* mutex.set(false);
|
||||
* try {
|
||||
* mutex.get(); //当前状态为false, 会被阻塞直到另一个线程调用mutex.set(true);
|
||||
* } catch (InterruptedException e) {
|
||||
* // do something
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author jianghang 2011-9-23 上午09:58:03
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class BooleanMutex {
|
||||
|
||||
private Sync sync;
|
||||
|
||||
public BooleanMutex(){
|
||||
sync = new Sync();
|
||||
set(false);
|
||||
}
|
||||
|
||||
public BooleanMutex(Boolean mutex){
|
||||
sync = new Sync();
|
||||
set(mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* 阻塞等待Boolean为true
|
||||
*
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void get() throws InterruptedException {
|
||||
sync.innerGet();
|
||||
}
|
||||
|
||||
/**
|
||||
* 阻塞等待Boolean为true,允许设置超时时间
|
||||
*
|
||||
* @param timeout
|
||||
* @param unit
|
||||
* @throws InterruptedException
|
||||
* @throws TimeoutException
|
||||
*/
|
||||
public void get(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
|
||||
sync.innerGet(unit.toNanos(timeout));
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新设置对应的Boolean mutex
|
||||
*
|
||||
* @param mutex
|
||||
*/
|
||||
public void set(Boolean mutex) {
|
||||
if (mutex) {
|
||||
sync.innerSetTrue();
|
||||
} else {
|
||||
sync.innerSetFalse();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean state() {
|
||||
return sync.innerState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronization control for BooleanMutex. Uses AQS sync state to
|
||||
* represent run status
|
||||
*/
|
||||
private final class Sync extends AbstractQueuedSynchronizer {
|
||||
|
||||
private static final long serialVersionUID = 2559471934544126329L;
|
||||
/** State value representing that TRUE */
|
||||
private static final int TRUE = 1;
|
||||
/** State value representing that FALSE */
|
||||
private static final int FALSE = 2;
|
||||
|
||||
private boolean isTrue(int state) {
|
||||
return (state & TRUE) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实现AQS的接口,获取共享锁的判断
|
||||
*/
|
||||
protected int tryAcquireShared(int state) {
|
||||
// 如果为true,直接允许获取锁对象
|
||||
// 如果为false,进入阻塞队列,等待被唤醒
|
||||
return isTrue(getState()) ? 1 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实现AQS的接口,释放共享锁的判断
|
||||
*/
|
||||
protected boolean tryReleaseShared(int ignore) {
|
||||
// 始终返回true,代表可以release
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean innerState() {
|
||||
return isTrue(getState());
|
||||
}
|
||||
|
||||
void innerGet() throws InterruptedException {
|
||||
acquireSharedInterruptibly(0);
|
||||
}
|
||||
|
||||
void innerGet(long nanosTimeout) throws InterruptedException, TimeoutException {
|
||||
if (!tryAcquireSharedNanos(0, nanosTimeout)) throw new TimeoutException();
|
||||
}
|
||||
|
||||
void innerSetTrue() {
|
||||
for (;;) {
|
||||
int s = getState();
|
||||
if (s == TRUE) {
|
||||
return; // 直接退出
|
||||
}
|
||||
if (compareAndSetState(s, TRUE)) {// cas更新状态,避免并发更新true操作
|
||||
releaseShared(0);// 释放一下锁对象,唤醒一下阻塞的Thread
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void innerSetFalse() {
|
||||
for (;;) {
|
||||
int s = getState();
|
||||
if (s == FALSE) {
|
||||
return; // 直接退出
|
||||
}
|
||||
if (compareAndSetState(s, FALSE)) {// cas更新状态,避免并发更新false操作
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import org.apache.commons.lang.builder.ToStringStyle;
|
||||
|
||||
/**
|
||||
* Otter项目内部使用的ToStringStyle
|
||||
*
|
||||
* <pre>
|
||||
* 默认Style输出格式:
|
||||
* Person[name=John Doe,age=33,smoker=false ,time=2010-04-01 00:00:00]
|
||||
* </pre>
|
||||
*
|
||||
* @author jianghang 2010-6-18 上午11:35:27
|
||||
*/
|
||||
public class CanalToStringStyle extends ToStringStyle {
|
||||
|
||||
private static final long serialVersionUID = -6568177374288222145L;
|
||||
|
||||
private static final String DEFAULT_TIME = "yyyy-MM-dd HH:mm:ss";
|
||||
private static final String DEFAULT_DAY = "yyyy-MM-dd";
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 输出格式:
|
||||
* Person[name=John Doe,age=33,smoker=false ,time=2010-04-01 00:00:00]
|
||||
* </pre>
|
||||
*/
|
||||
public static final ToStringStyle TIME_STYLE = new OtterDateStyle(DEFAULT_TIME);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 输出格式:
|
||||
* Person[name=John Doe,age=33,smoker=false ,day=2010-04-01]
|
||||
* </pre>
|
||||
*/
|
||||
public static final ToStringStyle DAY_STYLE = new OtterDateStyle(DEFAULT_DAY);
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 输出格式:
|
||||
* Person[name=John Doe,age=33,smoker=false ,time=2010-04-01 00:00:00]
|
||||
* </pre>
|
||||
*/
|
||||
public static final ToStringStyle DEFAULT_STYLE = CanalToStringStyle.TIME_STYLE;
|
||||
|
||||
// =========================== 自定义style =============================
|
||||
|
||||
/**
|
||||
* 支持日期格式化的ToStringStyle
|
||||
*
|
||||
* @author li.jinl
|
||||
*/
|
||||
private static class OtterDateStyle extends ToStringStyle {
|
||||
|
||||
private static final long serialVersionUID = 5208917932254652886L;
|
||||
|
||||
// 日期format格式
|
||||
private String pattern;
|
||||
|
||||
public OtterDateStyle(String pattern){
|
||||
super();
|
||||
this.setUseShortClassName(true);
|
||||
this.setUseIdentityHashCode(false);
|
||||
// 设置日期format格式
|
||||
this.pattern = pattern;
|
||||
}
|
||||
|
||||
protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
|
||||
// 增加自定义的date对象处理
|
||||
if (value instanceof Date) {
|
||||
value = new SimpleDateFormat(pattern).format(value);
|
||||
}
|
||||
// 后续可以增加其他自定义对象处理
|
||||
buffer.append(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.TypeReference;
|
||||
import com.alibaba.fastjson.serializer.JSONSerializer;
|
||||
import com.alibaba.fastjson.serializer.ObjectSerializer;
|
||||
import com.alibaba.fastjson.serializer.PropertyFilter;
|
||||
import com.alibaba.fastjson.serializer.SerializeConfig;
|
||||
import com.alibaba.fastjson.serializer.SerializeWriter;
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
|
||||
/**
|
||||
* 字节处理相关工具类
|
||||
*
|
||||
* @author jianghang
|
||||
*/
|
||||
public class JsonUtils {
|
||||
|
||||
static {
|
||||
SerializeConfig.getGlobalInstance().put(InetAddress.class, InetAddressSerializer.instance);
|
||||
SerializeConfig.getGlobalInstance().put(Inet4Address.class, InetAddressSerializer.instance);
|
||||
SerializeConfig.getGlobalInstance().put(Inet6Address.class, InetAddressSerializer.instance);
|
||||
}
|
||||
|
||||
public static <T> T unmarshalFromByte(byte[] bytes, Class<T> targetClass) {
|
||||
return (T) JSON.parseObject(bytes, targetClass);// 默认为UTF-8
|
||||
}
|
||||
|
||||
public static <T> T unmarshalFromByte(byte[] bytes, TypeReference<T> type) {
|
||||
return (T) JSON.parseObject(bytes, type.getType());
|
||||
}
|
||||
|
||||
public static byte[] marshalToByte(Object obj) {
|
||||
return JSON.toJSONBytes(obj); // 默认为UTF-8
|
||||
}
|
||||
|
||||
public static byte[] marshalToByte(Object obj, SerializerFeature... features) {
|
||||
return JSON.toJSONBytes(obj, features); // 默认为UTF-8
|
||||
}
|
||||
|
||||
public static <T> T unmarshalFromString(String json, Class<T> targetClass) {
|
||||
return (T) JSON.parseObject(json, targetClass);// 默认为UTF-8
|
||||
}
|
||||
|
||||
public static <T> T unmarshalFromString(String json, TypeReference<T> type) {
|
||||
return (T) JSON.parseObject(json, type);// 默认为UTF-8
|
||||
}
|
||||
|
||||
public static String marshalToString(Object obj) {
|
||||
return JSON.toJSONString(obj); // 默认为UTF-8
|
||||
}
|
||||
|
||||
public static String marshalToString(Object obj, SerializerFeature... features) {
|
||||
return JSON.toJSONString(obj, features); // 默认为UTF-8
|
||||
}
|
||||
|
||||
/**
|
||||
* 可以允许指定一些过滤字段进行生成json对象
|
||||
*/
|
||||
public static String marshalToString(Object obj, String... fliterFields) {
|
||||
final List<String> propertyFliters = Arrays.asList(fliterFields);
|
||||
SerializeWriter out = new SerializeWriter();
|
||||
try {
|
||||
JSONSerializer serializer = new JSONSerializer(out);
|
||||
serializer.getPropertyFilters().add(new PropertyFilter() {
|
||||
|
||||
public boolean apply(Object source, String name, Object value) {
|
||||
return !propertyFliters.contains(name);
|
||||
}
|
||||
|
||||
});
|
||||
serializer.write(obj);
|
||||
return out.toString();
|
||||
} finally {
|
||||
out.close();
|
||||
}
|
||||
}
|
||||
|
||||
public static class InetAddressSerializer implements ObjectSerializer {
|
||||
|
||||
public static InetAddressSerializer instance = new InetAddressSerializer();
|
||||
|
||||
@Override
|
||||
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
|
||||
throws IOException {
|
||||
if (object == null) {
|
||||
serializer.writeNull();
|
||||
return;
|
||||
}
|
||||
|
||||
InetAddress address = (InetAddress) object;
|
||||
// 优先使用name
|
||||
serializer.write(address.getHostName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.lang.Thread.UncaughtExceptionHandler;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author zebin.xuzb 2012-9-20 下午3:47:47
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class NamedThreadFactory implements ThreadFactory {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(NamedThreadFactory.class);
|
||||
final private static String DEFAULT_NAME = "canal-worker";
|
||||
final private String name;
|
||||
final private boolean daemon;
|
||||
final private ThreadGroup group;
|
||||
final private AtomicInteger threadNumber = new AtomicInteger(0);
|
||||
final static UncaughtExceptionHandler uncaughtExceptionHandler = new UncaughtExceptionHandler() {
|
||||
|
||||
public void uncaughtException(Thread t,
|
||||
Throwable e) {
|
||||
logger.error("from " + t.getName(), e);
|
||||
}
|
||||
};
|
||||
|
||||
public NamedThreadFactory(){
|
||||
this(DEFAULT_NAME, true);
|
||||
}
|
||||
|
||||
public NamedThreadFactory(String name){
|
||||
this(name, true);
|
||||
}
|
||||
|
||||
public NamedThreadFactory(String name, boolean daemon){
|
||||
this.name = name;
|
||||
this.daemon = daemon;
|
||||
SecurityManager s = System.getSecurityManager();
|
||||
group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
|
||||
}
|
||||
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(group, r, name + "-" + threadNumber.getAndIncrement(), 0);
|
||||
t.setDaemon(daemon);
|
||||
if (t.getPriority() != Thread.NORM_PRIORITY) {
|
||||
t.setPriority(Thread.NORM_PRIORITY);
|
||||
}
|
||||
|
||||
t.setUncaughtExceptionHandler(uncaughtExceptionHandler);
|
||||
return t;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
package com.alibaba.otter.canal.common.utils;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URLDecoder;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Scanner;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
* @author zebin.xuzb 2012-11-15 下午3:53:09
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public final class UriUtils {
|
||||
|
||||
private final static String SPLIT = "&";
|
||||
private final static String EQUAL = "=";
|
||||
private final static String DEFAULT_ENCODING = "ISO_8859_1";
|
||||
|
||||
private UriUtils(){
|
||||
}
|
||||
|
||||
public static Map<String, String> parseQuery(final String uriString) {
|
||||
URI uri = null;
|
||||
try {
|
||||
uri = new URI(uriString);
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
return parseQuery(uri);
|
||||
}
|
||||
|
||||
public static Map<String, String> parseQuery(final String uriString, final String encoding) {
|
||||
URI uri = null;
|
||||
try {
|
||||
uri = new URI(uriString);
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
return parseQuery(uri, encoding);
|
||||
}
|
||||
|
||||
public static Map<String, String> parseQuery(final URI uri) {
|
||||
return parseQuery(uri, DEFAULT_ENCODING);
|
||||
}
|
||||
|
||||
public static Map<String, String> parseQuery(final URI uri, final String encoding) {
|
||||
if (uri == null || StringUtils.isBlank(uri.getQuery())) {
|
||||
return Collections.EMPTY_MAP;
|
||||
}
|
||||
String query = uri.getRawQuery();
|
||||
HashMap<String, String> params = new HashMap<String, String>();
|
||||
@SuppressWarnings("resource")
|
||||
Scanner scan = new Scanner(query);
|
||||
scan.useDelimiter(SPLIT);
|
||||
while (scan.hasNext()) {
|
||||
String token = scan.next().trim();
|
||||
String[] pair = token.split(EQUAL);
|
||||
String key = decode(pair[0], encoding);
|
||||
String value = null;
|
||||
if (pair.length == 2) {
|
||||
value = decode(pair[1], encoding);
|
||||
}
|
||||
params.put(key, value);
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
private static String decode(final String content, final String encoding) {
|
||||
try {
|
||||
return URLDecoder.decode(content, encoding != null ? encoding : DEFAULT_ENCODING);
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.I0Itec.zkclient.exception.ZkMarshallingError;
|
||||
import org.I0Itec.zkclient.serialize.ZkSerializer;
|
||||
|
||||
/**
|
||||
* 基于string的序列化方式
|
||||
*
|
||||
* @author jianghang 2012-7-11 下午02:57:09
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ByteSerializer implements ZkSerializer {
|
||||
|
||||
public Object deserialize(final byte[] bytes) throws ZkMarshallingError {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public byte[] serialize(final Object data) throws ZkMarshallingError {
|
||||
try {
|
||||
if (data instanceof byte[]) {
|
||||
return (byte[]) data;
|
||||
} else {
|
||||
return ((String) data).getBytes("utf-8");
|
||||
}
|
||||
} catch (final UnsupportedEncodingException e) {
|
||||
throw new ZkMarshallingError(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.I0Itec.zkclient.exception.ZkMarshallingError;
|
||||
import org.I0Itec.zkclient.serialize.ZkSerializer;
|
||||
|
||||
/**
|
||||
* 基于string的序列化方式
|
||||
*
|
||||
* @author jianghang 2012-7-11 下午02:57:09
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class StringSerializer implements ZkSerializer {
|
||||
|
||||
public Object deserialize(final byte[] bytes) throws ZkMarshallingError {
|
||||
try {
|
||||
return new String(bytes, "utf-8");
|
||||
} catch (final UnsupportedEncodingException e) {
|
||||
throw new ZkMarshallingError(e);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] serialize(final Object data) throws ZkMarshallingError {
|
||||
try {
|
||||
return ((String) data).getBytes("utf-8");
|
||||
} catch (final UnsupportedEncodingException e) {
|
||||
throw new ZkMarshallingError(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.I0Itec.zkclient.IZkConnection;
|
||||
import org.I0Itec.zkclient.ZkClient;
|
||||
import org.I0Itec.zkclient.exception.ZkException;
|
||||
import org.I0Itec.zkclient.exception.ZkInterruptedException;
|
||||
import org.I0Itec.zkclient.exception.ZkNoNodeException;
|
||||
import org.I0Itec.zkclient.exception.ZkNodeExistsException;
|
||||
import org.I0Itec.zkclient.serialize.ZkSerializer;
|
||||
import org.apache.zookeeper.CreateMode;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.MigrateMap;
|
||||
|
||||
/**
|
||||
* 使用自定义的ZooKeeperx for zk connection
|
||||
*
|
||||
* @author jianghang 2012-7-10 下午02:31:15
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ZkClientx extends ZkClient {
|
||||
|
||||
// 对于zkclient进行一次缓存,避免一个jvm内部使用多个zk connection
|
||||
private static Map<String, ZkClientx> clients = MigrateMap.makeComputingMap(new Function<String, ZkClientx>() {
|
||||
|
||||
public ZkClientx apply(String servers) {
|
||||
return new ZkClientx(servers);
|
||||
}
|
||||
});
|
||||
|
||||
public static ZkClientx getZkClient(String servers) {
|
||||
return clients.get(servers);
|
||||
}
|
||||
|
||||
public ZkClientx(String serverstring){
|
||||
this(serverstring, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
public ZkClientx(String zkServers, int connectionTimeout){
|
||||
this(new ZooKeeperx(zkServers), connectionTimeout);
|
||||
}
|
||||
|
||||
public ZkClientx(String zkServers, int sessionTimeout, int connectionTimeout){
|
||||
this(new ZooKeeperx(zkServers, sessionTimeout), connectionTimeout);
|
||||
}
|
||||
|
||||
public ZkClientx(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer){
|
||||
this(new ZooKeeperx(zkServers, sessionTimeout), connectionTimeout, zkSerializer);
|
||||
}
|
||||
|
||||
private ZkClientx(IZkConnection connection, int connectionTimeout){
|
||||
this(connection, connectionTimeout, new ByteSerializer());
|
||||
}
|
||||
|
||||
private ZkClientx(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer){
|
||||
super(zkConnection, connectionTimeout, zkSerializer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a persistent Sequential node.
|
||||
*
|
||||
* @param path
|
||||
* @param createParents if true all parent dirs are created as well and no
|
||||
* {@link ZkNodeExistsException} is thrown in case the path already exists
|
||||
* @throws ZkInterruptedException if operation was interrupted, or a
|
||||
* required reconnection got interrupted
|
||||
* @throws IllegalArgumentException if called from anything except the
|
||||
* ZooKeeper event thread
|
||||
* @throws ZkException if any ZooKeeper exception occurred
|
||||
* @throws RuntimeException if any other exception occurs
|
||||
*/
|
||||
public String createPersistentSequential(String path, boolean createParents) throws ZkInterruptedException,
|
||||
IllegalArgumentException, ZkException,
|
||||
RuntimeException {
|
||||
try {
|
||||
return create(path, null, CreateMode.PERSISTENT_SEQUENTIAL);
|
||||
} catch (ZkNoNodeException e) {
|
||||
if (!createParents) {
|
||||
throw e;
|
||||
}
|
||||
String parentDir = path.substring(0, path.lastIndexOf('/'));
|
||||
createPersistent(parentDir, createParents);
|
||||
return createPersistentSequential(path, createParents);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a persistent Sequential node.
|
||||
*
|
||||
* @param path
|
||||
* @param data
|
||||
* @param createParents if true all parent dirs are created as well and no
|
||||
* {@link ZkNodeExistsException} is thrown in case the path already exists
|
||||
* @throws ZkInterruptedException if operation was interrupted, or a
|
||||
* required reconnection got interrupted
|
||||
* @throws IllegalArgumentException if called from anything except the
|
||||
* ZooKeeper event thread
|
||||
* @throws ZkException if any ZooKeeper exception occurred
|
||||
* @throws RuntimeException if any other exception occurs
|
||||
*/
|
||||
public String createPersistentSequential(String path, Object data, boolean createParents)
|
||||
throws ZkInterruptedException,
|
||||
IllegalArgumentException,
|
||||
ZkException,
|
||||
RuntimeException {
|
||||
try {
|
||||
return create(path, data, CreateMode.PERSISTENT_SEQUENTIAL);
|
||||
} catch (ZkNoNodeException e) {
|
||||
if (!createParents) {
|
||||
throw e;
|
||||
}
|
||||
String parentDir = path.substring(0, path.lastIndexOf('/'));
|
||||
createPersistent(parentDir, createParents);
|
||||
return createPersistentSequential(path, data, createParents);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a persistent Sequential node.
|
||||
*
|
||||
* @param path
|
||||
* @param data
|
||||
* @param createParents if true all parent dirs are created as well and no
|
||||
* {@link ZkNodeExistsException} is thrown in case the path already exists
|
||||
* @throws ZkInterruptedException if operation was interrupted, or a
|
||||
* required reconnection got interrupted
|
||||
* @throws IllegalArgumentException if called from anything except the
|
||||
* ZooKeeper event thread
|
||||
* @throws ZkException if any ZooKeeper exception occurred
|
||||
* @throws RuntimeException if any other exception occurs
|
||||
*/
|
||||
public void createPersistent(String path, Object data, boolean createParents) throws ZkInterruptedException,
|
||||
IllegalArgumentException, ZkException,
|
||||
RuntimeException {
|
||||
try {
|
||||
create(path, data, CreateMode.PERSISTENT);
|
||||
} catch (ZkNodeExistsException e) {
|
||||
if (!createParents) {
|
||||
throw e;
|
||||
}
|
||||
} catch (ZkNoNodeException e) {
|
||||
if (!createParents) {
|
||||
throw e;
|
||||
}
|
||||
String parentDir = path.substring(0, path.lastIndexOf('/'));
|
||||
createPersistent(parentDir, createParents);
|
||||
createPersistent(path, data, createParents);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.I0Itec.zkclient.ZkConnection;
|
||||
import org.I0Itec.zkclient.exception.ZkException;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.zookeeper.ClientCnxn;
|
||||
import org.apache.zookeeper.Watcher;
|
||||
import org.apache.zookeeper.ZooKeeper;
|
||||
import org.apache.zookeeper.client.ConnectStringParser;
|
||||
import org.apache.zookeeper.client.HostProvider;
|
||||
import org.apache.zookeeper.client.StaticHostProvider;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* 封装了ZooKeeper,使其支持节点的优先顺序,比如美国机房的节点会优先加载美国对应的zk集群列表,都失败后才会选择加载杭州的zk集群列表 *
|
||||
*
|
||||
* @author jianghang 2012-7-10 下午02:31:42
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ZooKeeperx extends ZkConnection {
|
||||
|
||||
private static final String SERVER_COMMA = ";";
|
||||
private static final Logger logger = LoggerFactory.getLogger(ZooKeeperx.class);
|
||||
private static final Field clientCnxnField = ReflectionUtils.findField(ZooKeeper.class, "cnxn");
|
||||
private static final Field hostProviderField = ReflectionUtils.findField(ClientCnxn.class, "hostProvider");
|
||||
private static final Field serverAddressesField = ReflectionUtils.findField(StaticHostProvider.class,
|
||||
"serverAddresses");
|
||||
private static final Field zookeeperLockField = ReflectionUtils.findField(ZkConnection.class,
|
||||
"_zookeeperLock");
|
||||
private static final Field zookeeperFiled = ReflectionUtils.findField(ZkConnection.class, "_zk");
|
||||
private static final int DEFAULT_SESSION_TIMEOUT = 90000;
|
||||
|
||||
private final List<String> _serversList;
|
||||
private final int _sessionTimeOut;
|
||||
|
||||
public ZooKeeperx(String zkServers){
|
||||
this(zkServers, DEFAULT_SESSION_TIMEOUT);
|
||||
}
|
||||
|
||||
public ZooKeeperx(String zkServers, int sessionTimeOut){
|
||||
super(zkServers, sessionTimeOut);
|
||||
_serversList = Arrays.asList(StringUtils.split(this.getServers(), SERVER_COMMA));
|
||||
_sessionTimeOut = sessionTimeOut;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void connect(Watcher watcher) {
|
||||
ReflectionUtils.makeAccessible(zookeeperLockField);
|
||||
ReflectionUtils.makeAccessible(zookeeperFiled);
|
||||
Lock _zookeeperLock = (ReentrantLock) ReflectionUtils.getField(zookeeperLockField, this);
|
||||
ZooKeeper _zk = (ZooKeeper) ReflectionUtils.getField(zookeeperFiled, this);
|
||||
|
||||
_zookeeperLock.lock();
|
||||
try {
|
||||
if (_zk != null) {
|
||||
throw new IllegalStateException("zk client has already been started");
|
||||
}
|
||||
String zkServers = _serversList.get(0);
|
||||
|
||||
try {
|
||||
logger.debug("Creating new ZookKeeper instance to connect to " + zkServers + ".");
|
||||
_zk = new ZooKeeper(zkServers, _sessionTimeOut, watcher);
|
||||
configMutliCluster(_zk);
|
||||
ReflectionUtils.setField(zookeeperFiled, this, _zk);
|
||||
} catch (IOException e) {
|
||||
throw new ZkException("Unable to connect to " + zkServers, e);
|
||||
}
|
||||
} finally {
|
||||
_zookeeperLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================
|
||||
|
||||
public void configMutliCluster(ZooKeeper zk) {
|
||||
if (_serversList.size() == 1) {
|
||||
return;
|
||||
}
|
||||
String cluster1 = _serversList.get(0);
|
||||
try {
|
||||
if (_serversList.size() > 1) {
|
||||
// 强制的声明accessible
|
||||
ReflectionUtils.makeAccessible(clientCnxnField);
|
||||
ReflectionUtils.makeAccessible(hostProviderField);
|
||||
ReflectionUtils.makeAccessible(serverAddressesField);
|
||||
|
||||
// 添加第二组集群列表
|
||||
for (int i = 1; i < _serversList.size(); i++) {
|
||||
String cluster = _serversList.get(i);
|
||||
// 强制获取zk中的地址信息
|
||||
ClientCnxn cnxn = (ClientCnxn) ReflectionUtils.getField(clientCnxnField, zk);
|
||||
HostProvider hostProvider = (HostProvider) ReflectionUtils.getField(hostProviderField, cnxn);
|
||||
List<InetSocketAddress> serverAddrs = (List<InetSocketAddress>) ReflectionUtils.getField(serverAddressesField,
|
||||
hostProvider);
|
||||
// 添加第二组集群列表
|
||||
serverAddrs.addAll(new ConnectStringParser(cluster).getServerAddresses());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
if (zk != null) {
|
||||
zk.close();
|
||||
}
|
||||
} catch (InterruptedException ie) {
|
||||
// ignore interrupt
|
||||
}
|
||||
throw new ZkException("zookeeper_create_error, serveraddrs=" + cluster1, e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+183
@@ -0,0 +1,183 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
/**
|
||||
* 存储结构:
|
||||
*
|
||||
* <pre>
|
||||
* /otter
|
||||
* canal
|
||||
* cluster
|
||||
* destinations
|
||||
* dest1
|
||||
* running (EPHEMERAL)
|
||||
* cluster
|
||||
* client1
|
||||
* running (EPHEMERAL)
|
||||
* cluster
|
||||
* filter
|
||||
* cursor
|
||||
* mark
|
||||
* 1
|
||||
* 2
|
||||
* 3
|
||||
* </pre>
|
||||
*
|
||||
* @author zebin.xuzb @ 2012-6-21
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ZookeeperPathUtils {
|
||||
|
||||
public static final String ZOOKEEPER_SEPARATOR = "/";
|
||||
|
||||
public static final String OTTER_ROOT_NODE = ZOOKEEPER_SEPARATOR + "otter";
|
||||
|
||||
public static final String CANAL_ROOT_NODE = OTTER_ROOT_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ "canal";
|
||||
|
||||
public static final String DESTINATION_ROOT_NODE = CANAL_ROOT_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ "destinations";
|
||||
|
||||
public static final String FILTER_NODE = "filter";
|
||||
|
||||
public static final String BATCH_MARK_NODE = "mark";
|
||||
|
||||
public static final String PARSE_NODE = "parse";
|
||||
|
||||
public static final String CURSOR_NODE = "cursor";
|
||||
|
||||
public static final String RUNNING_NODE = "running";
|
||||
|
||||
public static final String CLUSTER_NODE = "cluster";
|
||||
|
||||
public static final String DESTINATION_NODE = DESTINATION_ROOT_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + "{0}";
|
||||
|
||||
public static final String DESTINATION_PARSE_NODE = DESTINATION_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ PARSE_NODE;
|
||||
|
||||
public static final String DESTINATION_CLIENTID_NODE = DESTINATION_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ "{1}";
|
||||
|
||||
public static final String DESTINATION_CURSOR_NODE = DESTINATION_CLIENTID_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + CURSOR_NODE;
|
||||
|
||||
public static final String DESTINATION_CLIENTID_FILTER_NODE = DESTINATION_CLIENTID_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + FILTER_NODE;
|
||||
|
||||
public static final String DESTINATION_CLIENTID_BATCH_MARK_NODE = DESTINATION_CLIENTID_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + BATCH_MARK_NODE;
|
||||
|
||||
public static final String DESTINATION_CLIENTID_BATCH_MARK_WITH_ID_PATH = DESTINATION_CLIENTID_BATCH_MARK_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + "{2}";
|
||||
|
||||
/**
|
||||
* 服务端当前正在提供服务的running节点
|
||||
*/
|
||||
public static final String DESTINATION_RUNNING_NODE = DESTINATION_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ RUNNING_NODE;
|
||||
|
||||
/**
|
||||
* 客户端当前正在工作的running节点
|
||||
*/
|
||||
public static final String DESTINATION_CLIENTID_RUNNING_NODE = DESTINATION_CLIENTID_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + RUNNING_NODE;
|
||||
|
||||
/**
|
||||
* 整个canal server的集群列表
|
||||
*/
|
||||
public static final String CANAL_CLUSTER_ROOT_NODE = CANAL_ROOT_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ CLUSTER_NODE;
|
||||
|
||||
public static final String CANAL_CLUSTER_NODE = CANAL_CLUSTER_ROOT_NODE
|
||||
+ ZOOKEEPER_SEPARATOR + "{0}";
|
||||
|
||||
/**
|
||||
* 针对某个destination的工作的集群列表
|
||||
*/
|
||||
public static final String DESTINATION_CLUSTER_ROOT = DESTINATION_NODE + ZOOKEEPER_SEPARATOR
|
||||
+ CLUSTER_NODE;
|
||||
public static final String DESTINATION_CLUSTER_NODE = DESTINATION_CLUSTER_ROOT
|
||||
+ ZOOKEEPER_SEPARATOR + "{1}";
|
||||
|
||||
public static String getDestinationPath(String destinationName) {
|
||||
return MessageFormat.format(DESTINATION_NODE, destinationName);
|
||||
}
|
||||
|
||||
public static String getClientIdNodePath(String destinationName, short clientId) {
|
||||
return MessageFormat.format(DESTINATION_CLIENTID_NODE, destinationName, String.valueOf(clientId));
|
||||
}
|
||||
|
||||
public static String getFilterPath(String destinationName, short clientId) {
|
||||
return MessageFormat.format(DESTINATION_CLIENTID_FILTER_NODE, destinationName, String.valueOf(clientId));
|
||||
}
|
||||
|
||||
public static String getBatchMarkPath(String destinationName, short clientId) {
|
||||
return MessageFormat.format(DESTINATION_CLIENTID_BATCH_MARK_NODE, destinationName, String.valueOf(clientId));
|
||||
}
|
||||
|
||||
public static String getBatchMarkWithIdPath(String destinationName, short clientId, Long batchId) {
|
||||
return MessageFormat.format(DESTINATION_CLIENTID_BATCH_MARK_WITH_ID_PATH,
|
||||
destinationName,
|
||||
String.valueOf(clientId),
|
||||
getBatchMarkNode(batchId));
|
||||
}
|
||||
|
||||
public static String getCursorPath(String destination, short clientId) {
|
||||
return MessageFormat.format(DESTINATION_CURSOR_NODE, destination, String.valueOf(clientId));
|
||||
}
|
||||
|
||||
public static String getCanalClusterNode(String node) {
|
||||
return MessageFormat.format(CANAL_CLUSTER_NODE, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* 服务端当前正在提供服务的running节点
|
||||
*/
|
||||
public static String getDestinationServerRunning(String destination) {
|
||||
return MessageFormat.format(DESTINATION_RUNNING_NODE, destination);
|
||||
}
|
||||
|
||||
/**
|
||||
* 客户端当前正在工作的running节点
|
||||
*/
|
||||
public static String getDestinationClientRunning(String destination, short clientId) {
|
||||
return MessageFormat.format(DESTINATION_CLIENTID_RUNNING_NODE, destination, String.valueOf(clientId));
|
||||
}
|
||||
|
||||
public static String getDestinationClusterNode(String destination, String node) {
|
||||
return MessageFormat.format(DESTINATION_CLUSTER_NODE, destination, node);
|
||||
}
|
||||
|
||||
public static String getDestinationClusterRoot(String destination) {
|
||||
return MessageFormat.format(DESTINATION_CLUSTER_ROOT, destination);
|
||||
}
|
||||
|
||||
public static String getParsePath(String destination) {
|
||||
return MessageFormat.format(DESTINATION_PARSE_NODE, destination);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将batchNode转换为Long
|
||||
*/
|
||||
public static short getClientId(String clientNode) {
|
||||
return Short.valueOf(clientNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将batchNode转换为Long
|
||||
*/
|
||||
public static long getBatchMarkId(String batchMarkNode) {
|
||||
return Long.valueOf(batchMarkNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将batchId转化为zookeeper中的node名称
|
||||
*/
|
||||
public static String getBatchMarkNode(Long batchId) {
|
||||
return StringUtils.leftPad(String.valueOf(batchId.intValue()), 10, '0');
|
||||
}
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper.running;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import org.apache.commons.lang.builder.ToStringBuilder;
|
||||
|
||||
import com.alibaba.otter.canal.common.utils.CanalToStringStyle;
|
||||
|
||||
/**
|
||||
* 服务端running状态信息
|
||||
*
|
||||
* @author jianghang 2012-11-22 下午03:11:30
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ServerRunningData implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 92260481691855281L;
|
||||
|
||||
private Long cid;
|
||||
private String address;
|
||||
private boolean active = true;
|
||||
|
||||
public ServerRunningData(){
|
||||
}
|
||||
|
||||
public ServerRunningData(Long cid, String address){
|
||||
this.cid = cid;
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public Long getCid() {
|
||||
return cid;
|
||||
}
|
||||
|
||||
public void setCid(Long cid) {
|
||||
this.cid = cid;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public boolean isActive() {
|
||||
return active;
|
||||
}
|
||||
|
||||
public void setActive(boolean active) {
|
||||
this.active = active;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return ToStringBuilder.reflectionToString(this, CanalToStringStyle.DEFAULT_STYLE);
|
||||
}
|
||||
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper.running;
|
||||
|
||||
/**
|
||||
* 触发一下mainstem发生切换
|
||||
*
|
||||
* @author jianghang 2012-9-11 下午02:26:03
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface ServerRunningListener {
|
||||
|
||||
/**
|
||||
* 启动时回调做点事情
|
||||
*/
|
||||
public void processStart();
|
||||
|
||||
/**
|
||||
* 关闭时回调做点事情
|
||||
*/
|
||||
public void processStop();
|
||||
|
||||
/**
|
||||
* 触发现在轮到自己做为active,需要载入上一个active的上下文数据
|
||||
*/
|
||||
public void processActiveEnter();
|
||||
|
||||
/**
|
||||
* 触发一下当前active模式失败
|
||||
*/
|
||||
public void processActiveExit();
|
||||
|
||||
}
|
||||
+277
@@ -0,0 +1,277 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper.running;
|
||||
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.I0Itec.zkclient.IZkDataListener;
|
||||
import org.I0Itec.zkclient.exception.ZkException;
|
||||
import org.I0Itec.zkclient.exception.ZkInterruptedException;
|
||||
import org.I0Itec.zkclient.exception.ZkNoNodeException;
|
||||
import org.I0Itec.zkclient.exception.ZkNodeExistsException;
|
||||
import org.apache.zookeeper.CreateMode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.MDC;
|
||||
|
||||
import com.alibaba.otter.canal.common.AbstractCanalLifeCycle;
|
||||
import com.alibaba.otter.canal.common.utils.BooleanMutex;
|
||||
import com.alibaba.otter.canal.common.utils.JsonUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
|
||||
|
||||
/**
|
||||
* 针对server的running节点控制
|
||||
*
|
||||
* @author jianghang 2012-11-22 下午02:59:42
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ServerRunningMonitor extends AbstractCanalLifeCycle {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(ServerRunningMonitor.class);
|
||||
private ZkClientx zkClient;
|
||||
private String destination;
|
||||
private IZkDataListener dataListener;
|
||||
private BooleanMutex mutex = new BooleanMutex(false);
|
||||
private volatile boolean release = false;
|
||||
// 当前服务节点状态信息
|
||||
private ServerRunningData serverData;
|
||||
// 当前实际运行的节点状态信息
|
||||
private volatile ServerRunningData activeData;
|
||||
private ScheduledExecutorService delayExector = Executors.newScheduledThreadPool(1);
|
||||
private int delayTime = 5;
|
||||
private ServerRunningListener listener;
|
||||
|
||||
public ServerRunningMonitor(ServerRunningData serverData){
|
||||
this();
|
||||
this.serverData = serverData;
|
||||
}
|
||||
|
||||
public ServerRunningMonitor(){
|
||||
// 创建父节点
|
||||
dataListener = new IZkDataListener() {
|
||||
|
||||
public void handleDataChange(String dataPath, Object data) throws Exception {
|
||||
MDC.put("destination", destination);
|
||||
ServerRunningData runningData = JsonUtils.unmarshalFromByte((byte[]) data, ServerRunningData.class);
|
||||
if (!isMine(runningData.getAddress())) {
|
||||
mutex.set(false);
|
||||
}
|
||||
|
||||
if (!runningData.isActive() && isMine(runningData.getAddress())) { // 说明出现了主动释放的操作,并且本机之前是active
|
||||
release = true;
|
||||
releaseRunning();// 彻底释放mainstem
|
||||
}
|
||||
|
||||
activeData = (ServerRunningData) runningData;
|
||||
}
|
||||
|
||||
public void handleDataDeleted(String dataPath) throws Exception {
|
||||
MDC.put("destination", destination);
|
||||
mutex.set(false);
|
||||
if (!release && activeData != null && isMine(activeData.getAddress())) {
|
||||
// 如果上一次active的状态就是本机,则即时触发一下active抢占
|
||||
initRunning();
|
||||
} else {
|
||||
// 否则就是等待delayTime,避免因网络瞬端或者zk异常,导致出现频繁的切换操作
|
||||
delayExector.schedule(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
initRunning();
|
||||
}
|
||||
}, delayTime, TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public void init() {
|
||||
processStart();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
super.start();
|
||||
processStart();
|
||||
if (zkClient != null) {
|
||||
// 如果需要尽可能释放instance资源,不需要监听running节点,不然即使stop了这台机器,另一台机器立马会start
|
||||
String path = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
zkClient.subscribeDataChanges(path, dataListener);
|
||||
|
||||
initRunning();
|
||||
} else {
|
||||
processActiveEnter();// 没有zk,直接启动
|
||||
}
|
||||
}
|
||||
|
||||
public void release() {
|
||||
if (zkClient != null) {
|
||||
releaseRunning(); // 尝试一下release
|
||||
} else {
|
||||
processActiveExit(); // 没有zk,直接启动
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
super.stop();
|
||||
|
||||
if (zkClient != null) {
|
||||
String path = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
zkClient.unsubscribeDataChanges(path, dataListener);
|
||||
|
||||
releaseRunning(); // 尝试一下release
|
||||
} else {
|
||||
processActiveExit(); // 没有zk,直接启动
|
||||
}
|
||||
processStop();
|
||||
}
|
||||
|
||||
private void initRunning() {
|
||||
if (!isStart()) {
|
||||
return;
|
||||
}
|
||||
|
||||
String path = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
// 序列化
|
||||
byte[] bytes = JsonUtils.marshalToByte(serverData);
|
||||
try {
|
||||
mutex.set(false);
|
||||
zkClient.create(path, bytes, CreateMode.EPHEMERAL);
|
||||
activeData = serverData;
|
||||
processActiveEnter();// 触发一下事件
|
||||
mutex.set(true);
|
||||
} catch (ZkNodeExistsException e) {
|
||||
bytes = zkClient.readData(path, true);
|
||||
if (bytes == null) {// 如果不存在节点,立即尝试一次
|
||||
initRunning();
|
||||
} else {
|
||||
activeData = JsonUtils.unmarshalFromByte(bytes, ServerRunningData.class);
|
||||
}
|
||||
} catch (ZkNoNodeException e) {
|
||||
zkClient.createPersistent(ZookeeperPathUtils.getDestinationPath(destination), true); // 尝试创建父节点
|
||||
initRunning();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 阻塞等待自己成为active,如果自己成为active,立马返回
|
||||
*
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void waitForActive() throws InterruptedException {
|
||||
initRunning();
|
||||
mutex.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查当前的状态
|
||||
*/
|
||||
public boolean check() {
|
||||
String path = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
try {
|
||||
byte[] bytes = zkClient.readData(path);
|
||||
ServerRunningData eventData = JsonUtils.unmarshalFromByte(bytes, ServerRunningData.class);
|
||||
activeData = eventData;// 更新下为最新值
|
||||
// 检查下nid是否为自己
|
||||
boolean result = isMine(activeData.getAddress());
|
||||
if (!result) {
|
||||
logger.warn("canal is running in node[{}] , but not in node[{}]",
|
||||
activeData.getCid(),
|
||||
serverData.getCid());
|
||||
}
|
||||
return result;
|
||||
} catch (ZkNoNodeException e) {
|
||||
logger.warn("canal is not run any in node");
|
||||
return false;
|
||||
} catch (ZkInterruptedException e) {
|
||||
logger.warn("canal check is interrupt");
|
||||
Thread.interrupted();// 清除interrupt标记
|
||||
return check();
|
||||
} catch (ZkException e) {
|
||||
logger.warn("canal check is failed");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean releaseRunning() {
|
||||
if (check()) {
|
||||
String path = ZookeeperPathUtils.getDestinationServerRunning(destination);
|
||||
zkClient.delete(path);
|
||||
mutex.set(false);
|
||||
processActiveExit();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ====================== helper method ======================
|
||||
|
||||
private boolean isMine(String address) {
|
||||
return address.equals(serverData.getAddress());
|
||||
}
|
||||
|
||||
private void processStart() {
|
||||
if (listener != null) {
|
||||
try {
|
||||
listener.processStart();
|
||||
} catch (Exception e) {
|
||||
logger.error("processStart failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processStop() {
|
||||
if (listener != null) {
|
||||
try {
|
||||
listener.processStop();
|
||||
} catch (Exception e) {
|
||||
logger.error("processStop failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processActiveEnter() {
|
||||
if (listener != null) {
|
||||
try {
|
||||
listener.processActiveEnter();
|
||||
} catch (Exception e) {
|
||||
logger.error("processActiveEnter failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void processActiveExit() {
|
||||
if (listener != null) {
|
||||
try {
|
||||
listener.processActiveExit();
|
||||
} catch (Exception e) {
|
||||
logger.error("processActiveExit failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setListener(ServerRunningListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
// ===================== setter / getter =======================
|
||||
|
||||
public void setDelayTime(int delayTime) {
|
||||
this.delayTime = delayTime;
|
||||
}
|
||||
|
||||
public void setServerData(ServerRunningData serverData) {
|
||||
this.serverData = serverData;
|
||||
}
|
||||
|
||||
public void setDestination(String destination) {
|
||||
this.destination = destination;
|
||||
}
|
||||
|
||||
public void setZkClient(ZkClientx zkClient) {
|
||||
this.zkClient = zkClient;
|
||||
}
|
||||
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
package com.alibaba.otter.canal.common.zookeeper.running;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* {@linkplain ServerRunningMonitor}管理容器,使用static进行数据全局共享
|
||||
*
|
||||
* @author jianghang 2012-12-3 下午09:32:06
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public class ServerRunningMonitors {
|
||||
|
||||
private static ServerRunningData serverData;
|
||||
private static Map runningMonitors; // <String,
|
||||
// ServerRunningMonitor>
|
||||
|
||||
public static ServerRunningData getServerData() {
|
||||
return serverData;
|
||||
}
|
||||
|
||||
public static Map<String, ServerRunningMonitor> getRunningMonitors() {
|
||||
return runningMonitors;
|
||||
}
|
||||
|
||||
public static ServerRunningMonitor getRunningMonitor(String destination) {
|
||||
return (ServerRunningMonitor) runningMonitors.get(destination);
|
||||
}
|
||||
|
||||
public static void setServerData(ServerRunningData serverData) {
|
||||
ServerRunningMonitors.serverData = serverData;
|
||||
}
|
||||
|
||||
public static void setRunningMonitors(Map runningMonitors) {
|
||||
ServerRunningMonitors.runningMonitors = runningMonitors;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.google.common.collect;
|
||||
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
public class MigrateMap {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static <K, V> ConcurrentMap<K, V> makeComputingMap(MapMaker maker,
|
||||
Function<? super K, ? extends V> computingFunction) {
|
||||
return maker.makeComputingMap(computingFunction);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public static <K, V> ConcurrentMap<K, V> makeComputingMap(Function<? super K, ? extends V> computingFunction) {
|
||||
return new MapMaker().makeComputingMap(computingFunction);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.alibaba.otter.canal.common;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
public class AbstractZkTest {
|
||||
|
||||
protected String destination = "ljhtest1";
|
||||
protected String cluster1 = "127.0.0.1:2188";
|
||||
protected String cluster2 = "127.0.0.1:2188,127.0.0.1:2188";
|
||||
|
||||
public void sleep(long time) {
|
||||
try {
|
||||
Thread.sleep(time);
|
||||
} catch (InterruptedException e) {
|
||||
Assert.fail(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
package com.alibaba.otter.canal.common;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import org.apache.commons.lang.math.RandomUtils;
|
||||
import org.junit.After;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZkClientx;
|
||||
import com.alibaba.otter.canal.common.zookeeper.ZookeeperPathUtils;
|
||||
import com.alibaba.otter.canal.common.zookeeper.running.ServerRunningData;
|
||||
import com.alibaba.otter.canal.common.zookeeper.running.ServerRunningListener;
|
||||
import com.alibaba.otter.canal.common.zookeeper.running.ServerRunningMonitor;
|
||||
|
||||
public class ServerRunningTest extends AbstractZkTest {
|
||||
|
||||
private ZkClientx zkclientx = new ZkClientx(cluster1 + ";" + cluster2);
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
String path = ZookeeperPathUtils.getDestinationPath(destination);
|
||||
zkclientx.deleteRecursive(path);
|
||||
|
||||
zkclientx.createPersistent(ZookeeperPathUtils.getDestinationPath(destination), true);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
String path = ZookeeperPathUtils.getDestinationPath(destination);
|
||||
zkclientx.deleteRecursive(path);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOneServer() {
|
||||
final CountDownLatch countLatch = new CountDownLatch(2);
|
||||
ServerRunningMonitor runningMonitor = buildServerRunning(countLatch, 1L, "127.0.0.1", 2088);
|
||||
runningMonitor.start();
|
||||
sleep(2000L);
|
||||
runningMonitor.stop();
|
||||
sleep(2000L);
|
||||
|
||||
if (countLatch.getCount() != 0) {
|
||||
Assert.fail();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiServer() {
|
||||
final CountDownLatch countLatch = new CountDownLatch(30);
|
||||
final ServerRunningMonitor runningMonitor1 = buildServerRunning(countLatch, 1L, "127.0.0.1", 2088);
|
||||
final ServerRunningMonitor runningMonitor2 = buildServerRunning(countLatch, 2L, "127.0.0.1", 2089);
|
||||
final ServerRunningMonitor runningMonitor3 = buildServerRunning(countLatch, 3L, "127.0.0.1", 2090);
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(3);
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor1.isStart()) {
|
||||
runningMonitor1.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
if (runningMonitor1.check()) {
|
||||
runningMonitor1.stop();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor2.isStart()) {
|
||||
runningMonitor2.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
if (runningMonitor2.check()) {
|
||||
runningMonitor2.stop();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
executor.submit(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (!runningMonitor3.isStart()) {
|
||||
runningMonitor3.start();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
if (runningMonitor3.check()) {
|
||||
runningMonitor3.stop();
|
||||
}
|
||||
sleep(2000L + RandomUtils.nextInt(500));
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
sleep(30000L);
|
||||
}
|
||||
|
||||
private ServerRunningMonitor buildServerRunning(final CountDownLatch countLatch, final Long cid, final String ip,
|
||||
final int port) {
|
||||
ServerRunningData serverData = new ServerRunningData(cid, ip + ":" + port);
|
||||
ServerRunningMonitor runningMonitor = new ServerRunningMonitor(serverData);
|
||||
runningMonitor.setDestination(destination);
|
||||
runningMonitor.setListener(new ServerRunningListener() {
|
||||
|
||||
public void processActiveEnter() {
|
||||
System.out.println(String.format("cid:%s ip:%s:%s has start", cid, ip, port));
|
||||
countLatch.countDown();
|
||||
}
|
||||
|
||||
public void processActiveExit() {
|
||||
System.out.println(String.format("cid:%s ip:%s:%s has stop", cid, ip, port));
|
||||
countLatch.countDown();
|
||||
}
|
||||
|
||||
public void processStart() {
|
||||
System.out.println(String.format("cid:%s ip:%s:%s processStart", cid, ip, port));
|
||||
}
|
||||
|
||||
public void processStop() {
|
||||
System.out.println(String.format("cid:%s ip:%s:%s processStop", cid, ip, port));
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
runningMonitor.setZkClient(zkclientx);
|
||||
runningMonitor.setDelayTime(1);
|
||||
return runningMonitor;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<configuration scan="true" scanPeriod=" 5 seconds">
|
||||
|
||||
<jmxConfigurator />
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{56} - %msg%n
|
||||
</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="WARN">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
@@ -0,0 +1,43 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal</artifactId>
|
||||
<version>1.0.25-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>com.alibaba.otter</groupId>
|
||||
<artifactId>canal.parse.dbsync</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>canal dbsync module for otter ${project.version}</name>
|
||||
<dependencies>
|
||||
<!-- log -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-core</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
<!-- test dependency -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,338 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* An utility class implements MySQL/Java charsets conversion. you can see
|
||||
* com.mysql.jdbc.CharsetMapping.
|
||||
*
|
||||
* @author <a href="mailto:changyuan.lh@taobao.com">Changyuan.lh</a>
|
||||
*/
|
||||
public final class CharsetConversion {
|
||||
|
||||
static final Log logger = LogFactory.getLog(CharsetConversion.class);
|
||||
|
||||
static final class Entry {
|
||||
|
||||
protected final int charsetId;
|
||||
protected final String mysqlCharset;
|
||||
protected final String mysqlCollation;
|
||||
protected final String javaCharset;
|
||||
|
||||
Entry(final int id, String mysqlCharset, // NL
|
||||
String mysqlCollation, String javaCharset){
|
||||
this.charsetId = id;
|
||||
this.mysqlCharset = mysqlCharset;
|
||||
this.mysqlCollation = mysqlCollation;
|
||||
this.javaCharset = javaCharset;
|
||||
}
|
||||
}
|
||||
|
||||
// Character set data used in lookups. The array will be sparse.
|
||||
static final Entry[] entries = new Entry[0xff];
|
||||
|
||||
static Entry getEntry(final int id) {
|
||||
if (id >= 0 && id < entries.length) {
|
||||
return entries[id];
|
||||
} else {
|
||||
throw new IllegalArgumentException("Invalid charset id: " + id);
|
||||
}
|
||||
}
|
||||
|
||||
// Loads character set information.
|
||||
static void putEntry(final int charsetId, String mysqlCharset, String mysqlCollation, String javaCharset) {
|
||||
entries[charsetId] = new Entry(charsetId, mysqlCharset, // NL
|
||||
mysqlCollation,
|
||||
javaCharset);
|
||||
}
|
||||
|
||||
// Loads character set information.
|
||||
@Deprecated
|
||||
static void putEntry(final int charsetId, String mysqlCharset, String mysqlCollation) {
|
||||
entries[charsetId] = new Entry(charsetId, mysqlCharset, // NL
|
||||
mysqlCollation, /* Unknown java charset */
|
||||
null);
|
||||
}
|
||||
|
||||
// Load character set data statically.
|
||||
static {
|
||||
putEntry(1, "big5", "big5_chinese_ci", "Big5");
|
||||
putEntry(2, "latin2", "latin2_czech_cs", "ISO8859_2");
|
||||
putEntry(3, "dec8", "dec8_swedish_ci", "ISO8859_1");
|
||||
putEntry(4, "cp850", "cp850_general_ci", "Cp850");
|
||||
putEntry(5, "latin1", "latin1_german1_ci", "ISO8859_1");
|
||||
putEntry(6, "hp8", "hp8_english_ci", "ISO8859_1");
|
||||
putEntry(7, "koi8r", "koi8r_general_ci", "KOI8_R");
|
||||
putEntry(8, "latin1", "latin1_swedish_ci", "ISO8859_1");
|
||||
putEntry(9, "latin2", "latin2_general_ci", "ISO8859_2");
|
||||
putEntry(10, "swe7", "swe7_swedish_ci", "ISO8859_1");
|
||||
putEntry(11, "ascii", "ascii_general_ci", "US-ASCII");
|
||||
putEntry(12, "ujis", "ujis_japanese_ci", "EUC_JP");
|
||||
putEntry(13, "sjis", "sjis_japanese_ci", "SJIS");
|
||||
putEntry(14, "cp1251", "cp1251_bulgarian_ci", "Cp1251");
|
||||
putEntry(15, "latin1", "latin1_danish_ci", "ISO8859_1");
|
||||
putEntry(16, "hebrew", "hebrew_general_ci", "ISO8859_8");
|
||||
putEntry(17, "filename", "filename", "ISO8859_1");
|
||||
putEntry(18, "tis620", "tis620_thai_ci", "TIS620");
|
||||
putEntry(19, "euckr", "euckr_korean_ci", "EUC_KR");
|
||||
putEntry(20, "latin7", "latin7_estonian_cs", "ISO8859_7");
|
||||
putEntry(21, "latin2", "latin2_hungarian_ci", "ISO8859_2");
|
||||
putEntry(22, "koi8u", "koi8u_general_ci", "KOI8_U");
|
||||
putEntry(23, "cp1251", "cp1251_ukrainian_ci", "Cp1251");
|
||||
putEntry(24, "gb2312", "gb2312_chinese_ci", "EUC_CN");
|
||||
putEntry(25, "greek", "greek_general_ci", "ISO8859_7");
|
||||
putEntry(26, "cp1250", "cp1250_general_ci", "Cp1250");
|
||||
putEntry(27, "latin2", "latin2_croatian_ci", "ISO8859_2");
|
||||
putEntry(28, "gbk", "gbk_chinese_ci", "GBK");
|
||||
putEntry(29, "cp1257", "cp1257_lithuanian_ci", "Cp1257");
|
||||
putEntry(30, "latin5", "latin5_turkish_ci", "ISO8859_5");
|
||||
putEntry(31, "latin1", "latin1_german2_ci", "ISO8859_1");
|
||||
putEntry(32, "armscii8", "armscii8_general_ci", "ISO8859_1");
|
||||
putEntry(33, "utf8", "utf8_general_ci", "UTF-8");
|
||||
putEntry(34, "cp1250", "cp1250_czech_cs", "Cp1250");
|
||||
putEntry(35, "ucs2", "ucs2_general_ci", "UnicodeBig");
|
||||
putEntry(36, "cp866", "cp866_general_ci", "Cp866");
|
||||
putEntry(37, "keybcs2", "keybcs2_general_ci", "Cp895");
|
||||
putEntry(38, "macce", "macce_general_ci", "MacCentralEurope");
|
||||
putEntry(39, "macroman", "macroman_general_ci", "MacRoman");
|
||||
putEntry(40, "cp852", "cp852_general_ci", "Cp852");
|
||||
putEntry(41, "latin7", "latin7_general_ci", "ISO8859_7");
|
||||
putEntry(42, "latin7", "latin7_general_cs", "ISO8859_7");
|
||||
putEntry(43, "macce", "macce_bin", "MacCentralEurope");
|
||||
putEntry(44, "cp1250", "cp1250_croatian_ci", "Cp1250");
|
||||
putEntry(45, "utf8mb4", "utf8mb4_general_ci", "MacCentralEurope");
|
||||
putEntry(46, "utf8mb4", "utf8mb4_bin", "MacCentralEurope");
|
||||
putEntry(47, "latin1", "latin1_bin", "ISO8859_1");
|
||||
putEntry(48, "latin1", "latin1_general_ci", "ISO8859_1");
|
||||
putEntry(49, "latin1", "latin1_general_cs", "ISO8859_1");
|
||||
putEntry(50, "cp1251", "cp1251_bin", "Cp1251");
|
||||
putEntry(51, "cp1251", "cp1251_general_ci", "Cp1251");
|
||||
putEntry(52, "cp1251", "cp1251_general_cs", "Cp1251");
|
||||
putEntry(53, "macroman", "macroman_bin", "MacRoman");
|
||||
putEntry(54, "utf16", "utf16_general_ci", "UTF-16");
|
||||
putEntry(55, "utf16", "utf16_bin", "UTF-16");
|
||||
putEntry(57, "cp1256", "cp1256_general_ci", "Cp1256");
|
||||
putEntry(58, "cp1257", "cp1257_bin", "Cp1257");
|
||||
putEntry(59, "cp1257", "cp1257_general_ci", "Cp1257");
|
||||
putEntry(60, "utf32", "utf32_general_ci", "UTF-32");
|
||||
putEntry(61, "utf32", "utf32_bin", "UTF-32");
|
||||
putEntry(63, "binary", "binary", "US-ASCII");
|
||||
putEntry(64, "armscii8", "armscii8_bin", "ISO8859_2");
|
||||
putEntry(65, "ascii", "ascii_bin", "US-ASCII");
|
||||
putEntry(66, "cp1250", "cp1250_bin", "Cp1250");
|
||||
putEntry(67, "cp1256", "cp1256_bin", "Cp1256");
|
||||
putEntry(68, "cp866", "cp866_bin", "Cp866");
|
||||
putEntry(69, "dec8", "dec8_bin", "US-ASCII");
|
||||
putEntry(70, "greek", "greek_bin", "ISO8859_7");
|
||||
putEntry(71, "hebrew", "hebrew_bin", "ISO8859_8");
|
||||
putEntry(72, "hp8", "hp8_bin", "US-ASCII");
|
||||
putEntry(73, "keybcs2", "keybcs2_bin", "Cp895");
|
||||
putEntry(74, "koi8r", "koi8r_bin", "KOI8_R");
|
||||
putEntry(75, "koi8u", "koi8u_bin", "KOI8_U");
|
||||
putEntry(77, "latin2", "latin2_bin", "ISO8859_2");
|
||||
putEntry(78, "latin5", "latin5_bin", "ISO8859_5");
|
||||
putEntry(79, "latin7", "latin7_bin", "ISO8859_7");
|
||||
putEntry(80, "cp850", "cp850_bin", "Cp850");
|
||||
putEntry(81, "cp852", "cp852_bin", "Cp852");
|
||||
putEntry(82, "swe7", "swe7_bin", "ISO8859_1");
|
||||
putEntry(83, "utf8", "utf8_bin", "UTF-8");
|
||||
putEntry(84, "big5", "big5_bin", "Big5");
|
||||
putEntry(85, "euckr", "euckr_bin", "EUC_KR");
|
||||
putEntry(86, "gb2312", "gb2312_bin", "EUC_CN");
|
||||
putEntry(87, "gbk", "gbk_bin", "GBK");
|
||||
putEntry(88, "sjis", "sjis_bin", "SJIS");
|
||||
putEntry(89, "tis620", "tis620_bin", "TIS620");
|
||||
putEntry(90, "ucs2", "ucs2_bin", "UnicodeBig");
|
||||
putEntry(91, "ujis", "ujis_bin", "EUC_JP");
|
||||
putEntry(92, "geostd8", "geostd8_general_ci", "US-ASCII");
|
||||
putEntry(93, "geostd8", "geostd8_bin", "US-ASCII");
|
||||
putEntry(94, "latin1", "latin1_spanish_ci", "ISO8859_1");
|
||||
putEntry(95, "cp932", "cp932_japanese_ci", "Shift_JIS");
|
||||
putEntry(96, "cp932", "cp932_bin", "Shift_JIS");
|
||||
putEntry(97, "eucjpms", "eucjpms_japanese_ci", "EUC_JP");
|
||||
putEntry(98, "eucjpms", "eucjpms_bin", "EUC_JP");
|
||||
putEntry(99, "cp1250", "cp1250_polish_ci", "Cp1250");
|
||||
|
||||
putEntry(101, "utf16", "utf16_unicode_ci", "UTF-16");
|
||||
putEntry(102, "utf16", "utf16_icelandic_ci", "UTF-16");
|
||||
putEntry(103, "utf16", "utf16_latvian_ci", "UTF-16");
|
||||
putEntry(104, "utf16", "utf16_romanian_ci", "UTF-16");
|
||||
putEntry(105, "utf16", "utf16_slovenian_ci", "UTF-16");
|
||||
putEntry(106, "utf16", "utf16_polish_ci", "UTF-16");
|
||||
putEntry(107, "utf16", "utf16_estonian_ci", "UTF-16");
|
||||
putEntry(108, "utf16", "utf16_spanish_ci", "UTF-16");
|
||||
putEntry(109, "utf16", "utf16_swedish_ci", "UTF-16");
|
||||
putEntry(110, "utf16", "utf16_turkish_ci", "UTF-16");
|
||||
putEntry(111, "utf16", "utf16_czech_ci", "UTF-16");
|
||||
putEntry(112, "utf16", "utf16_danish_ci", "UTF-16");
|
||||
putEntry(113, "utf16", "utf16_lithuanian_ci", "UTF-16");
|
||||
putEntry(114, "utf16", "utf16_slovak_ci", "UTF-16");
|
||||
putEntry(115, "utf16", "utf16_spanish2_ci", "UTF-16");
|
||||
putEntry(116, "utf16", "utf16_roman_ci", "UTF-16");
|
||||
putEntry(117, "utf16", "utf16_persian_ci", "UTF-16");
|
||||
putEntry(118, "utf16", "utf16_esperanto_ci", "UTF-16");
|
||||
putEntry(119, "utf16", "utf16_hungarian_ci", "UTF-16");
|
||||
putEntry(120, "utf16", "utf16_sinhala_ci", "UTF-16");
|
||||
|
||||
putEntry(128, "ucs2", "ucs2_unicode_ci", "UnicodeBig");
|
||||
putEntry(129, "ucs2", "ucs2_icelandic_ci", "UnicodeBig");
|
||||
putEntry(130, "ucs2", "ucs2_latvian_ci", "UnicodeBig");
|
||||
putEntry(131, "ucs2", "ucs2_romanian_ci", "UnicodeBig");
|
||||
putEntry(132, "ucs2", "ucs2_slovenian_ci", "UnicodeBig");
|
||||
putEntry(133, "ucs2", "ucs2_polish_ci", "UnicodeBig");
|
||||
putEntry(134, "ucs2", "ucs2_estonian_ci", "UnicodeBig");
|
||||
putEntry(135, "ucs2", "ucs2_spanish_ci", "UnicodeBig");
|
||||
putEntry(136, "ucs2", "ucs2_swedish_ci", "UnicodeBig");
|
||||
putEntry(137, "ucs2", "ucs2_turkish_ci", "UnicodeBig");
|
||||
putEntry(138, "ucs2", "ucs2_czech_ci", "UnicodeBig");
|
||||
putEntry(139, "ucs2", "ucs2_danish_ci", "UnicodeBig");
|
||||
putEntry(140, "ucs2", "ucs2_lithuanian_ci", "UnicodeBig");
|
||||
putEntry(141, "ucs2", "ucs2_slovak_ci", "UnicodeBig");
|
||||
putEntry(142, "ucs2", "ucs2_spanish2_ci", "UnicodeBig");
|
||||
putEntry(143, "ucs2", "ucs2_roman_ci", "UnicodeBig");
|
||||
putEntry(144, "ucs2", "ucs2_persian_ci", "UnicodeBig");
|
||||
putEntry(145, "ucs2", "ucs2_esperanto_ci", "UnicodeBig");
|
||||
putEntry(146, "ucs2", "ucs2_hungarian_ci", "UnicodeBig");
|
||||
putEntry(147, "ucs2", "ucs2_sinhala_ci", "UnicodeBig");
|
||||
|
||||
putEntry(160, "utf32", "utf32_unicode_ci", "UTF-32");
|
||||
putEntry(161, "utf32", "utf32_icelandic_ci", "UTF-32");
|
||||
putEntry(162, "utf32", "utf32_latvian_ci", "UTF-32");
|
||||
putEntry(163, "utf32", "utf32_romanian_ci", "UTF-32");
|
||||
putEntry(164, "utf32", "utf32_slovenian_ci", "UTF-32");
|
||||
putEntry(165, "utf32", "utf32_polish_ci", "UTF-32");
|
||||
putEntry(166, "utf32", "utf32_estonian_ci", "UTF-32");
|
||||
putEntry(167, "utf32", "utf32_spanish_ci", "UTF-32");
|
||||
putEntry(168, "utf32", "utf32_swedish_ci", "UTF-32");
|
||||
putEntry(169, "utf32", "utf32_turkish_ci", "UTF-32");
|
||||
putEntry(170, "utf32", "utf32_czech_ci", "UTF-32");
|
||||
putEntry(171, "utf32", "utf32_danish_ci", "UTF-32");
|
||||
putEntry(172, "utf32", "utf32_lithuanian_ci", "UTF-32");
|
||||
putEntry(173, "utf32", "utf32_slovak_ci", "UTF-32");
|
||||
putEntry(174, "utf32", "utf32_spanish2_ci", "UTF-32");
|
||||
putEntry(175, "utf32", "utf32_roman_ci", "UTF-32");
|
||||
putEntry(176, "utf32", "utf32_persian_ci", "UTF-32");
|
||||
putEntry(177, "utf32", "utf32_esperanto_ci", "UTF-32");
|
||||
putEntry(178, "utf32", "utf32_hungarian_ci", "UTF-32");
|
||||
putEntry(179, "utf32", "utf32_sinhala_ci", "UTF-32");
|
||||
|
||||
putEntry(192, "utf8", "utf8_unicode_ci", "UTF-8");
|
||||
putEntry(193, "utf8", "utf8_icelandic_ci", "UTF-8");
|
||||
putEntry(194, "utf8", "utf8_latvian_ci", "UTF-8");
|
||||
putEntry(195, "utf8", "utf8_romanian_ci", "UTF-8");
|
||||
putEntry(196, "utf8", "utf8_slovenian_ci", "UTF-8");
|
||||
putEntry(197, "utf8", "utf8_polish_ci", "UTF-8");
|
||||
putEntry(198, "utf8", "utf8_estonian_ci", "UTF-8");
|
||||
putEntry(199, "utf8", "utf8_spanish_ci", "UTF-8");
|
||||
putEntry(200, "utf8", "utf8_swedish_ci", "UTF-8");
|
||||
putEntry(201, "utf8", "utf8_turkish_ci", "UTF-8");
|
||||
putEntry(202, "utf8", "utf8_czech_ci", "UTF-8");
|
||||
putEntry(203, "utf8", "utf8_danish_ci", "UTF-8");
|
||||
putEntry(204, "utf8", "utf8_lithuanian_ci", "UTF-8");
|
||||
putEntry(205, "utf8", "utf8_slovak_ci", "UTF-8");
|
||||
putEntry(206, "utf8", "utf8_spanish2_ci", "UTF-8");
|
||||
putEntry(207, "utf8", "utf8_roman_ci", "UTF-8");
|
||||
putEntry(208, "utf8", "utf8_persian_ci", "UTF-8");
|
||||
putEntry(209, "utf8", "utf8_esperanto_ci", "UTF-8");
|
||||
putEntry(210, "utf8", "utf8_hungarian_ci", "UTF-8");
|
||||
putEntry(211, "utf8", "utf8_sinhala_ci", "UTF-8");
|
||||
|
||||
putEntry(224, "utf8mb4", "utf8mb4_unicode_ci", "UTF-8");
|
||||
putEntry(225, "utf8mb4", "utf8mb4_icelandic_ci", "UTF-8");
|
||||
putEntry(226, "utf8mb4", "utf8mb4_latvian_ci", "UTF-8");
|
||||
putEntry(227, "utf8mb4", "utf8mb4_romanian_ci", "UTF-8");
|
||||
putEntry(228, "utf8mb4", "utf8mb4_slovenian_ci", "UTF-8");
|
||||
putEntry(229, "utf8mb4", "utf8mb4_polish_ci", "UTF-8");
|
||||
putEntry(230, "utf8mb4", "utf8mb4_estonian_ci", "UTF-8");
|
||||
putEntry(231, "utf8mb4", "utf8mb4_spanish_ci", "UTF-8");
|
||||
putEntry(232, "utf8mb4", "utf8mb4_swedish_ci", "UTF-8");
|
||||
putEntry(233, "utf8mb4", "utf8mb4_turkish_ci", "UTF-8");
|
||||
putEntry(234, "utf8mb4", "utf8mb4_czech_ci", "UTF-8");
|
||||
putEntry(235, "utf8mb4", "utf8mb4_danish_ci", "UTF-8");
|
||||
putEntry(236, "utf8mb4", "utf8mb4_lithuanian_ci", "UTF-8");
|
||||
putEntry(237, "utf8mb4", "utf8mb4_slovak_ci", "UTF-8");
|
||||
putEntry(238, "utf8mb4", "utf8mb4_spanish2_ci", "UTF-8");
|
||||
putEntry(239, "utf8mb4", "utf8mb4_roman_ci", "UTF-8");
|
||||
putEntry(240, "utf8mb4", "utf8mb4_persian_ci", "UTF-8");
|
||||
putEntry(241, "utf8mb4", "utf8mb4_esperanto_ci", "UTF-8");
|
||||
putEntry(242, "utf8mb4", "utf8mb4_hungarian_ci", "UTF-8");
|
||||
putEntry(243, "utf8mb4", "utf8mb4_sinhala_ci", "UTF-8");
|
||||
|
||||
putEntry(254, "utf8", "utf8_general_cs", "UTF-8");
|
||||
}
|
||||
|
||||
/**
|
||||
* Return defined charset name for mysql.
|
||||
*/
|
||||
public static String getCharset(final int id) {
|
||||
Entry entry = getEntry(id);
|
||||
|
||||
if (entry != null) {
|
||||
return entry.mysqlCharset;
|
||||
} else {
|
||||
logger.warn("Unexpect mysql charset: " + id);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return defined collaction name for mysql.
|
||||
*/
|
||||
public static String getCollation(final int id) {
|
||||
Entry entry = getEntry(id);
|
||||
|
||||
if (entry != null) {
|
||||
return entry.mysqlCollation;
|
||||
} else {
|
||||
logger.warn("Unexpect mysql charset: " + id);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return converted charset name for java.
|
||||
*/
|
||||
public static String getJavaCharset(final int id) {
|
||||
Entry entry = getEntry(id);
|
||||
|
||||
if (entry != null) {
|
||||
if (entry.javaCharset != null) {
|
||||
return entry.javaCharset;
|
||||
} else {
|
||||
logger.warn("Unknown java charset for: id = " + id + ", name = " + entry.mysqlCharset + ", coll = "
|
||||
+ entry.mysqlCollation);
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
logger.warn("Unexpect mysql charset: " + id);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (int i = 0; i < entries.length; i++) {
|
||||
Entry entry = entries[i];
|
||||
|
||||
System.out.print(i);
|
||||
System.out.print(',');
|
||||
System.out.print(' ');
|
||||
if (entry != null) {
|
||||
System.out.print(entry.mysqlCharset);
|
||||
System.out.print(',');
|
||||
System.out.print(' ');
|
||||
System.out.print(entry.javaCharset);
|
||||
if (entry.javaCharset != null) {
|
||||
System.out.print(',');
|
||||
System.out.print(' ');
|
||||
System.out.print(Charset.forName(entry.javaCharset).name());
|
||||
}
|
||||
} else {
|
||||
System.out.print("null");
|
||||
}
|
||||
System.out.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,386 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.io.OutputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
/**
|
||||
* TODO: Document It!!
|
||||
*
|
||||
* <pre>
|
||||
* DirectLogFetcher fetcher = new DirectLogFetcher();
|
||||
* fetcher.open(conn, file, 0, 13);
|
||||
*
|
||||
* while (fetcher.fetch()) {
|
||||
* LogEvent event;
|
||||
* do {
|
||||
* event = decoder.decode(fetcher, context);
|
||||
*
|
||||
* // process log event.
|
||||
* } while (event != null);
|
||||
* }
|
||||
* // connection closed.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="mailto:changyuan.lh@taobao.com">Changyuan.lh</a>
|
||||
* @version 1.0
|
||||
*/
|
||||
public final class DirectLogFetcher extends LogFetcher {
|
||||
|
||||
protected static final Log logger = LogFactory.getLog(DirectLogFetcher.class);
|
||||
|
||||
/** Command to dump binlog */
|
||||
public static final byte COM_BINLOG_DUMP = 18;
|
||||
|
||||
/** Packet header sizes */
|
||||
public static final int NET_HEADER_SIZE = 4;
|
||||
public static final int SQLSTATE_LENGTH = 5;
|
||||
|
||||
/** Packet offsets */
|
||||
public static final int PACKET_LEN_OFFSET = 0;
|
||||
public static final int PACKET_SEQ_OFFSET = 3;
|
||||
|
||||
/** Maximum packet length */
|
||||
public static final int MAX_PACKET_LENGTH = (256 * 256 * 256 - 1);
|
||||
|
||||
/** BINLOG_DUMP options */
|
||||
public static final int BINLOG_DUMP_NON_BLOCK = 1;
|
||||
public static final int BINLOG_SEND_ANNOTATE_ROWS_EVENT = 2;
|
||||
|
||||
private Connection conn;
|
||||
private OutputStream mysqlOutput;
|
||||
private InputStream mysqlInput;
|
||||
|
||||
public DirectLogFetcher(){
|
||||
super(DEFAULT_INITIAL_CAPACITY, DEFAULT_GROWTH_FACTOR);
|
||||
}
|
||||
|
||||
public DirectLogFetcher(final int initialCapacity){
|
||||
super(initialCapacity, DEFAULT_GROWTH_FACTOR);
|
||||
}
|
||||
|
||||
public DirectLogFetcher(final int initialCapacity, final float growthFactor){
|
||||
super(initialCapacity, growthFactor);
|
||||
}
|
||||
|
||||
private static final Object unwrapConnection(Object conn, Class<?> connClazz) throws IOException {
|
||||
while (!connClazz.isInstance(conn)) {
|
||||
try {
|
||||
Class<?> connProxy = Class.forName("org.springframework.jdbc.datasource.ConnectionProxy");
|
||||
if (connProxy.isInstance(conn)) {
|
||||
conn = invokeMethod(conn, connProxy, "getTargetConnection");
|
||||
continue;
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
// org.springframework.jdbc.datasource.ConnectionProxy not
|
||||
// found.
|
||||
}
|
||||
|
||||
try {
|
||||
Class<?> connProxy = Class.forName("org.apache.commons.dbcp.DelegatingConnection");
|
||||
if (connProxy.isInstance(conn)) {
|
||||
conn = getDeclaredField(conn, connProxy, "_conn");
|
||||
continue;
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
// org.apache.commons.dbcp.DelegatingConnection not found.
|
||||
}
|
||||
|
||||
try {
|
||||
if (conn instanceof java.sql.Wrapper) {
|
||||
Class<?> connIface = Class.forName("com.mysql.jdbc.Connection");
|
||||
conn = ((java.sql.Wrapper) conn).unwrap(connIface);
|
||||
continue;
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
// com.mysql.jdbc.Connection not found.
|
||||
} catch (SQLException e) {
|
||||
logger.warn("Unwrap " + conn.getClass().getName() + " to " + connClazz.getName() + " failed: "
|
||||
+ e.getMessage(),
|
||||
e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
return conn;
|
||||
}
|
||||
|
||||
private static final Object invokeMethod(Object obj, Class<?> objClazz, String name) {
|
||||
try {
|
||||
Method method = objClazz.getMethod(name, (Class<?>[]) null);
|
||||
return method.invoke(obj, (Object[]) null);
|
||||
} catch (NoSuchMethodException e) {
|
||||
throw new IllegalArgumentException("No such method: \'" + name + "\' @ " + objClazz.getName(), e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new IllegalArgumentException("Cannot invoke method: \'" + name + "\' @ " + objClazz.getName(), e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw new IllegalArgumentException("Invoke method failed: \'" + name + "\' @ " + objClazz.getName(),
|
||||
e.getTargetException());
|
||||
}
|
||||
}
|
||||
|
||||
private static final Object getDeclaredField(Object obj, Class<?> objClazz, String name) {
|
||||
try {
|
||||
Field field = objClazz.getDeclaredField(name);
|
||||
field.setAccessible(true);
|
||||
return field.get(obj);
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw new IllegalArgumentException("No such field: \'" + name + "\' @ " + objClazz.getName(), e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw new IllegalArgumentException("Cannot get field: \'" + name + "\' @ " + objClazz.getName(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect MySQL master to fetch binlog.
|
||||
*/
|
||||
public void open(Connection conn, String fileName, final int serverId) throws IOException {
|
||||
open(conn, fileName, BIN_LOG_HEADER_SIZE, serverId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect MySQL master to fetch binlog.
|
||||
*/
|
||||
public void open(Connection conn, String fileName, final int serverId, boolean nonBlocking) throws IOException {
|
||||
open(conn, fileName, BIN_LOG_HEADER_SIZE, serverId, nonBlocking);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect MySQL master to fetch binlog.
|
||||
*/
|
||||
public void open(Connection conn, String fileName, final long filePosition, final int serverId) throws IOException {
|
||||
open(conn, fileName, filePosition, serverId, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect MySQL master to fetch binlog.
|
||||
*/
|
||||
public void open(Connection conn, String fileName, long filePosition, final int serverId, boolean nonBlocking)
|
||||
throws IOException {
|
||||
try {
|
||||
this.conn = conn;
|
||||
Class<?> connClazz = Class.forName("com.mysql.jdbc.ConnectionImpl");
|
||||
Object unwrapConn = unwrapConnection(conn, connClazz);
|
||||
if (unwrapConn == null) {
|
||||
throw new IOException("Unable to unwrap " + conn.getClass().getName()
|
||||
+ " to com.mysql.jdbc.ConnectionImpl");
|
||||
}
|
||||
|
||||
// Get underlying IO streams for network communications.
|
||||
Object connIo = getDeclaredField(unwrapConn, connClazz, "io");
|
||||
if (connIo == null) {
|
||||
throw new IOException("Get null field:" + conn.getClass().getName() + "#io");
|
||||
}
|
||||
mysqlOutput = (OutputStream) getDeclaredField(connIo, connIo.getClass(), "mysqlOutput");
|
||||
mysqlInput = (InputStream) getDeclaredField(connIo, connIo.getClass(), "mysqlInput");
|
||||
|
||||
if (filePosition == 0) filePosition = BIN_LOG_HEADER_SIZE;
|
||||
sendBinlogDump(fileName, filePosition, serverId, nonBlocking);
|
||||
position = 0;
|
||||
} catch (IOException e) {
|
||||
close(); /* Do cleanup */
|
||||
logger.error("Error on COM_BINLOG_DUMP: file = " + fileName + ", position = " + filePosition);
|
||||
throw e;
|
||||
} catch (ClassNotFoundException e) {
|
||||
close(); /* Do cleanup */
|
||||
throw new IOException("Unable to load com.mysql.jdbc.ConnectionImpl", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a byte in the buffer.
|
||||
*
|
||||
* @param b the byte to put in the buffer
|
||||
*/
|
||||
protected final void putByte(byte b) {
|
||||
ensureCapacity(position + 1);
|
||||
|
||||
buffer[position++] = b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Put 16-bit integer in the buffer.
|
||||
*
|
||||
* @param i16 the integer to put in the buffer
|
||||
*/
|
||||
protected final void putInt16(int i16) {
|
||||
ensureCapacity(position + 2);
|
||||
|
||||
byte[] buf = buffer;
|
||||
buf[position++] = (byte) (i16 & 0xff);
|
||||
buf[position++] = (byte) (i16 >>> 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put 32-bit integer in the buffer.
|
||||
*
|
||||
* @param i32 the integer to put in the buffer
|
||||
*/
|
||||
protected final void putInt32(long i32) {
|
||||
ensureCapacity(position + 4);
|
||||
|
||||
byte[] buf = buffer;
|
||||
buf[position++] = (byte) (i32 & 0xff);
|
||||
buf[position++] = (byte) (i32 >>> 8);
|
||||
buf[position++] = (byte) (i32 >>> 16);
|
||||
buf[position++] = (byte) (i32 >>> 24);
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a string in the buffer.
|
||||
*
|
||||
* @param s the value to put in the buffer
|
||||
*/
|
||||
protected final void putString(String s) {
|
||||
ensureCapacity(position + (s.length() * 2) + 1);
|
||||
|
||||
System.arraycopy(s.getBytes(), 0, buffer, position, s.length());
|
||||
position += s.length();
|
||||
buffer[position++] = 0;
|
||||
}
|
||||
|
||||
protected final void sendBinlogDump(String fileName, final long filePosition, final int serverId,
|
||||
boolean nonBlocking) throws IOException {
|
||||
position = NET_HEADER_SIZE;
|
||||
|
||||
putByte(COM_BINLOG_DUMP);
|
||||
putInt32(filePosition);
|
||||
int binlog_flags = nonBlocking ? BINLOG_DUMP_NON_BLOCK : 0;
|
||||
binlog_flags |= BINLOG_SEND_ANNOTATE_ROWS_EVENT;
|
||||
putInt16(binlog_flags); // binlog_flags
|
||||
putInt32(serverId); // slave's server-id
|
||||
putString(fileName);
|
||||
|
||||
final byte[] buf = buffer;
|
||||
final int len = position - NET_HEADER_SIZE;
|
||||
buf[0] = (byte) (len & 0xff);
|
||||
buf[1] = (byte) (len >>> 8);
|
||||
buf[2] = (byte) (len >>> 16);
|
||||
|
||||
mysqlOutput.write(buffer, 0, position);
|
||||
mysqlOutput.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see com.taobao.tddl.dbsync.binlog.LogFetcher#fetch()
|
||||
*/
|
||||
public boolean fetch() throws IOException {
|
||||
try {
|
||||
// Fetching packet header from input.
|
||||
if (!fetch0(0, NET_HEADER_SIZE)) {
|
||||
logger.warn("Reached end of input stream while fetching header");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Fetching the first packet(may a multi-packet).
|
||||
int netlen = getUint24(PACKET_LEN_OFFSET);
|
||||
int netnum = getUint8(PACKET_SEQ_OFFSET);
|
||||
if (!fetch0(NET_HEADER_SIZE, netlen)) {
|
||||
logger.warn("Reached end of input stream: packet #" + netnum + ", len = " + netlen);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Detecting error code.
|
||||
final int mark = getUint8(NET_HEADER_SIZE);
|
||||
if (mark != 0) {
|
||||
if (mark == 255) // error from master
|
||||
{
|
||||
// Indicates an error, for example trying to fetch from
|
||||
// wrong
|
||||
// binlog position.
|
||||
position = NET_HEADER_SIZE + 1;
|
||||
final int errno = getInt16();
|
||||
String sqlstate = forward(1).getFixString(SQLSTATE_LENGTH);
|
||||
String errmsg = getFixString(limit - position);
|
||||
throw new IOException("Received error packet:" + " errno = " + errno + ", sqlstate = " + sqlstate
|
||||
+ " errmsg = " + errmsg);
|
||||
} else if (mark == 254) {
|
||||
// Indicates end of stream. It's not clear when this would
|
||||
// be sent.
|
||||
logger.warn("Received EOF packet from server, apparent" + " master disconnected.");
|
||||
return false;
|
||||
} else {
|
||||
// Should not happen.
|
||||
throw new IOException("Unexpected response " + mark + " while fetching binlog: packet #" + netnum
|
||||
+ ", len = " + netlen);
|
||||
}
|
||||
}
|
||||
|
||||
// The first packet is a multi-packet, concatenate the packets.
|
||||
while (netlen == MAX_PACKET_LENGTH) {
|
||||
if (!fetch0(0, NET_HEADER_SIZE)) {
|
||||
logger.warn("Reached end of input stream while fetching header");
|
||||
return false;
|
||||
}
|
||||
|
||||
netlen = getUint24(PACKET_LEN_OFFSET);
|
||||
netnum = getUint8(PACKET_SEQ_OFFSET);
|
||||
if (!fetch0(limit, netlen)) {
|
||||
logger.warn("Reached end of input stream: packet #" + netnum + ", len = " + netlen);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Preparing buffer variables to decoding.
|
||||
origin = NET_HEADER_SIZE + 1;
|
||||
position = origin;
|
||||
limit -= origin;
|
||||
return true;
|
||||
} catch (SocketTimeoutException e) {
|
||||
close(); /* Do cleanup */
|
||||
logger.error("Socket timeout expired, closing connection", e);
|
||||
throw e;
|
||||
} catch (InterruptedIOException e) {
|
||||
close(); /* Do cleanup */
|
||||
logger.warn("I/O interrupted while reading from client socket", e);
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
close(); /* Do cleanup */
|
||||
logger.error("I/O error while reading from client socket", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private final boolean fetch0(final int off, final int len) throws IOException {
|
||||
ensureCapacity(off + len);
|
||||
|
||||
for (int count, n = 0; n < len; n += count) {
|
||||
if (0 > (count = mysqlInput.read(buffer, off + n, len - n))) {
|
||||
// Reached end of input stream
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (limit < off + len) limit = off + len;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see com.taobao.tddl.dbsync.binlog.LogFetcher#close()
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
try {
|
||||
if (conn != null) conn.close();
|
||||
|
||||
conn = null;
|
||||
mysqlInput = null;
|
||||
mysqlOutput = null;
|
||||
} catch (SQLException e) {
|
||||
logger.warn("Unable to close connection", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent;
|
||||
|
||||
/**
|
||||
* TODO: Document It!!
|
||||
*
|
||||
* <pre>
|
||||
* FileLogFetcher fetcher = new FileLogFetcher();
|
||||
* fetcher.open(file, 0);
|
||||
*
|
||||
* while (fetcher.fetch()) {
|
||||
* LogEvent event;
|
||||
* do {
|
||||
* event = decoder.decode(fetcher, context);
|
||||
*
|
||||
* // process log event.
|
||||
* } while (event != null);
|
||||
* }
|
||||
* // file ending reached.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="mailto:changyuan.lh@taobao.com">Changyuan.lh</a>
|
||||
* @version 1.0
|
||||
*/
|
||||
public final class FileLogFetcher extends LogFetcher {
|
||||
|
||||
public static final byte[] BINLOG_MAGIC = { -2, 0x62, 0x69, 0x6e };
|
||||
|
||||
private FileInputStream fin;
|
||||
|
||||
public FileLogFetcher(){
|
||||
super(DEFAULT_INITIAL_CAPACITY, DEFAULT_GROWTH_FACTOR);
|
||||
}
|
||||
|
||||
public FileLogFetcher(final int initialCapacity){
|
||||
super(initialCapacity, DEFAULT_GROWTH_FACTOR);
|
||||
}
|
||||
|
||||
public FileLogFetcher(final int initialCapacity, final float growthFactor){
|
||||
super(initialCapacity, growthFactor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open binlog file in local disk to fetch.
|
||||
*/
|
||||
public void open(File file) throws FileNotFoundException, IOException {
|
||||
open(file, 0L);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open binlog file in local disk to fetch.
|
||||
*/
|
||||
public void open(String filePath) throws FileNotFoundException, IOException {
|
||||
open(new File(filePath), 0L);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open binlog file in local disk to fetch.
|
||||
*/
|
||||
public void open(String filePath, final long filePosition) throws FileNotFoundException, IOException {
|
||||
open(new File(filePath), filePosition);
|
||||
}
|
||||
|
||||
/**
|
||||
* Open binlog file in local disk to fetch.
|
||||
*/
|
||||
public void open(File file, final long filePosition) throws FileNotFoundException, IOException {
|
||||
fin = new FileInputStream(file);
|
||||
|
||||
ensureCapacity(BIN_LOG_HEADER_SIZE);
|
||||
if (BIN_LOG_HEADER_SIZE != fin.read(buffer, 0, BIN_LOG_HEADER_SIZE)) throw new IOException("No binlog file header");
|
||||
|
||||
if (buffer[0] != BINLOG_MAGIC[0] || buffer[1] != BINLOG_MAGIC[1] || buffer[2] != BINLOG_MAGIC[2]
|
||||
|| buffer[3] != BINLOG_MAGIC[3]) {
|
||||
throw new IOException("Error binlog file header: "
|
||||
+ Arrays.toString(Arrays.copyOf(buffer, BIN_LOG_HEADER_SIZE)));
|
||||
}
|
||||
|
||||
limit = 0;
|
||||
origin = 0;
|
||||
position = 0;
|
||||
|
||||
if (filePosition > BIN_LOG_HEADER_SIZE) {
|
||||
final int maxFormatDescriptionEventLen = FormatDescriptionLogEvent.LOG_EVENT_MINIMAL_HEADER_LEN
|
||||
+ FormatDescriptionLogEvent.ST_COMMON_HEADER_LEN_OFFSET
|
||||
+ LogEvent.ENUM_END_EVENT + LogEvent.BINLOG_CHECKSUM_ALG_DESC_LEN
|
||||
+ LogEvent.CHECKSUM_CRC32_SIGNATURE_LEN;
|
||||
|
||||
ensureCapacity(maxFormatDescriptionEventLen);
|
||||
limit = fin.read(buffer, 0, maxFormatDescriptionEventLen);
|
||||
limit = (int) getUint32(LogEvent.EVENT_LEN_OFFSET);
|
||||
fin.getChannel().position(filePosition);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see com.taobao.tddl.dbsync.binlog.LogFetcher#fetch()
|
||||
*/
|
||||
public boolean fetch() throws IOException {
|
||||
if (limit == 0) {
|
||||
final int len = fin.read(buffer, 0, buffer.length);
|
||||
if (len >= 0) {
|
||||
limit += len;
|
||||
position = 0;
|
||||
origin = 0;
|
||||
|
||||
/* More binlog to fetch */
|
||||
return true;
|
||||
}
|
||||
} else if (origin == 0) {
|
||||
if (limit > buffer.length / 2) {
|
||||
ensureCapacity(buffer.length + limit);
|
||||
}
|
||||
final int len = fin.read(buffer, limit, buffer.length - limit);
|
||||
if (len >= 0) {
|
||||
limit += len;
|
||||
|
||||
/* More binlog to fetch */
|
||||
return true;
|
||||
}
|
||||
} else if (limit > 0) {
|
||||
System.arraycopy(buffer, origin, buffer, 0, limit);
|
||||
position -= origin;
|
||||
origin = 0;
|
||||
final int len = fin.read(buffer, limit, buffer.length - limit);
|
||||
if (len >= 0) {
|
||||
limit += len;
|
||||
|
||||
/* More binlog to fetch */
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
/* Should not happen. */
|
||||
throw new IllegalArgumentException("Unexcepted limit: " + limit);
|
||||
}
|
||||
|
||||
/* Reach binlog file end */
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @see com.taobao.tddl.dbsync.binlog.LogFetcher#close()
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
if (fin != null) fin.close();
|
||||
|
||||
fin = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,418 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
/**
|
||||
* 处理下MySQL json二进制转化为可读的字符串
|
||||
*
|
||||
* @author agapple 2016年6月30日 上午11:26:17
|
||||
* @since 1.0.22
|
||||
*/
|
||||
public class JsonConversion {
|
||||
|
||||
// JSON TYPE
|
||||
public static final int JSONB_TYPE_SMALL_OBJECT = 0x0;
|
||||
public static final int JSONB_TYPE_LARGE_OBJECT = 0x1;
|
||||
public static final int JSONB_TYPE_SMALL_ARRAY = 0x2;
|
||||
public static final int JSONB_TYPE_LARGE_ARRAY = 0x3;
|
||||
public static final int JSONB_TYPE_LITERAL = 0x4;
|
||||
public static final int JSONB_TYPE_INT16 = 0x5;
|
||||
public static final int JSONB_TYPE_UINT16 = 0x6;
|
||||
public static final int JSONB_TYPE_INT32 = 0x7;
|
||||
public static final int JSONB_TYPE_UINT32 = 0x8;
|
||||
public static final int JSONB_TYPE_INT64 = 0x9;
|
||||
public static final int JSONB_TYPE_UINT64 = 0xA;
|
||||
public static final int JSONB_TYPE_DOUBLE = 0xB;
|
||||
public static final int JSONB_TYPE_STRING = 0xC;
|
||||
public static final int JSONB_TYPE_OPAQUE = 0xF;
|
||||
public static final char JSONB_NULL_LITERAL = '\0';
|
||||
public static final char JSONB_TRUE_LITERAL = '\1';
|
||||
public static final char JSONB_FALSE_LITERAL = '\2';
|
||||
|
||||
/*
|
||||
* The size of offset or size fields in the small and the large storage
|
||||
* format for JSON objects and JSON arrays.
|
||||
*/
|
||||
public static final int SMALL_OFFSET_SIZE = 2;
|
||||
public static final int LARGE_OFFSET_SIZE = 4;
|
||||
|
||||
/*
|
||||
* The size of key entries for objects when using the small storage format
|
||||
* or the large storage format. In the small format it is 4 bytes (2 bytes
|
||||
* for key length and 2 bytes for key offset). In the large format it is 6
|
||||
* (2 bytes for length, 4 bytes for offset).
|
||||
*/
|
||||
public static final int KEY_ENTRY_SIZE_SMALL = (2 + SMALL_OFFSET_SIZE);
|
||||
public static final int KEY_ENTRY_SIZE_LARGE = (2 + LARGE_OFFSET_SIZE);
|
||||
|
||||
/*
|
||||
* The size of value entries for objects or arrays. When using the small
|
||||
* storage format, the entry size is 3 (1 byte for type, 2 bytes for
|
||||
* offset). When using the large storage format, it is 5 (1 byte for type, 4
|
||||
* bytes for offset).
|
||||
*/
|
||||
public static final int VALUE_ENTRY_SIZE_SMALL = (1 + SMALL_OFFSET_SIZE);
|
||||
public static final int VALUE_ENTRY_SIZE_LARGE = (1 + LARGE_OFFSET_SIZE);
|
||||
|
||||
public static Json_Value parse_value(int type, LogBuffer buffer, long len, String charsetName) {
|
||||
buffer = buffer.duplicate(buffer.position(), (int) len);
|
||||
switch (type) {
|
||||
case JSONB_TYPE_SMALL_OBJECT:
|
||||
return parse_array_or_object(Json_enum_type.OBJECT, buffer, len, false, charsetName);
|
||||
case JSONB_TYPE_LARGE_OBJECT:
|
||||
return parse_array_or_object(Json_enum_type.OBJECT, buffer, len, true, charsetName);
|
||||
case JSONB_TYPE_SMALL_ARRAY:
|
||||
return parse_array_or_object(Json_enum_type.ARRAY, buffer, len, false, charsetName);
|
||||
case JSONB_TYPE_LARGE_ARRAY:
|
||||
return parse_array_or_object(Json_enum_type.ARRAY, buffer, len, true, charsetName);
|
||||
default:
|
||||
return parse_scalar(type, buffer, len, charsetName);
|
||||
}
|
||||
}
|
||||
|
||||
private static Json_Value parse_array_or_object(Json_enum_type type, LogBuffer buffer, long len, boolean large,
|
||||
String charsetName) {
|
||||
long offset_size = large ? LARGE_OFFSET_SIZE : SMALL_OFFSET_SIZE;
|
||||
if (len < 2 * offset_size) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
long element_count = read_offset_or_size(buffer, large);
|
||||
long bytes = read_offset_or_size(buffer, large);
|
||||
|
||||
if (bytes > len) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
long header_size = 2 * offset_size;
|
||||
if (type == Json_enum_type.OBJECT) {
|
||||
header_size += element_count * (large ? KEY_ENTRY_SIZE_LARGE : KEY_ENTRY_SIZE_SMALL);
|
||||
}
|
||||
|
||||
header_size += element_count * (large ? VALUE_ENTRY_SIZE_LARGE : VALUE_ENTRY_SIZE_SMALL);
|
||||
if (header_size > bytes) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
return new Json_Value(type, buffer.rewind(), element_count, bytes, large);
|
||||
}
|
||||
|
||||
private static long read_offset_or_size(LogBuffer buffer, boolean large) {
|
||||
return large ? buffer.getUint32() : buffer.getUint16();
|
||||
}
|
||||
|
||||
private static Json_Value parse_scalar(int type, LogBuffer buffer, long len, String charsetName) {
|
||||
switch (type) {
|
||||
case JSONB_TYPE_LITERAL:
|
||||
/* purecov: inspected */
|
||||
int data = buffer.getUint8();
|
||||
switch (data) {
|
||||
case JSONB_NULL_LITERAL:
|
||||
return new Json_Value(Json_enum_type.LITERAL_NULL);
|
||||
case JSONB_TRUE_LITERAL:
|
||||
return new Json_Value(Json_enum_type.LITERAL_TRUE);
|
||||
case JSONB_FALSE_LITERAL:
|
||||
return new Json_Value(Json_enum_type.LITERAL_FALSE);
|
||||
default:
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
case JSONB_TYPE_INT16:
|
||||
return new Json_Value(Json_enum_type.INT, buffer.getInt16());
|
||||
case JSONB_TYPE_INT32:
|
||||
return new Json_Value(Json_enum_type.INT, buffer.getInt32());
|
||||
case JSONB_TYPE_INT64:
|
||||
return new Json_Value(Json_enum_type.INT, buffer.getLong64());
|
||||
case JSONB_TYPE_UINT16:
|
||||
return new Json_Value(Json_enum_type.UINT, buffer.getUint16());
|
||||
case JSONB_TYPE_UINT32:
|
||||
return new Json_Value(Json_enum_type.UINT, buffer.getUint32());
|
||||
case JSONB_TYPE_UINT64:
|
||||
return new Json_Value(Json_enum_type.UINT, buffer.getUlong64());
|
||||
case JSONB_TYPE_DOUBLE:
|
||||
return new Json_Value(Json_enum_type.DOUBLE, Double.valueOf(buffer.getDouble64()));
|
||||
case JSONB_TYPE_STRING:
|
||||
int max_bytes = (int) Math.min(len, 5);
|
||||
long tlen = 0;
|
||||
long str_len = 0;
|
||||
long n = 0;
|
||||
byte[] datas = buffer.getData(max_bytes);
|
||||
for (int i = 0; i < max_bytes; i++) {
|
||||
// Get the next 7 bits of the length.
|
||||
tlen |= (datas[i] & 0x7f) << (7 * i);
|
||||
if ((datas[i] & 0x80) == 0) {
|
||||
// The length shouldn't exceed 32 bits.
|
||||
if (tlen > 4294967296L) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
|
||||
// This was the last byte. Return successfully.
|
||||
n = i + 1;
|
||||
str_len = tlen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (len < n + str_len) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
return new Json_Value(Json_enum_type.STRING, buffer.rewind()
|
||||
.forward((int) n)
|
||||
.getFixString((int) str_len, charsetName));
|
||||
case JSONB_TYPE_OPAQUE:
|
||||
/*
|
||||
* There should always be at least one byte, which tells the
|
||||
* field type of the opaque value.
|
||||
*/
|
||||
// The type is encoded as a uint8 that maps to an
|
||||
// enum_field_types.
|
||||
int type_byte = buffer.getUint8();
|
||||
int position = buffer.position();
|
||||
// Then there's the length of the value.
|
||||
int q_max_bytes = (int) Math.min(len, 5);
|
||||
long q_tlen = 0;
|
||||
long q_str_len = 0;
|
||||
long q_n = 0;
|
||||
byte[] q_datas = buffer.getData(q_max_bytes);
|
||||
for (int i = 0; i < q_max_bytes; i++) {
|
||||
// Get the next 7 bits of the length.
|
||||
q_tlen |= (q_datas[i] & 0x7f) << (7 * i);
|
||||
if ((q_datas[i] & 0x80) == 0) {
|
||||
// The length shouldn't exceed 32 bits.
|
||||
if (q_tlen > 4294967296L) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
|
||||
// This was the last byte. Return successfully.
|
||||
q_n = i + 1;
|
||||
q_str_len = q_tlen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (q_str_len == 0 || len < q_n + q_str_len) {
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
return new Json_Value(type_byte, buffer.position(position).forward((int) q_n), q_str_len);
|
||||
default:
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
}
|
||||
|
||||
public static class Json_Value {
|
||||
|
||||
Json_enum_type m_type;
|
||||
int m_field_type;
|
||||
LogBuffer m_data;
|
||||
long m_element_count;
|
||||
long m_length;
|
||||
String m_string_value;
|
||||
Number m_int_value;
|
||||
double m_double_value;
|
||||
boolean m_large;
|
||||
|
||||
public Json_Value(Json_enum_type t){
|
||||
this.m_type = t;
|
||||
}
|
||||
|
||||
public Json_Value(Json_enum_type t, Number val){
|
||||
this.m_type = t;
|
||||
if (t == Json_enum_type.DOUBLE) {
|
||||
this.m_double_value = val.doubleValue();
|
||||
} else {
|
||||
this.m_int_value = val;
|
||||
}
|
||||
}
|
||||
|
||||
public Json_Value(Json_enum_type t, String value){
|
||||
this.m_type = t;
|
||||
this.m_string_value = value;
|
||||
}
|
||||
|
||||
public Json_Value(int field_type, LogBuffer data, long bytes){
|
||||
this.m_type = Json_enum_type.OPAQUE; // 不确定类型
|
||||
this.m_field_type = field_type;
|
||||
this.m_data = data;
|
||||
this.m_length = bytes;
|
||||
}
|
||||
|
||||
public Json_Value(Json_enum_type t, LogBuffer data, long element_count, long bytes, boolean large){
|
||||
this.m_type = t;
|
||||
this.m_data = data;
|
||||
this.m_element_count = element_count;
|
||||
this.m_length = bytes;
|
||||
this.m_large = large;
|
||||
}
|
||||
|
||||
public String key(int i, String charsetName) {
|
||||
m_data.rewind();
|
||||
int offset_size = m_large ? LARGE_OFFSET_SIZE : SMALL_OFFSET_SIZE;
|
||||
int key_entry_size = m_large ? KEY_ENTRY_SIZE_LARGE : KEY_ENTRY_SIZE_SMALL;
|
||||
int entry_offset = 2 * offset_size + key_entry_size * i;
|
||||
// The offset of the key is the first part of the key
|
||||
// entry.
|
||||
m_data.forward(entry_offset);
|
||||
long key_offset = read_offset_or_size(m_data, m_large);
|
||||
// The length of the key is the second part of the
|
||||
// entry, always two
|
||||
// bytes.
|
||||
long key_length = m_data.getUint16();
|
||||
return m_data.rewind().forward((int) key_offset).getFixString((int) key_length, charsetName);
|
||||
}
|
||||
|
||||
public Json_Value element(int i, String charsetName) {
|
||||
m_data.rewind();
|
||||
int offset_size = m_large ? LARGE_OFFSET_SIZE : SMALL_OFFSET_SIZE;
|
||||
int key_entry_size = m_large ? KEY_ENTRY_SIZE_LARGE : KEY_ENTRY_SIZE_SMALL;
|
||||
int value_entry_size = m_large ? VALUE_ENTRY_SIZE_LARGE : VALUE_ENTRY_SIZE_SMALL;
|
||||
int first_entry_offset = 2 * offset_size;
|
||||
if (m_type == Json_enum_type.OBJECT) {
|
||||
first_entry_offset += m_element_count * key_entry_size;
|
||||
}
|
||||
int entry_offset = first_entry_offset + value_entry_size * i;
|
||||
int type = m_data.forward(entry_offset).getUint8();
|
||||
if (type == JSONB_TYPE_INT16 || type == JSONB_TYPE_UINT16 || type == JSONB_TYPE_LITERAL
|
||||
|| (m_large && (type == JSONB_TYPE_INT32 || type == JSONB_TYPE_UINT32))) {
|
||||
return parse_scalar(type, m_data, value_entry_size - 1, charsetName);
|
||||
}
|
||||
int value_offset = (int) read_offset_or_size(m_data, m_large);
|
||||
return parse_value(type, m_data.rewind().forward(value_offset), (int) m_length - value_offset, charsetName);
|
||||
}
|
||||
|
||||
public StringBuilder toJsonString(StringBuilder buf, String charsetName) {
|
||||
switch (m_type) {
|
||||
case OBJECT:
|
||||
buf.append("{");
|
||||
for (int i = 0; i < m_element_count; ++i) {
|
||||
if (i > 0) {
|
||||
buf.append(", ");
|
||||
}
|
||||
buf.append('"').append(key(i, charsetName)).append('"');
|
||||
buf.append(": ");
|
||||
element(i, charsetName).toJsonString(buf, charsetName);
|
||||
}
|
||||
buf.append("}");
|
||||
break;
|
||||
case ARRAY:
|
||||
buf.append("[");
|
||||
for (int i = 0; i < m_element_count; ++i) {
|
||||
if (i > 0) {
|
||||
buf.append(", ");
|
||||
}
|
||||
element(i, charsetName).toJsonString(buf, charsetName);
|
||||
}
|
||||
buf.append("]");
|
||||
break;
|
||||
case DOUBLE:
|
||||
buf.append(Double.valueOf(m_double_value).toString());
|
||||
break;
|
||||
case INT:
|
||||
buf.append(m_int_value.toString());
|
||||
break;
|
||||
case UINT:
|
||||
buf.append(m_int_value.toString());
|
||||
break;
|
||||
case LITERAL_FALSE:
|
||||
buf.append("false");
|
||||
break;
|
||||
case LITERAL_TRUE:
|
||||
buf.append("true");
|
||||
break;
|
||||
case LITERAL_NULL:
|
||||
buf.append("NULL");
|
||||
break;
|
||||
case OPAQUE:
|
||||
String text = null;
|
||||
if (m_field_type == LogEvent.MYSQL_TYPE_NEWDECIMAL) {
|
||||
int precision = m_data.getInt8();
|
||||
int scale = m_data.getInt8();
|
||||
text = m_data.getDecimal(precision, scale).toPlainString();
|
||||
buf.append(text);
|
||||
} else if (m_field_type == LogEvent.MYSQL_TYPE_TIME) {
|
||||
long packed_value = m_data.getLong64();
|
||||
if (packed_value == 0) {
|
||||
text = "00:00:00";
|
||||
} else {
|
||||
long ultime = Math.abs(packed_value);
|
||||
long intpart = ultime >> 24;
|
||||
int frac = (int) (ultime % (1L << 24));
|
||||
text = String.format("%s%02d:%02d:%02d",
|
||||
packed_value >= 0 ? "" : "-",
|
||||
(int) ((intpart >> 12) % (1 << 10)),
|
||||
(int) ((intpart >> 6) % (1 << 6)),
|
||||
(int) (intpart % (1 << 6)));
|
||||
text = text + "." + usecondsToStr(frac, 6);
|
||||
}
|
||||
buf.append('"').append(text).append('"');
|
||||
} else if (m_field_type == LogEvent.MYSQL_TYPE_DATE || m_field_type == LogEvent.MYSQL_TYPE_DATETIME
|
||||
|| m_field_type == LogEvent.MYSQL_TYPE_TIMESTAMP) {
|
||||
long packed_value = m_data.getLong64();
|
||||
if (packed_value == 0) {
|
||||
text = "0000-00-00 00:00:00";
|
||||
} else {
|
||||
// 构造TimeStamp只处理到秒
|
||||
long ultime = Math.abs(packed_value);
|
||||
long intpart = ultime >> 24;
|
||||
int frac = (int) (ultime % (1L << 24));
|
||||
long ymd = intpart >> 17;
|
||||
long ym = ymd >> 5;
|
||||
long hms = intpart % (1 << 17);
|
||||
text = String.format("%04d-%02d-%02d %02d:%02d:%02d",
|
||||
(int) (ym / 13),
|
||||
(int) (ym % 13),
|
||||
(int) (ymd % (1 << 5)),
|
||||
(int) (hms >> 12),
|
||||
(int) ((hms >> 6) % (1 << 6)),
|
||||
(int) (hms % (1 << 6)));
|
||||
text = text + "." + usecondsToStr(frac, 6);
|
||||
}
|
||||
buf.append('"').append(text).append('"');
|
||||
} else {
|
||||
text = m_data.getFixString((int) m_length, charsetName);
|
||||
buf.append('"').append(escapse(text)).append('"');
|
||||
}
|
||||
|
||||
break;
|
||||
case STRING:
|
||||
buf.append('"').append(escapse(m_string_value)).append('"');
|
||||
break;
|
||||
case ERROR:
|
||||
throw new IllegalArgumentException("illegal json data");
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
}
|
||||
|
||||
private static StringBuilder escapse(String data) {
|
||||
StringBuilder sb = new StringBuilder(data.length());
|
||||
int endIndex = data.length();
|
||||
for (int i = 0; i < endIndex; ++i) {
|
||||
char c = data.charAt(i);
|
||||
if (c == '"') {
|
||||
sb.append('\\');
|
||||
} else if (c == '\\') {
|
||||
sb.append("\\");
|
||||
}
|
||||
sb.append(c);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
||||
public static enum Json_enum_type {
|
||||
OBJECT, ARRAY, STRING, INT, UINT, DOUBLE, LITERAL_NULL, LITERAL_TRUE, LITERAL_FALSE, OPAQUE, ERROR
|
||||
}
|
||||
|
||||
private static String usecondsToStr(int frac, int meta) {
|
||||
String sec = String.valueOf(frac);
|
||||
if (meta > 6) {
|
||||
throw new IllegalArgumentException("unknow useconds meta : " + meta);
|
||||
}
|
||||
|
||||
if (sec.length() < 6) {
|
||||
StringBuilder result = new StringBuilder(6);
|
||||
int len = 6 - sec.length();
|
||||
for (; len > 0; len--) {
|
||||
result.append('0');
|
||||
}
|
||||
result.append(sec);
|
||||
sec = result.toString();
|
||||
}
|
||||
|
||||
return sec.substring(0, meta);
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,64 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent;
|
||||
|
||||
/**
|
||||
* TODO: Document Me!! NOTE: Log context will NOT write multi-threaded.
|
||||
*
|
||||
* @author <a href="mailto:changyuan.lh@taobao.com">Changyuan.lh</a>
|
||||
* @version 1.0
|
||||
*/
|
||||
public final class LogContext {
|
||||
|
||||
private final Map<Long, TableMapLogEvent> mapOfTable = new HashMap<Long, TableMapLogEvent>();
|
||||
|
||||
private FormatDescriptionLogEvent formatDescription;
|
||||
|
||||
private LogPosition logPosition;
|
||||
|
||||
public LogContext(){
|
||||
this.formatDescription = FormatDescriptionLogEvent.FORMAT_DESCRIPTION_EVENT_5_x;
|
||||
}
|
||||
|
||||
public LogContext(FormatDescriptionLogEvent descriptionEvent){
|
||||
this.formatDescription = descriptionEvent;
|
||||
}
|
||||
|
||||
public final LogPosition getLogPosition() {
|
||||
return logPosition;
|
||||
}
|
||||
|
||||
public final void setLogPosition(LogPosition logPosition) {
|
||||
this.logPosition = logPosition;
|
||||
}
|
||||
|
||||
public final FormatDescriptionLogEvent getFormatDescription() {
|
||||
return formatDescription;
|
||||
}
|
||||
|
||||
public final void setFormatDescription(FormatDescriptionLogEvent formatDescription) {
|
||||
this.formatDescription = formatDescription;
|
||||
}
|
||||
|
||||
public final void putTable(TableMapLogEvent mapEvent) {
|
||||
mapOfTable.put(Long.valueOf(mapEvent.getTableId()), mapEvent);
|
||||
}
|
||||
|
||||
public final TableMapLogEvent getTable(final long tableId) {
|
||||
return mapOfTable.get(Long.valueOf(tableId));
|
||||
}
|
||||
|
||||
public final void clearAllTables() {
|
||||
mapOfTable.clear();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
formatDescription = FormatDescriptionLogEvent.FORMAT_DESCRIPTION_EVENT_5_x;
|
||||
|
||||
mapOfTable.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,411 @@
|
||||
package com.taobao.tddl.dbsync.binlog;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.BitSet;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.taobao.tddl.dbsync.binlog.event.AppendBlockLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.BeginLoadQueryLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.CreateFileLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.DeleteFileLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.DeleteRowsLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.ExecuteLoadLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.ExecuteLoadQueryLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.FormatDescriptionLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.GtidLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.HeartbeatLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.IgnorableLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.IncidentLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.IntvarLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.LoadLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.LogHeader;
|
||||
import com.taobao.tddl.dbsync.binlog.event.PreviousGtidsLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.QueryLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.RandLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.RotateLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.RowsLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.RowsQueryLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.StartLogEventV3;
|
||||
import com.taobao.tddl.dbsync.binlog.event.StopLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.TableMapLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.UnknownLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.UpdateRowsLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.UserVarLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.WriteRowsLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.XidLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.mariadb.AnnotateRowsEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.mariadb.BinlogCheckPointLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidListLogEvent;
|
||||
import com.taobao.tddl.dbsync.binlog.event.mariadb.MariaGtidLogEvent;
|
||||
|
||||
/**
|
||||
* Implements a binary-log decoder.
|
||||
*
|
||||
* <pre>
|
||||
* LogDecoder decoder = new LogDecoder();
|
||||
* decoder.handle(...);
|
||||
*
|
||||
* LogEvent event;
|
||||
* do
|
||||
* {
|
||||
* event = decoder.decode(buffer, context);
|
||||
*
|
||||
* // process log event.
|
||||
* }
|
||||
* while (event != null);
|
||||
* // no more events in buffer.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="mailto:changyuan.lh@taobao.com">Changyuan.lh</a>
|
||||
* @version 1.0
|
||||
*/
|
||||
public final class LogDecoder {
|
||||
|
||||
protected static final Log logger = LogFactory.getLog(LogDecoder.class);
|
||||
|
||||
protected final BitSet handleSet = new BitSet(LogEvent.ENUM_END_EVENT);
|
||||
|
||||
public LogDecoder(){
|
||||
}
|
||||
|
||||
public LogDecoder(final int fromIndex, final int toIndex){
|
||||
handleSet.set(fromIndex, toIndex);
|
||||
}
|
||||
|
||||
public final void handle(final int fromIndex, final int toIndex) {
|
||||
handleSet.set(fromIndex, toIndex);
|
||||
}
|
||||
|
||||
public final void handle(final int flagIndex) {
|
||||
handleSet.set(flagIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decoding an event from binary-log buffer.
|
||||
*
|
||||
* @return <code>UknownLogEvent</code> if event type is unknown or skipped,
|
||||
* <code>null</code> if buffer is not including a full event.
|
||||
*/
|
||||
public LogEvent decode(LogBuffer buffer, LogContext context) throws IOException {
|
||||
final int limit = buffer.limit();
|
||||
|
||||
if (limit >= FormatDescriptionLogEvent.LOG_EVENT_HEADER_LEN) {
|
||||
LogHeader header = new LogHeader(buffer, context.getFormatDescription());
|
||||
|
||||
final int len = header.getEventLen();
|
||||
if (limit >= len) {
|
||||
LogEvent event;
|
||||
|
||||
/* Checking binary-log's header */
|
||||
if (handleSet.get(header.getType())) {
|
||||
buffer.limit(len);
|
||||
try {
|
||||
/* Decoding binary-log to event */
|
||||
event = decode(buffer, header, context);
|
||||
} catch (IOException e) {
|
||||
if (logger.isWarnEnabled()) logger.warn("Decoding " + LogEvent.getTypeName(header.getType())
|
||||
+ " failed from: " + context.getLogPosition(), e);
|
||||
throw e;
|
||||
} finally {
|
||||
buffer.limit(limit); /* Restore limit */
|
||||
}
|
||||
} else {
|
||||
/* Ignore unsupported binary-log. */
|
||||
event = new UnknownLogEvent(header);
|
||||
}
|
||||
|
||||
/* consume this binary-log. */
|
||||
buffer.consume(len);
|
||||
return event;
|
||||
}
|
||||
}
|
||||
|
||||
/* Rewind buffer's position to 0. */
|
||||
buffer.rewind();
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize an event from buffer.
|
||||
*
|
||||
* @return <code>UknownLogEvent</code> if event type is unknown or skipped.
|
||||
*/
|
||||
public static LogEvent decode(LogBuffer buffer, LogHeader header, LogContext context) throws IOException {
|
||||
FormatDescriptionLogEvent descriptionEvent = context.getFormatDescription();
|
||||
LogPosition logPosition = context.getLogPosition();
|
||||
|
||||
int checksumAlg = LogEvent.BINLOG_CHECKSUM_ALG_UNDEF;
|
||||
if (header.getType() != LogEvent.FORMAT_DESCRIPTION_EVENT) {
|
||||
checksumAlg = descriptionEvent.header.getChecksumAlg();
|
||||
} else {
|
||||
// 如果是format事件自己,也需要处理checksum
|
||||
checksumAlg = header.getChecksumAlg();
|
||||
}
|
||||
|
||||
if (checksumAlg != LogEvent.BINLOG_CHECKSUM_ALG_OFF && checksumAlg != LogEvent.BINLOG_CHECKSUM_ALG_UNDEF) {
|
||||
// remove checksum bytes
|
||||
buffer.limit(header.getEventLen() - LogEvent.BINLOG_CHECKSUM_LEN);
|
||||
}
|
||||
|
||||
switch (header.getType()) {
|
||||
case LogEvent.QUERY_EVENT: {
|
||||
QueryLogEvent event = new QueryLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.XID_EVENT: {
|
||||
XidLogEvent event = new XidLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.TABLE_MAP_EVENT: {
|
||||
TableMapLogEvent mapEvent = new TableMapLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
context.putTable(mapEvent);
|
||||
return mapEvent;
|
||||
}
|
||||
case LogEvent.WRITE_ROWS_EVENT_V1: {
|
||||
RowsLogEvent event = new WriteRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.UPDATE_ROWS_EVENT_V1: {
|
||||
RowsLogEvent event = new UpdateRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.DELETE_ROWS_EVENT_V1: {
|
||||
RowsLogEvent event = new DeleteRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.ROTATE_EVENT: {
|
||||
RotateLogEvent event = new RotateLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition = new LogPosition(event.getFilename(), event.getPosition());
|
||||
context.setLogPosition(logPosition);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.LOAD_EVENT:
|
||||
case LogEvent.NEW_LOAD_EVENT: {
|
||||
LoadLogEvent event = new LoadLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.SLAVE_EVENT: /* can never happen (unused event) */
|
||||
{
|
||||
if (logger.isWarnEnabled()) logger.warn("Skipping unsupported SLAVE_EVENT from: "
|
||||
+ context.getLogPosition());
|
||||
break;
|
||||
}
|
||||
case LogEvent.CREATE_FILE_EVENT: {
|
||||
CreateFileLogEvent event = new CreateFileLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.APPEND_BLOCK_EVENT: {
|
||||
AppendBlockLogEvent event = new AppendBlockLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.DELETE_FILE_EVENT: {
|
||||
DeleteFileLogEvent event = new DeleteFileLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.EXEC_LOAD_EVENT: {
|
||||
ExecuteLoadLogEvent event = new ExecuteLoadLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.START_EVENT_V3: {
|
||||
/* This is sent only by MySQL <=4.x */
|
||||
StartLogEventV3 event = new StartLogEventV3(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.STOP_EVENT: {
|
||||
StopLogEvent event = new StopLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.INTVAR_EVENT: {
|
||||
IntvarLogEvent event = new IntvarLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.RAND_EVENT: {
|
||||
RandLogEvent event = new RandLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.USER_VAR_EVENT: {
|
||||
UserVarLogEvent event = new UserVarLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.FORMAT_DESCRIPTION_EVENT: {
|
||||
descriptionEvent = new FormatDescriptionLogEvent(header, buffer, descriptionEvent);
|
||||
context.setFormatDescription(descriptionEvent);
|
||||
return descriptionEvent;
|
||||
}
|
||||
case LogEvent.PRE_GA_WRITE_ROWS_EVENT: {
|
||||
if (logger.isWarnEnabled()) logger.warn("Skipping unsupported PRE_GA_WRITE_ROWS_EVENT from: "
|
||||
+ context.getLogPosition());
|
||||
// ev = new Write_rows_log_event_old(buf, event_len,
|
||||
// description_event);
|
||||
break;
|
||||
}
|
||||
case LogEvent.PRE_GA_UPDATE_ROWS_EVENT: {
|
||||
if (logger.isWarnEnabled()) logger.warn("Skipping unsupported PRE_GA_UPDATE_ROWS_EVENT from: "
|
||||
+ context.getLogPosition());
|
||||
// ev = new Update_rows_log_event_old(buf, event_len,
|
||||
// description_event);
|
||||
break;
|
||||
}
|
||||
case LogEvent.PRE_GA_DELETE_ROWS_EVENT: {
|
||||
if (logger.isWarnEnabled()) logger.warn("Skipping unsupported PRE_GA_DELETE_ROWS_EVENT from: "
|
||||
+ context.getLogPosition());
|
||||
// ev = new Delete_rows_log_event_old(buf, event_len,
|
||||
// description_event);
|
||||
break;
|
||||
}
|
||||
case LogEvent.BEGIN_LOAD_QUERY_EVENT: {
|
||||
BeginLoadQueryLogEvent event = new BeginLoadQueryLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.EXECUTE_LOAD_QUERY_EVENT: {
|
||||
ExecuteLoadQueryLogEvent event = new ExecuteLoadQueryLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.INCIDENT_EVENT: {
|
||||
IncidentLogEvent event = new IncidentLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.HEARTBEAT_LOG_EVENT: {
|
||||
HeartbeatLogEvent event = new HeartbeatLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.IGNORABLE_LOG_EVENT: {
|
||||
IgnorableLogEvent event = new IgnorableLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.ROWS_QUERY_LOG_EVENT: {
|
||||
RowsQueryLogEvent event = new RowsQueryLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.WRITE_ROWS_EVENT: {
|
||||
RowsLogEvent event = new WriteRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.UPDATE_ROWS_EVENT: {
|
||||
RowsLogEvent event = new UpdateRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.DELETE_ROWS_EVENT: {
|
||||
RowsLogEvent event = new DeleteRowsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
event.fillTable(context);
|
||||
return event;
|
||||
}
|
||||
case LogEvent.GTID_LOG_EVENT:
|
||||
case LogEvent.ANONYMOUS_GTID_LOG_EVENT: {
|
||||
GtidLogEvent event = new GtidLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.PREVIOUS_GTIDS_LOG_EVENT: {
|
||||
PreviousGtidsLogEvent event = new PreviousGtidsLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.ANNOTATE_ROWS_EVENT: {
|
||||
AnnotateRowsEvent event = new AnnotateRowsEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.BINLOG_CHECKPOINT_EVENT: {
|
||||
BinlogCheckPointLogEvent event = new BinlogCheckPointLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.GTID_EVENT: {
|
||||
MariaGtidLogEvent event = new MariaGtidLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
case LogEvent.GTID_LIST_EVENT: {
|
||||
MariaGtidListLogEvent event = new MariaGtidListLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
}
|
||||
default:
|
||||
/*
|
||||
* Create an object of Ignorable_log_event for unrecognized
|
||||
* sub-class. So that SLAVE SQL THREAD will only update the
|
||||
* position and continue.
|
||||
*/
|
||||
if ((buffer.getUint16(LogEvent.FLAGS_OFFSET) & LogEvent.LOG_EVENT_IGNORABLE_F) > 0) {
|
||||
IgnorableLogEvent event = new IgnorableLogEvent(header, buffer, descriptionEvent);
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
return event;
|
||||
} else {
|
||||
if (logger.isWarnEnabled()) logger.warn("Skipping unrecognized binlog event "
|
||||
+ LogEvent.getTypeName(header.getType()) + " from: "
|
||||
+ context.getLogPosition());
|
||||
}
|
||||
}
|
||||
|
||||
/* updating position in context */
|
||||
logPosition.position = header.getLogPos();
|
||||
/* Unknown or unsupported log event */
|
||||
return new UnknownLogEvent(header);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user