mysql streamer_replication/binlogstreamer.go · siddontang/go-mysql - Gitee.com

本文介绍了如何处理 BinlogStreamer 中的三种常见错误(GetEventTimeout、NeedSyncAgain、SyncClosed),并展示了如何实现GetEvent方法的超时处理和流的关闭操作。实例代码详细讲解了事件获取与错误管理策略。
摘要由CSDN通过智能技术生成

package replication

import (

"errors"

"time"

)

var (

ErrGetEventTimeout = errors.New("Get event timeout, try get later")

ErrNeedSyncAgain = errors.New("Last sync error or closed, try sync and get event again")

ErrSyncClosed = errors.New("Sync was closed")

)

type BinlogStreamer struct {

ch chan *BinlogEvent

ech chan error

err error

}

func (s *BinlogStreamer) GetEvent() (*BinlogEvent, error) {

// we use a very very long timeout here

return s.GetEventTimeout(time.Second * 3600 * 24 * 30)

}

// if timeout, ErrGetEventTimeout will returns

func (s *BinlogStreamer) GetEventTimeout(d time.Duration) (*BinlogEvent, error) {

if s.err != nil {

return nil, ErrNeedSyncAgain

}

select {

case c :=

return c, nil

case s.err =

return nil, s.err

case

return nil, ErrGetEventTimeout

}

}

func (s *BinlogStreamer) close() {

s.closeWithError(ErrSyncClosed)

}

func (s *BinlogStreamer) closeWithError(err error) {

if err == nil {

err = ErrSyncClosed

}

select {

case s.ech

default:

}

}

func newBinlogStreamer() *BinlogStreamer {

s := new(BinlogStreamer)

s.ch = make(chan *BinlogEvent, 1024)

s.ech = make(chan error, 4)

return s

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值