diff --git a/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java b/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java index b8f84395..fb0db67f 100644 --- a/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java +++ b/client/src/main/java/com/alibaba/otter/canal/client/CanalConnector.java @@ -19,14 +19,14 @@ public interface CanalConnector { * * @throws CanalClientException */ - public void connect() throws CanalClientException; + void connect() throws CanalClientException; /** * 释放链接 * * @throws CanalClientException */ - public void disconnect() throws CanalClientException; + void disconnect() throws CanalClientException; /** * 检查下链接是否合法 @@ -43,7 +43,7 @@ public interface CanalConnector { * * @throws CanalClientException */ - public boolean checkValid() throws CanalClientException; + boolean checkValid() throws CanalClientException; /** * 客户端订阅,重复订阅时会更新对应的filter信息 @@ -56,7 +56,6 @@ public interface CanalConnector { * TODO: 后续可以考虑,如果本次提交的filter不为空,在执行过滤时,是对canal server filter + 本次filter的交集处理,达到只取1份binlog数据,多个客户端消费不同的表 * * - * @param clientIdentity * @throws CanalClientException */ void subscribe(String filter) throws CanalClientException; @@ -64,7 +63,6 @@ public interface CanalConnector { /** * 客户端订阅,不提交客户端filter,以服务端的filter为准 * - * @param clientIdentity * @throws CanalClientException */ void subscribe() throws CanalClientException; @@ -72,7 +70,6 @@ public interface CanalConnector { /** * 取消订阅 * - * @param clientIdentity * @throws CanalClientException */ void unsubscribe() throws CanalClientException; @@ -140,14 +137,14 @@ public interface CanalConnector { void ack(long batchId) throws CanalClientException; /** - * 回滚到未进行 {@link ack} 的地方,指定回滚具体的batchId + * 回滚到未进行 {@link #ack} 的地方,指定回滚具体的batchId * * @throws CanalClientException */ void rollback(long batchId) throws CanalClientException; /** - * 回滚到未进行 {@link ack} 的地方,下次fetch的时候,可以从最后一个没有 {@link ack} 的地方开始拿 + * 回滚到未进行 {@link #ack} 的地方,下次fetch的时候,可以从最后一个没有 {@link #ack} 的地方开始拿 * * @throws CanalClientException */ diff --git a/common/pom.xml b/common/pom.xml index 620ed474..b51d6961 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -6,7 +6,6 @@ 1.0.20-SNAPSHOT ../pom.xml - com.alibaba.otter canal.common jar canal common module for otter ${project.version} diff --git a/instance/core/pom.xml b/instance/core/pom.xml index b4bb5428..2c53ef79 100644 --- a/instance/core/pom.xml +++ b/instance/core/pom.xml @@ -6,7 +6,6 @@ 1.0.20-SNAPSHOT ../../pom.xml - com.alibaba.otter canal.instance.core jar canal instance core module for otter ${project.version} diff --git a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java index 0d9c0d32..e5b84d1e 100644 --- a/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java +++ b/instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/CanalInstanceWithManager.java @@ -89,8 +89,7 @@ public class CanalInstanceWithManager extends CanalInstanceSupport implements Ca this.destination = canal.getName(); this.filter = filter; - logger.info("init CannalInstance for {}-{} with parameters:{}", - new Object[] { canalId, destination, parameters }); + logger.info("init CannalInstance for {}-{} with parameters:{}", canalId, destination, parameters); // 初始化报警机制 initAlarmHandler(); // 初始化metaManager @@ -116,8 +115,8 @@ public class CanalInstanceWithManager extends CanalInstanceSupport implements Ca public void start() { super.start(); // 初始化metaManager - logger.info("start CannalInstance for {}-{} with parameters:{}", new Object[] { canalId, destination, - parameters }); + logger.info("start CannalInstance for {}-{} with parameters:{}", canalId, destination, + parameters); if (!metaManager.isStart()) { metaManager.start(); @@ -336,7 +335,7 @@ public class CanalInstanceWithManager extends CanalInstanceSupport implements Ca } private CanalEventParser doInitEventParser(SourcingType type, List dbAddresses) { - CanalEventParser eventParser = null; + CanalEventParser eventParser; if (type.isMysql()) { MysqlEventParser mysqlEventParser = new MysqlEventParser(); mysqlEventParser.setDestination(destination); diff --git a/meta/src/main/java/com/alibaba/otter/canal/meta/CanalMetaManager.java b/meta/src/main/java/com/alibaba/otter/canal/meta/CanalMetaManager.java index 534e6d4a..17faf395 100644 --- a/meta/src/main/java/com/alibaba/otter/canal/meta/CanalMetaManager.java +++ b/meta/src/main/java/com/alibaba/otter/canal/meta/CanalMetaManager.java @@ -35,12 +35,12 @@ public interface CanalMetaManager extends CanalLifeCycle { void unsubscribe(ClientIdentity clientIdentity) throws CanalMetaManagerException; /** - * 获取cuosr游标 + * 获取 cursor 游标 */ Position getCursor(ClientIdentity clientIdentity) throws CanalMetaManagerException; /** - * 更新cuosr游标 + * 更新 cursor 游标 */ void updateCursor(ClientIdentity clientIdentity, Position position) throws CanalMetaManagerException; diff --git a/parse/pom.xml b/parse/pom.xml index 7ce7a62c..5aad44bd 100644 --- a/parse/pom.xml +++ b/parse/pom.xml @@ -6,7 +6,6 @@ 1.0.20-SNAPSHOT ../pom.xml - com.alibaba.otter canal.parse jar canal parse module for otter ${project.version} diff --git a/protocol/src/main/java/com/alibaba/otter/canal/protocol/ClientIdentity.java b/protocol/src/main/java/com/alibaba/otter/canal/protocol/ClientIdentity.java index 52e3fb05..1eccdef4 100644 --- a/protocol/src/main/java/com/alibaba/otter/canal/protocol/ClientIdentity.java +++ b/protocol/src/main/java/com/alibaba/otter/canal/protocol/ClientIdentity.java @@ -1,5 +1,6 @@ package com.alibaba.otter.canal.protocol; +import java.io.Serializable; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.ToStringBuilder; @@ -9,7 +10,8 @@ import com.alibaba.otter.canal.common.utils.CanalToStringStyle; * @author zebin.xuzb @ 2012-6-20 * @version 1.0.0 */ -public class ClientIdentity { +public class ClientIdentity implements Serializable +{ private String destination; private short clientId; diff --git a/server/pom.xml b/server/pom.xml index 27cbb50a..eb2abcc7 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -6,7 +6,6 @@ 1.0.20-SNAPSHOT ../pom.xml - com.alibaba.otter canal.server jar canal server module for otter ${project.version} diff --git a/server/src/main/java/com/alibaba/otter/canal/server/CanalService.java b/server/src/main/java/com/alibaba/otter/canal/server/CanalService.java new file mode 100644 index 00000000..48709ab8 --- /dev/null +++ b/server/src/main/java/com/alibaba/otter/canal/server/CanalService.java @@ -0,0 +1,29 @@ +package com.alibaba.otter.canal.server; + +import com.alibaba.otter.canal.protocol.ClientIdentity; +import com.alibaba.otter.canal.protocol.Message; +import com.alibaba.otter.canal.server.exception.CanalServerException; +import java.util.concurrent.TimeUnit; + +public interface CanalService +{ + void subscribe(ClientIdentity clientIdentity) throws CanalServerException; + + void unsubscribe(ClientIdentity clientIdentity) throws CanalServerException; + + Message get(ClientIdentity clientIdentity, int batchSize) throws CanalServerException; + + Message get(ClientIdentity clientIdentity, int batchSize, Long timeout, TimeUnit unit) + throws CanalServerException; + + Message getWithoutAck(ClientIdentity clientIdentity, int batchSize) throws CanalServerException; + + Message getWithoutAck(ClientIdentity clientIdentity, int batchSize, Long timeout, TimeUnit unit) + throws CanalServerException; + + void ack(ClientIdentity clientIdentity, long batchId) throws CanalServerException; + + void rollback(ClientIdentity clientIdentity) throws CanalServerException; + + void rollback(ClientIdentity clientIdentity, Long batchId) throws CanalServerException; +} diff --git a/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java b/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java index c23ff139..38ea14d8 100644 --- a/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java +++ b/server/src/main/java/com/alibaba/otter/canal/server/embedded/CanalServerWithEmbedded.java @@ -28,7 +28,6 @@ import com.alibaba.otter.canal.store.model.Event; import com.alibaba.otter.canal.store.model.Events; import com.google.common.base.Function; import com.google.common.collect.Lists; -import com.google.common.collect.MapMaker; import com.google.common.collect.Maps; /** @@ -38,7 +37,8 @@ import com.google.common.collect.Maps; * @author zebin.xuzb * @version 1.0.0 */ -public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements CanalServer { +public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements CanalServer, com.alibaba.otter.canal.server.CanalService +{ private static final Logger logger = LoggerFactory.getLogger(CanalServerWithEmbedded.class); private Map canalInstances; @@ -116,6 +116,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C /** * 客户端订阅,重复订阅时会更新对应的filter信息 */ + @Override public void subscribe(ClientIdentity clientIdentity) throws CanalServerException { CanalInstance canalInstance = canalInstances.get(clientIdentity.getDestination()); if (!canalInstance.getMetaManager().isStart()) { @@ -142,6 +143,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C /** * 取消订阅 */ + @Override public void unsubscribe(ClientIdentity clientIdentity) throws CanalServerException { CanalInstance canalInstance = canalInstances.get(clientIdentity.getDestination()); canalInstance.getMetaManager().unsubscribe(clientIdentity); // 执行一下meta订阅 @@ -164,6 +166,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C * 注意: meta获取和数据的获取需要保证顺序性,优先拿到meta的,一定也会是优先拿到数据,所以需要加同步. (不能出现先拿到meta,拿到第二批数据,这样就会导致数据顺序性出现问题) * */ + @Override public Message get(ClientIdentity clientIdentity, int batchSize) throws CanalServerException { return get(clientIdentity, batchSize, null, null); } @@ -181,6 +184,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C * 注意: meta获取和数据的获取需要保证顺序性,优先拿到meta的,一定也会是优先拿到数据,所以需要加同步. (不能出现先拿到meta,拿到第二批数据,这样就会导致数据顺序性出现问题) * */ + @Override public Message get(ClientIdentity clientIdentity, int batchSize, Long timeout, TimeUnit unit) throws CanalServerException { checkStart(clientIdentity.getDestination()); @@ -215,8 +219,8 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C }); logger.info("get successfully, clientId:{} batchSize:{} real size is {} and result is [batchId:{} , position:{}]", - new Object[] { clientIdentity.getClientId(), batchSize, entrys.size(), batchId, - events.getPositionRange() }); + clientIdentity.getClientId(), batchSize, entrys.size(), batchId, + events.getPositionRange()); // 直接提交ack ack(clientIdentity, batchId); return new Message(batchId, entrys); @@ -232,6 +236,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C * 注意: meta获取和数据的获取需要保证顺序性,优先拿到meta的,一定也会是优先拿到数据,所以需要加同步. (不能出现先拿到meta,拿到第二批数据,这样就会导致数据顺序性出现问题) * */ + @Override public Message getWithoutAck(ClientIdentity clientIdentity, int batchSize) throws CanalServerException { return getWithoutAck(clientIdentity, batchSize, null, null); } @@ -250,6 +255,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C * 注意: meta获取和数据的获取需要保证顺序性,优先拿到meta的,一定也会是优先拿到数据,所以需要加同步. (不能出现先拿到meta,拿到第二批数据,这样就会导致数据顺序性出现问题) * */ + @Override public Message getWithoutAck(ClientIdentity clientIdentity, int batchSize, Long timeout, TimeUnit unit) throws CanalServerException { checkStart(clientIdentity.getDestination()); @@ -287,8 +293,8 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C }); logger.info("getWithoutAck successfully, clientId:{} batchSize:{} real size is {} and result is [batchId:{} , position:{}]", - new Object[] { clientIdentity.getClientId(), batchSize, entrys.size(), batchId, - events.getPositionRange() }); + clientIdentity.getClientId(), batchSize, entrys.size(), batchId, + events.getPositionRange()); return new Message(batchId, entrys); } @@ -316,6 +322,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C * 注意:进行反馈时必须按照batchId的顺序进行ack(需有客户端保证) * */ + @Override public void ack(ClientIdentity clientIdentity, long batchId) throws CanalServerException { checkStart(clientIdentity.getDestination()); checkSubscribe(clientIdentity); @@ -350,7 +357,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C if (positionRanges.getAck() != null) { canalInstance.getMetaManager().updateCursor(clientIdentity, positionRanges.getAck()); logger.info("ack successfully, clientId:{} batchId:{} position:{}", - new Object[] { clientIdentity.getClientId(), batchId, positionRanges }); + clientIdentity.getClientId(), batchId, positionRanges); } // 可定时清理数据 @@ -361,6 +368,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C /** * 回滚到未进行 {@link #ack} 的地方,下次fetch的时候,可以从最后一个没有 {@link #ack} 的地方开始拿 */ + @Override public void rollback(ClientIdentity clientIdentity) throws CanalServerException { checkStart(clientIdentity.getDestination()); CanalInstance canalInstance = canalInstances.get(clientIdentity.getDestination()); @@ -382,6 +390,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C /** * 回滚到未进行 {@link #ack} 的地方,下次fetch的时候,可以从最后一个没有 {@link #ack} 的地方开始拿 */ + @Override public void rollback(ClientIdentity clientIdentity, Long batchId) throws CanalServerException { checkStart(clientIdentity.getDestination()); CanalInstance canalInstance = canalInstances.get(clientIdentity.getDestination()); @@ -407,7 +416,7 @@ public class CanalServerWithEmbedded extends AbstractCanalLifeCycle implements C canalInstance.getEventStore().rollback();// rollback // eventStore中的状态信息 logger.info("rollback successfully, clientId:{} batchId:{} position:{}", - new Object[] { clientIdentity.getClientId(), batchId, positionRanges }); + clientIdentity.getClientId(), batchId, positionRanges); } } diff --git a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java index 8474950e..1e85eaaa 100644 --- a/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java +++ b/sink/src/main/java/com/alibaba/otter/canal/sink/entry/EntryEventSink.java @@ -132,8 +132,8 @@ public class EntryEventSink extends AbstractCanalEventSink eventStore) {