标签:return Producer err 套路 isHealthy 自动 func time 重连
自动重连套路
思路
-
结构体:
静态配置
动态链接
链接关闭字段
数据管道
-
initConfig()
-
run()
重试机制
-
Watch()
代码
package main
import (
"log"
"net"
"strconv"
"time"
)
const (
MaxSend = 1000
)
type Producer struct {
ConfAddr string
Conn net.Conn // 像这种链接的动态属性就要去监控
isHealthy bool
Msg chan string
}
func NewProducer(addr string) *Producer {
return &Producer{
ConfAddr: addr,
isHealthy: false,
Msg: make(chan string, MaxSend),
}
}
func (p *Producer)initConfig() error {
log.Println("初始化配置")
dial, err := net.Dial("tcp", p.ConfAddr)
if err != nil {
p.isHealthy = false
log.Println(err)
return err
}
p.Conn = dial
p.isHealthy = true
return nil
}
func (p *Producer) run() {
retry := 0
for p.isHealthy {
data := <- p.Msg
log.Println("收到数据", data)
p.Conn, _ = net.Dial("tcp", p.ConfAddr)
_, err := p.Conn.Write([]byte(data))
if err != nil {
log.Println(err)
retry++
if retry > 10 {
p.isHealthy = false
return
}
continue
}
retry = 0
}
}
func (p *Producer)Watch() {
for {
if p.isHealthy {
time.Sleep(time.Second)
continue
}
err := p.initConfig()
if err != nil {
log.Println("配置初始化失败")
continue
}
p.run()
}
}
func main() {
producer := NewProducer("127.0.0.1:9666")
go func() {
ticker := time.NewTicker(time.Second)
for {
<-ticker.C
producer.Msg <- strconv.Itoa(time.Now().Second())
}
}()
producer.Watch()
}
标签:return,Producer,err,套路,isHealthy,自动,func,time,重连 来源: https://www.cnblogs.com/maomaomaoge/p/15027614.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。