Esempio n. 1
0
        static void Main(string[] args)
        {
            Console.WriteLine("Starting...");

            //canal 配置的 destination,默认为 example
            var destination = "example";

            //创建一个简单 CanalClient 连接对象(此对象不支持集群)传入参数分别为 canal 地址、端口、destination、用户名、密码
            var connector = CanalConnectors.NewSingleConnector("39.108.11.143", 11111, destination, "", "");

            //连接 Canal
            connector.Connect();

            //订阅,同时传入 Filter。Filter是一种过滤规则,通过该规则的表数据变更才会传递过来
            //允许所有数据 .*\\..*
            //允许某个库数据 库名\\..*
            //允许某些表 库名.表名,库名.表名
            connector.Subscribe(".*\\..*");

            while (true)
            {
                //获取数据 1024表示数据大小 单位为字节
                var message = connector.Get(1024);

                //批次id 可用于回滚
                var batchId = message.Id;
                if (batchId == -1 || message.Entries.Count <= 0)
                {
                    Thread.Sleep(300);
                    continue;
                }

                PrintEntry(message.Entries);
            }
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            LogManager.Configuration = new XmlLoggingConfiguration("NLog.Config");
            var logger = LogManager.GetLogger("test");

            logger.Debug("Nlog enabled.");
            //设置 NLog
            CanalSharpLogManager.LoggerFactory.AddNLog();
            _logger = CanalSharpLogManager.LoggerFactory.CreateLogger("Program");
            //canal 配置的 destination,默认为 example
            var destination = "example";
            //创建一个简单 CanalClient 连接对象(此对象不支持集群)传入参数分别为 canal 地址、端口、destination、用户名、密码
            var connector = CanalConnectors.NewSingleConnector("127.0.0.1", 11111, destination, "", "");

            //连接 Canal
            connector.Connect();
            //订阅,同时传入 Filter,如果不传则以Canal的Filter为准。Filter是一种过滤规则,通过该规则的表数据变更才会传递过来
            connector.Subscribe(".*\\\\..*");
            while (true)
            {
                //获取数据 1024表示数据大小 单位为字节
                var message = connector.Get(1024);
                //批次id 可用于回滚
                var batchId = message.Id;
                if (batchId == -1 || message.Entries.Count <= 0)
                {
                    _logger.LogInformation("=====没有数据了=====");
                    Thread.Sleep(300);
                    continue;
                }

                PrintEntry(message.Entries);
            }
        }
Esempio n. 3
0
        public void Start()
        {
            _canalLogger?.LogDebug($"### [{_xdpCanalOption.LogSource}] Canal Client starting...");

            Task.Factory.StartNew(
                () =>
            {
                // 创建一个简单CanalClient连接对象(此对象不支持集群)
                // 传入参数分别为 Canal-Server地址、端口、Destination、用户名、密码
                _canalConnector = CanalConnectors.NewSingleConnector(
                    _xdpCanalOption.CanalServerIP,
                    _xdpCanalOption.CanalServerPort,
                    _xdpCanalOption.Destination,
                    _xdpCanalOption.UserName,
                    _xdpCanalOption.Password);

                // 连接 Canal
                _canalConnector.Connect();

                // 订阅,同时传入Filter,如果不传则以Canal的Filter为准。
                // Filter是一种过滤规则,通过该规则的表数据变更才会传递过来
                _canalConnector.Subscribe(_xdpCanalOption.Filter);

                while (true)
                {
                    // 获取数据 BufferSize表示数据大小,单位为字节,默认会发送ACK来表示消费成功
                    var message = _canalConnector.Get(_xdpCanalOption.BufferSize);
                    // 也可以使用下面这个GetWithoutAck方法表示不发送ACK来表示消费成功
                    //var message = _canalConnector.GetWithoutAck(_xdpCanalOption.BufferSize);

                    // 批次id 可用于回滚
                    var batchId = message.Id;

                    if (batchId == -1 || message.Entries.Count <= 0)
                    {
                        Thread.Sleep(_xdpCanalOption.SleepTime);
                        continue;
                    }

                    // 记录变更数据到自定义业务持久化存储区域
                    if (message.Entries.Count > 0)
                    {
                        RecordChanges(message.Entries);
                    }
                }
            },
                _cts.Token,
                TaskCreationOptions.LongRunning,
                TaskScheduler.Default);

            _compositeTask = Task.CompletedTask;

            _canalLogger?.LogDebug($"### [{_xdpCanalOption.LogSource}] Canal Client started...");
        }
Esempio n. 4
0
        public void Test1()
        {
            string          destination = "example";
            ICanalConnector connector   = CanalConnectors.NewSingleConnector("127.0.0.1", 11111, destination, "", "");

            connector.Connect();
            Console.Read();

            Mutex a = new Mutex(false);
            //lock (_lock)
            //{
            //    new Thread(Test).Start();
            //    Monitor.Wait(_lock);
            //    Console.WriteLine(aa);
            //    Console.Read();
            //}
        }
Esempio n. 5
0
 public Task StartAsync(CancellationToken cancellationToken)
 {
     try
     {
         _canalConnector = CanalConnectors.NewSingleConnector(_canalOption.Host, _canalOption.Port, _canalOption.Destination, _canalOption.MysqlName, _canalOption.MysqlPwd);
         _canalConnector.Connect();
         _canalConnector.Subscribe(_canalOption.Subscribe);
         _canalConnector.Rollback();
         _canalTimer = new System.Threading.Timer(CanalGetData, null, _canalOption.Timer * 1000, _canalOption.Timer * 1000);
         _logger.LogInformation("canal client start success...");
         AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit;
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, "canal client start error...");
     }
     return(Task.CompletedTask);
 }
Esempio n. 6
0
        public Task StartAsync(CancellationToken cancellationToken)
        {
            try
            {
                _canalConnector = CanalConnectors.NewSingleConnector(_canalOption.Host, _canalOption.Port, _canalOption.Destination, _canalOption.MysqlName, _canalOption.MysqlPwd);
                _canalConnector.Connect();
                _canalConnector.Subscribe(_canalOption.Subscribe);
                _canalConnector.Rollback();

                AppDomain.CurrentDomain.ProcessExit += CurrentDomainOnProcessExit;

                _logger.LogInformation("canal client start ...");
                LazyCanalGetEntities();
                LazyCanalDoWork();
                CanalServerAckStart();
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "canal client start error...");
            }
            return(Task.CompletedTask);
        }
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            try
            {
                foreach (var subscribeInfo in _cannalConfig.Subscribes)
                {
                    if (string.IsNullOrEmpty(subscribeInfo.Connector))
                    {
                        subscribeInfo.Format = typeof(Connectors.ConsoleConnector).FullName;
                    }

                    if (string.IsNullOrEmpty(subscribeInfo.Format))
                    {
                        subscribeInfo.Format = typeof(Formatters.MaxwellJson.Formatter).FullName;
                    }

                    var connector = System.Activator.CreateInstance(Type.GetType(subscribeInfo.Connector)) as IConnector;

                    var formater = System.Activator.CreateInstance(Type.GetType(subscribeInfo.Format)) as IFormater;

                    //创建一个简单 CanalClient 连接对象(此对象不支持集群)传入参数分别为 canal 地址、端口、destination、用户名、密码
                    var canalConnector = CanalConnectors.NewSingleConnector(
                        subscribeInfo.ConnectionInfo.Address,
                        subscribeInfo.ConnectionInfo.Port,
                        subscribeInfo.ConnectionInfo.Destination,
                        subscribeInfo.ConnectionInfo.UserName,
                        subscribeInfo.ConnectionInfo.Passsword);

                    //连接 Canal
                    canalConnector.Connect();

                    canalConnector.Subscribe(subscribeInfo.Filter);

                    _canalConnectors.Add(canalConnector);

                    while (true)
                    {
                        //获取数据 1024表示数据大小 单位为字节
                        var message = canalConnector.GetWithoutAck(subscribeInfo.BatchSize);
                        //批次id 可用于回滚
                        var batchId = message.Id;

                        if (batchId == -1 || message.Entries.Count <= 0)
                        {
                            Thread.Sleep(100);
                            continue;
                        }
                        else
                        {
                            var ret = connector.Process(message.Entries, formater);

                            if (ret)
                            {
                                canalConnector.Ack(batchId);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
            }
        }