Compare commits

..
Author SHA1 Message Date
agapple 8d6f19cc33 fixed default value 2017-10-15 16:19:02 +08:00
agapple 1463463f1e fixed data 2017-10-15 16:08:29 +08:00
agapple 77342663e3 fixed rds binlog local 2017-10-15 15:55:30 +08:00
agapple e01e48ff65 fixed h2 support 2017-10-14 01:14:13 +08:00
agapple 4f00f5ea8d fixed tsdb test 2017-10-14 00:12:43 +08:00
agapple 19707f92d4 merge tsdb meta support and refactor 2017-09-30 23:21:17 +08:00
agapple 3930ea0f9b Merge pull request #393 from KaimingWan/table_meta_support
Table meta support
2017-09-30 15:48:53 +08:00
wanshao 676cf47987 Merge branch 'master' into table_meta_support
# Conflicts:
#	parse/src/main/java/com/alibaba/otter/canal/parse/inbound/mysql/dbsync/LogEventConvert.java
2017-09-30 15:47:02 +08:00
agapple 788c1d9b84 fixed issue #360 , socket pool bug 2017-09-23 11:50:25 +08:00
agapple 84a9aeb46c Merge pull request #374 from alexandnpu/feature/avoid_use_multiline_exception_directly
try to avoid use multiline exception directly
2017-09-23 11:11:27 +08:00
kaimingwan e8da1c884b table meta support 2017-09-22 22:01:57 +08:00
alex.zheng 041cbf04c7 add uncaughtexception handler 2017-09-06 12:07:50 +08:00
alex.zheng a1cf292baa try to avoid use multiline exception directly 2017-08-29 16:05:12 +08:00
agapple 67436b2bc4 fixed issue #330 & #350 , json length & escapse 2017-08-03 21:15:09 +08:00
agapple ca350a79bd Merge pull request #343 from toruneko/bugfix-when-filterqueryddl
Bugfix when filterqueryddl
2017-08-02 00:20:25 +08:00
jianhao.dai 214e404e1b 挪到最前面 2017-07-20 11:37:24 +08:00
jianhao.dai 34bcfbc3cb 不管有没有filter,都应该对meta cache更新一下 2017-07-20 11:35:19 +08:00
HaiDai 402245dbbf Merge pull request #2 from alibaba/master
merge master
2017-07-20 11:29:50 +08:00
agapple 2cebfa04dd fixed test 2017-07-05 12:48:52 +08:00
agapple 62e8ff6ec8 fixed format 2017-07-05 12:46:32 +08:00
agapple b265bf4669 Merge pull request #319 from day6/fixbug-clientTimeout
fixbug: soTimeout doesn't work.
2017-07-05 12:44:50 +08:00
agapple 989a69e7be fixed format & import 2017-07-05 12:41:11 +08:00
agapple 780b4f715b Merge pull request #333 from jasonhx140/master
fix bug:异常网络连接导致canal server 无法关闭
2017-07-05 12:38:33 +08:00
agapple 8e88dc87f7 fixed https://github.com/alibaba/canal/pull/334 2017-07-05 12:35:42 +08:00
agapple 867d6607d4 Merge pull request #334 from luoyaogui/master
针对使用netty取代JDK的socketchannel实现的优化
2017-07-04 21:50:07 +08:00
agapple 22e3d2f3f1 Merge branch 'master' into master 2017-07-04 21:49:22 +08:00
agapple ecdd619da7 Merge pull request #331 from alexandnpu/feature/upgrade_zkclient
update zkclient to 0.10
2017-07-04 21:38:30 +08:00
luoyaogui 9ba93bae5f Update DirectLogFetcher.java 2017-06-27 15:08:34 +08:00
luoyaogui 0b2f37a272 Update MysqlConnection.java 2017-06-27 15:07:52 +08:00
luoyaogui 0bd4a1146c Update DirectLogFetcherTest.java 2017-06-27 15:07:07 +08:00
luoyaogui 3dba400624 Update MysqlUpdateExecutor.java 2017-06-27 15:05:33 +08:00
luoyaogui 523130cf8b Update MysqlQueryExecutor.java 2017-06-27 15:05:00 +08:00
luoyaogui 525a00ea17 Update MysqlConnector.java 2017-06-27 15:04:39 +08:00
luoyaogui b6090da0e5 Update PacketManager.java 2017-06-27 15:03:53 +08:00
luoyaogui 9ea88c7863 Update SocketChannelPool.java 2017-06-27 15:03:16 +08:00
luoyaogui 48c108806a Update SocketChannel.java 2017-06-27 15:02:45 +08:00
Jason Huang 8600e9825b fix bug:
现实运用中出现:client已经不存在但server端的连接仍然是存活状态。
在此种网络异常状态时,stop canal server会一直hang住。
原因:异常网络连接由于无数据传输,导致 io worker线程一直loop selector而无法退出。

解决方案:1. 设置keepalive 由os 监控。
        2. 设置netty idle 机制,定时检测并主动close socket。(fix 时间单位bug)
        3. 每次新创建socket channel时存储在一个容器内,在stop canal
server时,从容器内主动释放所有socket channel。
2017-06-26 19:24:15 +08:00
alex.zheng 29815c41b0 make zookeeperx work 2017-06-23 20:16:25 +08:00
alex.zheng 717e2cb7f3 update zkclient to 0.10 2017-06-23 14:48:28 +08:00
agapple 3e5b3e1467 fixed issue #321 , process TableIdNotFoundException 2017-06-22 13:37:11 +08:00
baiju a46ac3b814 fixbug: soTimeout doesn't work. 2017-06-10 10:07:23 +08:00
agapple f6c2eb8963 fixed issue #296 , NPE 2017-05-11 14:05:58 +08:00
agapple 07b979f242 Merge pull request #293 from MarkLinHz/master
fix bug of repeat log manager
2017-04-08 17:02:53 +08:00
yinxiu 6b20959a2d fix bug of repeat log manager 2017-04-06 20:13:59 +08:00
agapple fdd40224d5 fixed format & import 2017-04-01 22:20:00 +08:00
agapple a6604978ed Merge pull request #291 from MarkLinHz/master
重构LogPositionManager并适配XML配置
2017-04-01 22:06:54 +08:00
agapple 4d624cf184 [maven-release-plugin] prepare for next development iteration 2017-04-01 21:18:31 +08:00
agapple 7e026f2495 [maven-release-plugin] prepare release canal-1.0.24 2017-04-01 21:18:11 +08:00
agapple 2e3796cb07 fixed format 2017-04-01 21:04:21 +08:00
agapple b2a5f482ee fixed issue #284 , add slave_uuid 2017-04-01 21:01:07 +08:00
yinxiu a78622ae02 rename log manager module and ajust xml 2017-03-28 20:33:14 +08:00
agapple e5444ae658 Merge pull request #259 from GitHub-BruceTong/dev
fix bug for #202(canal.instance.filter.regex 修改后未生效)
2017-03-28 09:49:18 +08:00
agapple 73627df082 fixed issue #287 , support chinese & empty string valuewq 2017-03-28 00:25:11 +08:00
yinxiu c0f2d274d7 refactoring log position manager module 2017-03-18 11:41:56 +08:00
agapple 2eb05b5934 fixed compiler error 2017-03-17 21:15:33 +08:00
agapple 83689ee519 fixed issue #274 , support mysql 5.7.17 2017-03-17 20:36:40 +08:00
agapple d78b389737 revert pull request https://github.com/alibaba/canal/pull/256 2017-03-17 20:00:13 +08:00
agapple 20d8ac67dc fixed issue #280 , refactor MysqlQueryExecutor use IOException 2017-03-17 19:40:12 +08:00
agapple 19a56fb77e Merge pull request #282 from sun7059/patch-1
Update JsonUtils.java
2017-03-17 19:11:25 +08:00
agapple c629e8c899 Merge pull request #283 from keyganker/master
upgrade fastjson for security
2017-03-17 19:10:58 +08:00
fengyong 75a5a4d7df 升级fastjson 2017-03-16 20:25:21 +08:00
孙鹏 045a2e5a50 Update JsonUtils.java
修复升级fastjson到1.2.28后JSONUtils报错的问题
2017-03-16 20:01:42 +08:00
agapple 11d0712291 Update README.md 2017-02-07 19:50:22 +08:00
GitHub-BruceTong 03ff9512dd fix bug for #202(canal.instance.filter.regex 修改后未生效) 2017-01-22 15:52:04 +08:00
agapple 0ee2e767d2 fixed stop failed 2017-01-19 13:22:40 +08:00
agapple ff97dcbbc9 format & import 2017-01-19 13:07:53 +08:00
agapple 92c1a51726 Merge pull request #256 from luoyaogui/master
使用netty重构socketChannel(jdk内置),修改了PacketManager实现,以及其他相关引用的类。
2017-01-19 12:47:23 +08:00
agapple 36216e63ea Merge branch 'master' into master 2017-01-19 12:46:41 +08:00
agapple db4fc68a55 fixed issue #257 , heartBeatTimerTask stop bugfix 2017-01-19 12:34:05 +08:00
agapple eef58005d9 fixed format 2017-01-12 11:31:43 +08:00
agapple 8141ddc4e8 Merge pull request #250 from toruneko/fix-ha-switch
[BUGFIX] 在MySQL5.6做主备库切换时出现的filename乱码修复
2017-01-12 11:30:39 +08:00
agapple 004f26465f Merge pull request #248 from z070204z/patch-1
修复mysql5.6以下报java.lang.NullPointerException
2017-01-12 11:29:52 +08:00
jianhao.dai 5dc62bbda8 seek method also need load checksum 2017-01-04 11:14:01 +08:00
z070204z f45f1ac74f Update MysqlConnection.java
修复mysql5.6以下报java.lang.NullPointerException
2017-01-03 18:03:42 +08:00
luoyaogui 5c11c71783 使用netty重构socketChannel(jdk内置),修改了PacketManager实现,以及其他相关引用的类。 2017-01-03 14:18:58 +08:00
agapple f745c698e9 [maven-release-plugin] prepare for next development iteration 2016-12-30 14:57:19 +08:00
agapple 5f4bbab722 [maven-release-plugin] prepare release canal-1.0.23 2016-12-30 14:57:07 +08:00
agapple a483f03711 fixed #227 , loadBinlogChecksum NPE 2016-12-30 14:51:22 +08:00
agapple a1207060bf format 2016-12-30 14:32:52 +08:00
agapple 5055fdb556 Merge pull request #245 from dangxia/master
issues#244
2016-12-30 14:30:00 +08:00
XuehuiHe a69b69c724 issues#244 2016-12-30 11:39:02 +08:00
agapple 90e6d34fb4 Merge pull request #243 from deeplinux/master
原来的example内的startup.bat脚本直接运行时报语法错误
2016-12-29 13:45:32 +08:00
deeplinux 907ecd43e4 修改批处理中的!=为NEQ 2016-12-28 08:06:18 +08:00
deeplinux c57a921a1a 修正批处理中的语法错误 2016-12-27 17:57:07 +08:00
agapple 83fee4ffbb Merge pull request #231 from alexwangx/alexwang
fixed issue #227 , fixed Mysql5.1.73 throw NullPointerException
2016-12-02 18:06:36 +08:00
alexwang bc7927fe75 fixed issue #227 , fixed Mysql5.1.73 throw NullPointerException 2016-12-01 17:39:51 +08:00
agapple e67f27018c fixed support json inteAddress 2016-11-28 14:11:12 +08:00
agapple 3f38ad6f49 fixed issue #227 , fixed binlog_checksum variables 2016-11-28 14:10:57 +08:00
agapple 96dca0b9e6 fixed issue #136 , support rds no primary key && mysql.ha_health_check 2016-11-17 17:52:52 +08:00
agapple ad2a96b3f1 fixed json type cast exception 2016-11-10 11:12:35 +08:00
agapple 6284a429a0 fixed lazy 2016-10-11 21:37:39 +08:00
agapple 83d8a39d16 add ServerRunningMonitor.init 2016-10-11 19:39:55 +08:00
agapple 4898829384 Merge pull request #213 from lulu2panpan/master
修复issue #212
2016-10-11 19:25:06 +08:00
agapple 69a7e6d083 Merge pull request #208 from jianan789/master
mysql5.6.29'@@global.binlog_checksum'带单引号导致master退出,优化binlogFormat判断
2016-10-11 19:16:34 +08:00
agapple a5d6c3b747 Merge pull request #210 from xujianhai/patch-1
不好的设计
2016-10-11 19:14:22 +08:00
agapple 86378cad32 Merge pull request #209 from lcybo/master
Fix a minor fault: Canal instance reload again after startup.
2016-10-11 19:11:30 +08:00
lubiao 8626c6ee24 1、SessionHandler类中执行SUBSCRIPTION时,应该先尝试启动runningMonitor再调用embeddedServer的subscribe方法
2、embeddedServer的subscribe方法中应该首先进行checkStart操作,否则可能引起metaManager的脏启动
3、SessionHandler中增加日志
2016-10-11 18:46:30 +08:00
lubiao 350f8637c3 1、BinLogFileQueue的listBinlogFiles方法中对binlog文件名进行更严格的验证,必须以数字结尾
2、LocalBinLogConnection类中解决如下bug
	2.1第二个dump方法中增加代码"decoder.handle(LogEvent.FORMAT_DESCRIPTION_EVENT);",解决"((QueryLogEvent)event).getQuery()"语句出现乱码的问题(BEGIN后面多了4个字节),出现乱码不会进入if语句,导致找到的binlog位点不准确
	2.2第一个dump方法中,被注释的decode代码才是正确的,和DirectLogFetcher不同,此处需要构造子循环进行遍历
	2.3第一个dump方法中,将每个binlog-file的首个event设置为RotateLogEvent,否则会导致所有event的binlogFileName都是默认的mysql-bin.000001。这么改完之后,和DirectLogFetcher的行为相契合,后者在每个binlogfile的首个event就是RotateLogEvent
3、LocalBinlogEventParser中增加元数据处理的相关代码,不加的话,所有的event都不带列名,基本上没法儿使用
2016-10-11 17:28:24 +08:00
李建安 96454d4387 修复开启checksum后rotateLogEvent数据包解析时binlog name乱码 2016-10-10 18:30:09 +08:00
徐建海 8a293e4b0c Update AbstractEventParser.java 2016-10-06 19:13:50 +08:00
徐建海 006dd63646 不好的设计 2016-10-06 15:48:05 +08:00
Chuanyi Li b17c11868c Fix a minor fault: Canal instance reload again after startup. 2016-10-02 13:43:17 +08:00
李建安 0c9eecd758 mysql5.6.29'@@global.binlog_checksum'带单引号导致master退出,优化binlogFormat判断 2016-09-29 17:21:59 +08:00
agapple 5d9d5b1e44 fixed testcase 2016-09-29 11:43:35 +08:00
agapple b23e814c48 Merge pull request #203 from kevinKaiF/master
fixed issue # 201
2016-09-29 10:31:29 +08:00
zikaifeng b349b400cf 修复issue # 201 2016-09-27 16:22:48 +08:00
agapple c86fba6092 Merge pull request #199 from MarkLinHz/master
upgrade protobuf version
2016-09-19 14:03:20 +08:00
yinxiu 9742fdc9d9 upgrade protobuf version 2016-09-19 12:24:06 +08:00
agapple c99b4b8cd1 fixed NPE #200 2016-09-07 12:37:21 +08:00
agapple aa8ea96572 fixed issue #195 2016-08-26 18:25:52 +08:00
agapple f6cf88a6bd support 5.7 2016-08-04 22:53:59 +08:00
agapple 14a5762fbb support 5.7 2016-08-04 22:53:22 +08:00
agapple eda24df3fe fixed kill CONNECTION exception 2016-07-26 10:59:09 +08:00
agapple 3a5a4b06a9 [maven-release-plugin] prepare for next development iteration 2016-06-30 16:59:17 +08:00
agapple ba173fcd48 [maven-release-plugin] prepare release canal-1.0.22 2016-06-30 16:59:05 +08:00
agapple 69170f58df fixed issue #172, support rds 2016-06-30 16:45:42 +08:00
agapple c3e38e50e2 fixed issue #187 ,support MySQL 5.7 Json 2016-06-30 16:23:05 +08:00
agapple ae05a3f39f fixed issue #172, 精确识别主备切换,尝试基于时间戳重新定位位点,确保不丢数据 2016-06-28 22:58:55 +08:00
agapple 6eafc73a65 Merge pull request #177 from chenyishun/master
RDS主从库切换时候异常处理
2016-05-10 18:06:11 +08:00
Yishun.Chen 63b3c4ab54 IOException限制retry次数,超过次数后跳过binlog解析 2016-05-03 16:30:38 +08:00
Yishun.Chen ecba855bf9 IOException限制retry次数,超过次数后跳过binlog解析 2016-05-03 16:30:01 +08:00
Yishun.Chen b599846470 IOException限制retry次数,超过次数后跳过binlog解析 2016-05-03 16:29:23 +08:00
agapple 8aefd7e79b fixed issue #171, getNextAddress 2016-04-29 17:44:06 +08:00
agapple 4e76a4bd6e fixed issue #176 , handle running deleted 2016-04-29 17:43:16 +08:00
agapple f1a1cb26cc fixed issue #171, compiler error 2016-04-29 11:29:16 +08:00
agapple 4f1e3bafe7 fixed issue #171 , client HA bug , modify SimpleCanalConnector 2016-04-29 11:26:37 +08:00
agapple 6a03ffaf7b Merge pull request #173 from lulu2panpan/master
Canal客户端高可用bug修复
2016-04-29 11:16:24 +08:00
lulu2panpan d7d969915e Update ClientRunningMonitor.java 2016-04-29 09:50:37 +08:00
lulu2panpan 4898ed7b83 Update SimpleCanalConnector.java 2016-04-29 09:40:27 +08:00
lulu2panpan 11e1d1d600 Update CanalConnectors.java 2016-04-29 09:31:40 +08:00
lulu2panpan e614c6141d Update ClusterCanalConnector.java 2016-04-29 09:28:48 +08:00
lulu2panpan 8ded94a09e Update ClusterCanalConnector.java 2016-04-29 09:28:12 +08:00
agapple 38cc81b7da fixed issue #162 , fixed IDE CanalLauncher 2016-04-07 11:25:59 +08:00
agapple 533c5cb8f6 fixed issue #119 , fixed batch data changeColumns 2016-04-05 23:42:08 +08:00
agapple 5932e1e31f edit url 2016-03-05 18:46:21 +08:00
agapple 70dda221f1 add yugong 2016-03-05 18:44:57 +08:00
agapple c32a5d0882 fixed issue #139 , KILL CONNECTION binlogdump thread 2016-03-01 22:19:02 +08:00
agapple fbd99acac2 Merge pull request #145 from OpenZYK/master
添加rowdata过滤
2016-02-25 18:14:20 +08:00
zhangyukun 51cfa7fa96 Update AbstractMysqlEventParser.java 2016-02-25 13:56:07 +08:00
zhangyukun 652101035e 添加Rows过滤 2016-02-25 11:44:22 +08:00
zhangyukun 1813c1eff9 Update canal.properties 2016-02-25 11:39:10 +08:00
zhangyukun 31ea9fa8f0 新增canal.instance.filter.rows过滤 2016-02-25 11:38:09 +08:00
zhangyukun 369acd8eed 新增canal.instance.filter.rows过滤 2016-02-25 11:37:45 +08:00
zhangyukun 891eb960ca 新增canal.instance.filter.rows过滤 2016-02-25 11:37:17 +08:00
zhangyukun 2e5a165b88 新增canal.instance.filter.rows过滤
为parseRowsEvent方法添加过滤
2016-02-25 11:35:46 +08:00
zhangyukun 6b9c1305ff 添加dml过滤判断
修复parseRowsEvent方法中没有dml过滤的判断而导致dml操作的数据总是会输出到store中的bug
2016-02-24 21:18:01 +08:00
agapple 4f504aab31 fixed testcase compiler error 2016-02-24 17:05:14 +08:00
agapple dc28c68bf0 fixed format 2016-02-23 17:05:12 +08:00
agapple 38f2f98da3 Merge pull request #144 from dingjun84/master
注销父类已经有的属性,避免super.start()调用了没有在子类初始化的同名属性
2016-02-23 17:03:20 +08:00
dingjun efebbe301a 注销父类已经有的属性,避免super.start()调用了没有在子类初始化的同名属性 2016-02-23 10:40:42 +08:00
agapple bf10b16138 migrate 2016-02-04 11:22:36 +08:00
agapple 37478f3409 Merge pull request #138 from MarkLinHz/master
make canal server become a single instance
2016-02-04 11:02:23 +08:00
yinxiu d2f98cda87 remove duplicate code 2016-01-14 10:59:40 +08:00
yinxiu ed74d934d3 add setAlarmHandler for otter 2016-01-11 16:15:41 +08:00
yinxiu 7b29828f60 add AbstractCanalInstance and remove duplicate code 2016-01-08 20:32:08 +08:00
yinxiu 9164fe4ca7 make canal server become a single instance 2016-01-07 17:23:58 +08:00
agapple 51ac311aa1 fixed git ignore 2015-12-31 14:31:55 +08:00
agapple 643bd5cb71 [maven-release-plugin] prepare for next development iteration 2015-12-30 16:23:30 +08:00
agapple 8375ea4b7d [maven-release-plugin] prepare release canal-1.0.21 2015-12-30 16:23:20 +08:00
agapple 72ceb58fa3 fixed issue #135 , isUpdate bugfix 2015-12-02 14:37:06 +08:00
agapple 44f2b74862 fixed issue #130 , support mysql5.6 time2/timestamp2/datetime2 javaType 2015-11-13 14:16:12 +08:00
agapple 5a34195201 Merge pull request #128 from likeloveluck/simple_ddl_pattern
fix rename table ddl parser tablename and schemaname error
2015-09-07 15:49:12 +08:00
jiawei d976932177 fix rename table ddl parser tablename and schemaname error 2015-09-01 12:17:41 +08:00
agapple d887c8f763 Merge pull request #127 from dozer47528/master
fix not skip filter and read the error data
2015-08-04 11:24:14 +08:00
Dozer 197a1446b7 fix not skip filter and read the error data 2015-07-31 17:18:42 +08:00
agapple 155c00b256 Merge pull request #124 from smilingleo/master
fixed a hard coded mysql host ip address
2015-07-28 13:51:44 +08:00
Leo b16f4844a1 fixed a hard coded mysql host ip address 2015-07-23 10:42:03 +08:00
agapple f2f2bfb538 add rename testcase 2015-07-17 14:43:15 +08:00
agapple 5f6580399c fixed format 2015-07-17 14:41:39 +08:00
agapple 10930b9e3d Merge pull request #122 from likeloveluck/rename_bug_fix
修复rename table命令中包含多个表,解析失败问题
2015-07-17 14:33:38 +08:00
jiawei d1afeb7540 change result reference 2015-07-16 19:25:46 +08:00
jiawei 119af9fca1 change rename operate 2015-07-15 19:20:30 +08:00
agapple f0ce4b569e Merge pull request #121 from huyanping/patch-1
Update README.md
2015-07-14 16:59:24 +08:00
Jenner 4459b8acdf Update README.md 2015-07-14 14:42:13 +08:00
agapple bb5d5749bd Merge pull request #120 from smilingleo/master
增加了一个脚本来自动获取mysql master binlog信息,并自动更新instance配置文件
2015-07-05 11:10:56 +08:00
smilingleo 169baafb8b correct format 2015-07-03 10:32:40 +08:00
smilingleo 199f30de87 add a script to fetch mysql master binlog file and sync position automatically 2015-07-03 10:29:58 +08:00
smilingleo 87c14f0b51 Revert "test"
This reverts commit f35d965f63.
2015-07-03 10:08:03 +08:00
smilingleo f35d965f63 test 2015-07-03 10:02:10 +08:00
agapple 9956b3557f [maven-release-plugin] prepare for next development iteration 2015-06-30 10:23:54 +08:00
agapple 452fae15fc [maven-release-plugin] prepare release canal-1.0.20 2015-06-30 10:23:45 +08:00
agapple 3d6174f857 fixed issue #119 , support binlog row image noblob/minimal 2015-06-29 23:52:37 +08:00
agapple 21abbbfe47 fixed issue #116 , process create index bug 2015-05-05 10:52:56 +08:00
agapple 89056490c3 upgrade fastjson version 2015-04-30 11:25:24 +08:00
agapple c935f06344 remove compiler warning 2015-04-30 11:20:25 +08:00
agapple eeaf5ce910 fixed issue #116 , process empty array 2015-04-30 11:06:10 +08:00
agapple c3f2ad08cd fixed warning 2015-04-28 21:33:28 +08:00
agapple 7ebb3fd1ab fixed code template and format 2015-04-28 21:11:41 +08:00
agapple ea889cb004 Merge pull request #115 from wenerme/master
Typo,javadoc 修正, 更新 guava 到18.0
2015-04-28 20:26:41 +08:00
wener 596b060649 cleanup code, extract CanalService 2015-04-27 14:57:01 +08:00
wener fc9b616f4a 添加遗漏的 MigrateMap 2015-04-24 09:36:47 +08:00
wener 6a0733bbab update guava to 18.0, magriate compute map by package level implement 2015-04-23 22:15:57 +08:00
wener bdf3b0c861 typo, javadoc,code cleanup 2015-04-23 17:25:36 +08:00
wener d01e82ce3c fix typo embeded -> embedded 2015-04-23 16:23:34 +08:00
agapple ae521195c5 Merge pull request #113 from WalterInSH/master
add missing api parameter doc
2015-04-10 12:39:38 +08:00
Walter 5529dad14b add missing api parameter doc 2015-04-09 17:35:28 +08:00
agapple b0143520eb fixed issue #112 , add mysql 5.6 useconds parse 2015-03-30 18:04:26 +08:00
agapple 5b56a027e5 Merge pull request #110 from frew/master
FileLogFetcher's fetch() method should fix up position and origin even i...
2015-01-30 20:54:22 +08:00
agapple 50d4b18556 Update README.md 2015-01-30 14:27:06 +08:00
Fred Wulff f9edeca6d2 FileLogFetcher's fetch() method should fix up position and origin even if we weren't successful at fetching anything from the file 2015-01-29 11:51:34 -08:00
agapple 5ade057113 fixed issue #106 , logger exception 2014-12-26 20:23:59 +08:00
agapple befc31146a fixed parse instance 2014-12-26 11:29:00 +08:00
agapple ac4970ef3a fixed issue #105 , seek method add format eventType parse 2014-12-17 22:08:36 +08:00
agapple 13bf7c85a0 fixed search by time 2014-12-17 20:57:12 +08:00
agapple a2ae8cda50 remove setEventFilter 2014-12-10 13:48:50 +08:00
agapple 42b164f860 Merge pull request #104 from mczcl/master
修复了重复订阅没有真正修改过滤器的问题
2014-12-10 13:37:48 +08:00
zelin.miao aac4d95b19 修复了重复订阅没有真正修改过滤器的问题 2014-12-05 23:56:42 +08:00
agapple 0e283bb52d Merge pull request #102 from diguage/master
修正插件的声明
2014-10-21 11:05:52 +08:00
D瓜哥 9ad328c5ad 增加插件maven-jar-plugin的版本声明 2014-10-14 16:22:39 +08:00
D瓜哥 5d1e952c6d 给插件maven-source-plugin\maven-compiler-plugin增加版本声明,删除重复的插件声明 2014-10-14 16:22:09 +08:00
agapple 4ba814da26 [maven-release-plugin] prepare for next development iteration 2014-09-23 16:10:57 +08:00
agapple a743235eae [maven-release-plugin] prepare release canal-1.0.19 2014-09-23 16:10:43 +08:00
agapple a0defe575b init 2014-09-23 15:11:35 +08:00
461 changed files with 65668 additions and 12989 deletions
+16
View File
@@ -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
View File
@@ -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.
+89
View File
@@ -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年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&amp;消费的业务,从此开启了一段新纪元。</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;">基于日志增量订阅&amp;消费支持的业务:</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;"> 定位: 基于数据库增量日志解析,提供增量数据订阅&amp;消费,目前主要支持了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>
+3
View File
@@ -0,0 +1,3 @@
release link : https://alibaba.github.com/canal/release.html
download link : https://github.com/alibaba/canal/releases
-28
View File
@@ -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>
-28
View File
@@ -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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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">&nbsp;</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&nbsp;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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;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>&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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&nbsp;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&nbsp;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&nbsp;get(int&nbsp;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&nbsp;get(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;getWithoutAck(int&nbsp;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&nbsp;getWithoutAck(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;ack(long&nbsp;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&nbsp;rollback(long&nbsp;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&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;</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">&nbsp;</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>&lt;? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&gt;&nbsp;addresses,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>&nbsp;zkServers,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>从类继承的方法&nbsp;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&nbsp;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&nbsp;<a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>&nbsp;newSingleConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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&nbsp;<a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>&nbsp;newClusterConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a>&lt;? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&gt;&nbsp;addresses,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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&nbsp;<a href="../../../../../com/alibaba/otter/canal/client/CanalConnector.html" title="com.alibaba.otter.canal.client中的接口">CanalConnector</a>&nbsp;newClusterConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;zkServers,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;</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>&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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 &#169; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&lt;? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&gt;&nbsp;addresses,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>&nbsp;zkServers,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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">&nbsp;</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&nbsp;</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&nbsp;</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 &#169; 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 &#169; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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&nbsp;</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&nbsp;</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">&nbsp;</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>&nbsp;</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">&nbsp;</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>&nbsp;accessStrategy)</code>&nbsp;</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">&nbsp;</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>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>&nbsp;accessStrategy)</code>&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>&nbsp;accessStrategy)</code>&nbsp;</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">&nbsp;</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&nbsp;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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;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>&nbsp;accessStrategy)</code>&nbsp;</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>&nbsp;password)</code>&nbsp;</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&nbsp;retryInterval)</code>&nbsp;</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&nbsp;retryTimes)</code>&nbsp;</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&nbsp;soTimeout)</code>&nbsp;</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>&nbsp;username)</code>&nbsp;</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>&nbsp;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>从类继承的方法&nbsp;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&nbsp;ClusterCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>&nbsp;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&nbsp;void&nbsp;connect()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;boolean&nbsp;checkValid()</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;disconnect()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;subscribe()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;filter)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;unsubscribe()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;get(int&nbsp;batchSize)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;get(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;unit)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;getWithoutAck(int&nbsp;batchSize)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;getWithoutAck(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;unit)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;rollback(long&nbsp;batchId)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;rollback()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;ack(long&nbsp;batchId)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;getUsername()</pre>
</li>
</ul>
<a name="setUsername(java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setUsername</h4>
<pre>public&nbsp;void&nbsp;setUsername(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username)</pre>
</li>
</ul>
<a name="getPassword()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPassword</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;getPassword()</pre>
</li>
</ul>
<a name="setPassword(java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setPassword</h4>
<pre>public&nbsp;void&nbsp;setPassword(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password)</pre>
</li>
</ul>
<a name="getSoTimeout()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSoTimeout</h4>
<pre>public&nbsp;int&nbsp;getSoTimeout()</pre>
</li>
</ul>
<a name="setSoTimeout(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSoTimeout</h4>
<pre>public&nbsp;void&nbsp;setSoTimeout(int&nbsp;soTimeout)</pre>
</li>
</ul>
<a name="getRetryTimes()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getRetryTimes</h4>
<pre>public&nbsp;int&nbsp;getRetryTimes()</pre>
</li>
</ul>
<a name="setRetryTimes(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setRetryTimes</h4>
<pre>public&nbsp;void&nbsp;setRetryTimes(int&nbsp;retryTimes)</pre>
</li>
</ul>
<a name="getRetryInterval()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getRetryInterval</h4>
<pre>public&nbsp;int&nbsp;getRetryInterval()</pre>
</li>
</ul>
<a name="setRetryInterval(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setRetryInterval</h4>
<pre>public&nbsp;void&nbsp;setRetryInterval(int&nbsp;retryInterval)</pre>
</li>
</ul>
<a name="getAccessStrategy()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getAccessStrategy</h4>
<pre>public&nbsp;<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>&nbsp;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&nbsp;void&nbsp;setAccessStrategy(<a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html" title="com.alibaba.otter.canal.client中的接口">CanalNodeAccessStrategy</a>&nbsp;accessStrategy)</pre>
</li>
</ul>
<a name="getCurrentConnector()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getCurrentConnector</h4>
<pre>public&nbsp;<a href="../../../../../../com/alibaba/otter/canal/client/impl/SimpleCanalConnector.html" title="com.alibaba.otter.canal.client.impl中的类">SimpleCanalConnector</a>&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;destination,
com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;zkClient)</code>&nbsp;</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">&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;zkClient)</code>&nbsp;</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
<!-- -->
</a>
<h3>从类继承的方法&nbsp;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&nbsp;ClusterNodeAccessStrategy(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;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&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;nextNode()</pre>
<dl>
<dt><strong>指定者:</strong></dt>
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode</a></code>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;zkClient)</pre>
</li>
</ul>
<a name="getZkClient()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getZkClient</h4>
<pre>public&nbsp;com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination)</code>&nbsp;</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>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
int&nbsp;soTimeout)</code>&nbsp;</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">&nbsp;</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&nbsp;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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;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&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;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&nbsp;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&nbsp;rollbackOnConnect)</code>&nbsp;</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&nbsp;rollbackOnDisConnect)</code>&nbsp;</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&nbsp;soTimeout)</code>&nbsp;</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&nbsp;zkClientx)</code>&nbsp;</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>&nbsp;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>从类继承的方法&nbsp;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&nbsp;SimpleCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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&nbsp;SimpleCanalConnector(<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;address,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;username,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;password,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;destination,
int&nbsp;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&nbsp;void&nbsp;connect()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;disconnect()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;subscribe()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;subscribe(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;filter)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;unsubscribe()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;get(int&nbsp;batchSize)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;get(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;unit)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;getWithoutAck(int&nbsp;batchSize)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;com.alibaba.otter.canal.protocol.Message&nbsp;getWithoutAck(int&nbsp;batchSize,
<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html?is-external=true" title="java.lang中的类或接口">Long</a>&nbsp;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>&nbsp;unit)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;ack(long&nbsp;batchId)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;rollback(long&nbsp;batchId)
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;void&nbsp;rollback()
throws com.alibaba.otter.canal.protocol.exception.CanalClientException</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;boolean&nbsp;checkValid()</pre>
<div class="block"><strong>从接口复制的说明:&nbsp;<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>&nbsp;在接口中&nbsp;<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&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;getAddress()</pre>
</li>
</ul>
<a name="getUsername()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getUsername</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;getUsername()</pre>
</li>
</ul>
<a name="getPassword()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getPassword</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;getPassword()</pre>
</li>
</ul>
<a name="getSoTimeout()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getSoTimeout</h4>
<pre>public&nbsp;int&nbsp;getSoTimeout()</pre>
</li>
</ul>
<a name="setSoTimeout(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setSoTimeout</h4>
<pre>public&nbsp;void&nbsp;setSoTimeout(int&nbsp;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&nbsp;void&nbsp;setZkClientx(com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;zkClientx)</pre>
</li>
</ul>
<a name="setRollbackOnConnect(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setRollbackOnConnect</h4>
<pre>public&nbsp;void&nbsp;setRollbackOnConnect(boolean&nbsp;rollbackOnConnect)</pre>
</li>
</ul>
<a name="setRollbackOnDisConnect(boolean)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>setRollbackOnDisConnect</h4>
<pre>public&nbsp;void&nbsp;setRollbackOnDisConnect(boolean&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&lt;? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&gt;&nbsp;nodes)</code>&nbsp;</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">&nbsp;</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>&nbsp;</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
<!-- -->
</a>
<h3>从类继承的方法&nbsp;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&nbsp;SimpleNodeAccessStrategy(<a href="http://docs.oracle.com/javase/6/docs/api/java/util/List.html?is-external=true" title="java.util中的类或接口">List</a>&lt;? extends <a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&gt;&nbsp;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&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/net/SocketAddress.html?is-external=true" title="java.net中的类或接口">SocketAddress</a>&nbsp;nextNode()</pre>
<dl>
<dt><strong>指定者:</strong></dt>
<dd><code><a href="../../../../../../com/alibaba/otter/canal/client/CanalNodeAccessStrategy.html#nextNode()">nextNode</a></code>&nbsp;在接口中&nbsp;<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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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.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 &#169; 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.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 &#169; 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.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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&nbsp;</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 &#169; 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.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 &#169; 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">程序包&nbsp;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">&nbsp;</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 &#169; 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 &#169; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;</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">&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&nbsp;active)</code>&nbsp;</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>&nbsp;address)</code>&nbsp;</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&nbsp;clientId)</code>&nbsp;</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
<!-- -->
</a>
<h3>从类继承的方法&nbsp;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&nbsp;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&nbsp;short&nbsp;getClientId()</pre>
</li>
</ul>
<a name="setClientId(short)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setClientId</h4>
<pre>public&nbsp;void&nbsp;setClientId(short&nbsp;clientId)</pre>
</li>
</ul>
<a name="getAddress()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getAddress</h4>
<pre>public&nbsp;<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;getAddress()</pre>
</li>
</ul>
<a name="setAddress(java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setAddress</h4>
<pre>public&nbsp;void&nbsp;setAddress(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;address)</pre>
</li>
</ul>
<a name="isActive()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isActive</h4>
<pre>public&nbsp;boolean&nbsp;isActive()</pre>
</li>
</ul>
<a name="setActive(boolean)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>setActive</h4>
<pre>public&nbsp;void&nbsp;setActive(boolean&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
@@ -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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;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&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li>构造器&nbsp;|&nbsp;</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 &#169; 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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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">&nbsp;</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>&nbsp;</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">&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;clientData)</code>&nbsp;</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&nbsp;delayTime)</code>&nbsp;</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>&nbsp;destination)</code>&nbsp;</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>&nbsp;listener)</code>&nbsp;</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&nbsp;zkClient)</code>&nbsp;</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>&nbsp;</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>&nbsp;</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>从类继承的方法&nbsp;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>从类继承的方法&nbsp;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&nbsp;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&nbsp;void&nbsp;start()</pre>
<dl>
<dt><strong>指定者:</strong></dt>
<dd><code>start</code>&nbsp;在接口中&nbsp;<code>com.alibaba.otter.canal.common.CanalLifeCycle</code></dd>
<dt><strong>覆盖:</strong></dt>
<dd><code>start</code>&nbsp;在类中&nbsp;<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&nbsp;void&nbsp;stop()</pre>
<dl>
<dt><strong>指定者:</strong></dt>
<dd><code>stop</code>&nbsp;在接口中&nbsp;<code>com.alibaba.otter.canal.common.CanalLifeCycle</code></dd>
<dt><strong>覆盖:</strong></dt>
<dd><code>stop</code>&nbsp;在类中&nbsp;<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&nbsp;void&nbsp;initRunning()</pre>
</li>
</ul>
<a name="waitForActive()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>waitForActive</h4>
<pre>public&nbsp;void&nbsp;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&nbsp;boolean&nbsp;check()</pre>
<div class="block">检查当前的状态</div>
</li>
</ul>
<a name="releaseRunning()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>releaseRunning</h4>
<pre>public&nbsp;boolean&nbsp;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&nbsp;void&nbsp;setListener(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningListener.html" title="com.alibaba.otter.canal.client.impl.running中的接口">ClientRunningListener</a>&nbsp;listener)</pre>
</li>
</ul>
<a name="setDestination(java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setDestination</h4>
<pre>public&nbsp;void&nbsp;setDestination(<a href="http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true" title="java.lang中的类或接口">String</a>&nbsp;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&nbsp;void&nbsp;setClientData(<a href="../../../../../../../com/alibaba/otter/canal/client/impl/running/ClientRunningData.html" title="com.alibaba.otter.canal.client.impl.running中的类">ClientRunningData</a>&nbsp;clientData)</pre>
</li>
</ul>
<a name="setDelayTime(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setDelayTime</h4>
<pre>public&nbsp;void&nbsp;setDelayTime(int&nbsp;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&nbsp;void&nbsp;setZkClient(com.alibaba.otter.canal.common.zookeeper.ZkClientx&nbsp;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>概要:&nbsp;</li>
<li>嵌套&nbsp;|&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_summary">构造器</a>&nbsp;|&nbsp;</li>
<li><a href="#method_summary">方法</a></li>
</ul>
<ul class="subNavList">
<li>详细资料:&nbsp;</li>
<li>字段&nbsp;|&nbsp;</li>
<li><a href="#constructor_detail">构造器</a>&nbsp;|&nbsp;</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 &#169; 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.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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&nbsp;clientData)</code>&nbsp;</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 &#169; 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.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">&nbsp;</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">&nbsp;</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">&nbsp;</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>&nbsp;listener)</code>&nbsp;</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 &#169; 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.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 &#169; 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">程序包&nbsp;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">&nbsp;</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">&nbsp;</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 &#169; 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 &#169; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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 &#169; 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">程序包&nbsp;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">&nbsp;</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">&nbsp;</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 &#169; 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 &#169; 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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-117
View File
@@ -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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-117
View File
@@ -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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-469
View File
@@ -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>&nbsp;<a href="#_C_">C</a>&nbsp;<a href="#_D_">D</a>&nbsp;<a href="#_G_">G</a>&nbsp;<a href="#_I_">I</a>&nbsp;<a href="#_N_">N</a>&nbsp;<a href="#_P_">P</a>&nbsp;<a href="#_R_">R</a>&nbsp;<a href="#_S_">S</a>&nbsp;<a href="#_U_">U</a>&nbsp;<a href="#_W_">W</a>&nbsp;<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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&lt;? extends SocketAddress&gt;, 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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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&lt;? extends SocketAddress&gt;)</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;<a href="#_C_">C</a>&nbsp;<a href="#_D_">D</a>&nbsp;<a href="#_G_">G</a>&nbsp;<a href="#_I_">I</a>&nbsp;<a href="#_N_">N</a>&nbsp;<a href="#_P_">P</a>&nbsp;<a href="#_R_">R</a>&nbsp;<a href="#_S_">S</a>&nbsp;<a href="#_U_">U</a>&nbsp;<a href="#_W_">W</a>&nbsp;</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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-68
View File
@@ -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>
-24
View File
@@ -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>&nbsp;</p>
</body>
</html>
-139
View File
@@ -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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-148
View File
@@ -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 &#169; 2013. All rights reserved.</small></p>
</body>
</html>
-3
View File
@@ -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

-474
View File
@@ -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
View File
@@ -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;
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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;
}
}
@@ -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();
}
@@ -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;
}
}
+14
View File
@@ -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
View File
@@ -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>
+27
View File
@@ -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
View File
@@ -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);
}
}
}
@@ -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');
}
}
@@ -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);
}
}
@@ -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();
}
@@ -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;
}
}
@@ -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;
}
}
+14
View File
@@ -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>
+43
View File
@@ -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