Canal TCP 方式传输数据的java数据消费

Canal TCP 方式传输数据的java数据消费

代码

package canan_to_kafka;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import com.google.protobuf.InvalidProtocolBufferException;

import java.net.InetSocketAddress;
import java.util.List;

/*Canal 客户端*/
public class CanalClient {

    // Canal 服务器地址
    private static final String SERVER_ADDRESS = "192.168.189.192";

    // Canal 端口 默认 11111
    private static final Integer PORT = 11111;

    // Canal 目的地即 canal 配置实例
    private static final String DESTINATION = "example";

    // Canal 用户名密码 默认为空
    private static final String USERNAME = "";
    private static final String PASSWORD = "";

    public static void main(String[] args) {


        final CanalConnector canalConnector = CanalConnectors.newSingleConnector(
                new InetSocketAddress(SERVER_ADDRESS, PORT),
                DESTINATION,
                USERNAME,
                PASSWORD);

        //建立连接
        canalConnector.connect();

        // 订阅
//        canalConnector.subscribe(".*\\..*");
//        canalConnector.subscribe(".*\\..big_data");

        // 指定数据库和表
        canalConnector.subscribe("big_data.emp");

        //回滚到之前同步的那一个位置
        canalConnector.rollback();

        for(;;){
            // 获取数据但是不做确认
            final Message message = canalConnector.getWithoutAck(100);
            // 消息id
            final long id = message.getId();

            if(id != -1){
                System.out.println("数据---->"+message.getEntries());
                System.out.println("消息id---->"+id);

                //解析数据
                parseData(message.getEntries());
                // 提交确认
               // canalConnector.ack(id);

                // 处理失败 ,进行回滚
                canalConnector.rollback(id);
            }
        }




    }

    /*数据解析*/
    private static void parseData(List<CanalEntry.Entry> entries) {

        for (CanalEntry.Entry e: entries ) {

            // 判断数据格式
            if(e.getEntryType() != CanalEntry.EntryType.ROWDATA){
                continue;

            }

            try {
                final CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(e.getStoreValue());

                final List<CanalEntry.RowData> rowDatasList = rowChange.getRowDatasList();

                for (CanalEntry.RowData r: rowDatasList) {

                    // 获取事件类型 增 删 改 查询 建立索引 。。。。都可以监听
                    final CanalEntry.EventType eventType = rowChange.getEventType();

                    switch (eventType){
                        // 插入操作
                        case INSERT:
                        final String tableName = e.getHeader().getTableName();
                        //
                            final List<CanalEntry.Column> afterColumnsList = r.getAfterColumnsList();
                            for (CanalEntry.Column  d: afterColumnsList) {
//                                System.out.println("表=================》"+d.getName());
                                System.out.println("表=================》"+d.getName());
                            }

                        default:
                            break;

                    }

                }

            } catch (InvalidProtocolBufferException ex) {
                ex.printStackTrace();
            }


        }

    }
}

说明 此代码 需要以TCP方式 传输 参进行获取更新数据

你可能感兴趣的:(工具)