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); } }
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); } }
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..."); }
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(); //} }
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); }
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); } }