|
|
@@ -0,0 +1,72 @@
|
|
|
+package com.lewaimai.mysql.elasticsearch;
|
|
|
+
|
|
|
+import java.net.InetSocketAddress;
|
|
|
+
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+
|
|
|
+import com.alibaba.otter.canal.client.CanalConnector;
|
|
|
+import com.alibaba.otter.canal.client.CanalConnectors;
|
|
|
+import com.alibaba.otter.canal.protocol.Message;
|
|
|
+import com.alibaba.otter.canal.protocol.exception.CanalClientException;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.AbstractConsumerLifeCycle;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.BatchQueue;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.ConsumerLifeCycle;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.config.Canal;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.config.ConfigBean;
|
|
|
+import com.lewaimai.mysql.elasticsearch.common.config.ConfigInstance;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 消费者服务,主要负责从Canal拉取数据变更事件。
|
|
|
+ * @author jogin
|
|
|
+ *
|
|
|
+ */
|
|
|
+public class ConsumerServer extends AbstractConsumerLifeCycle {
|
|
|
+ private static Logger logger = LoggerFactory.getLogger(ConsumerLauncher.class);
|
|
|
+ public ConsumerServer() {
|
|
|
+ }
|
|
|
+
|
|
|
+ public void start() {
|
|
|
+ super.start();
|
|
|
+ //创建连接
|
|
|
+ Canal canalConfig = ConfigInstance.instance().getConfig().getCanal();
|
|
|
+ CanalConnector connector = CanalConnectors
|
|
|
+ .newSingleConnector(
|
|
|
+ new InetSocketAddress(canalConfig.getIp(), canalConfig.getPort()),
|
|
|
+ canalConfig.getDestination(),
|
|
|
+ canalConfig.getUser(),
|
|
|
+ canalConfig.getPassword());
|
|
|
+ try {
|
|
|
+ ConfigBean configBean = ConfigInstance.instance().getConfig();
|
|
|
+ connector.connect();
|
|
|
+ connector.subscribe(configBean.getDbName() + "\\..*");
|
|
|
+ connector.rollback();
|
|
|
+ logger.info("开始监听消息.");
|
|
|
+ int batchSize = configBean.getBatchSize();
|
|
|
+ while (isRunning()) {
|
|
|
+ Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据
|
|
|
+ long batchId = message.getId();
|
|
|
+ int size = message.getEntries().size();
|
|
|
+ if (batchId == -1 || size == 0) {
|
|
|
+ try {
|
|
|
+ logger.debug("没有消息.");
|
|
|
+ Thread.sleep(1000);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //处理binlog
|
|
|
+ logger.debug("处理消息. ");
|
|
|
+
|
|
|
+ BatchQueue.instance().add(batchId, message.getEntries());
|
|
|
+ }
|
|
|
+// connector.ack(batchId); // 提交确认
|
|
|
+ }
|
|
|
+ } catch (CanalClientException e) {
|
|
|
+ logger.error("Canel server连接不上.");
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+ connector.disconnect();
|
|
|
+ logger.info("退出Consumer Server.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|