go调用Mongdb注册回调函数(mongo-driver/mongo)

ServerMonitor表示为不同的服务器事件触发的监视器。 客户端

将监视它所连接的MongoDB部署的变化,这个监视报告

在客户端表示部署的变化。

总体部署,和心跳被发送到单个服务器,以检查它们的当前状态。

mongodb提供检测服务器得非阻塞式的接口

type ServerMonitor struct {
	ServerDescriptionChanged func(*ServerDescriptionChangedEvent)
	ServerOpening            func(*ServerOpeningEvent)
	ServerClosed             func(*ServerClosedEvent)
	TopologyDescriptionChanged func(*TopologyDescriptionChangedEvent)
	TopologyOpening            func(*TopologyOpeningEvent)
	TopologyClosed             func(*TopologyClosedEvent)
	ServerHeartbeatStarted     func(*ServerHeartbeatStartedEvent)
	ServerHeartbeatSucceeded   func(*ServerHeartbeatSucceededEvent)
	ServerHeartbeatFailed      func(*ServerHeartbeatFailedEvent)
}

SetServerMonitor指定用于监视SDAM事件的SDAM监视器。

使用实例,应该重写需要监听的回调接口

var status bool

func GetServerStatus() *bool {
	return &status
}
func serverClosed(e *event.ServerClosedEvent) {
	serverStatus := GetServerStatus()
	*serverStatus = false // 服务器关闭状态
}
func serverOpened(e *event.ServerOpeningEvent) {
	serverStatus := GetServerStatus()
	*serverStatus = true // 服务器关闭状态
	fmt.Println("打开了")
}
func serverHearbeatFailed(e *event.ServerHeartbeatStartedEvent) {
	serverStatus := GetServerStatus()
	*serverStatus = true // 服务开启,心跳检测成功
}
func serverHearFailed(e *event.ServerHeartbeatFailedEvent)  {
	serverStatus := GetServerStatus()
	*serverStatus = false
	fmt.Println("服务挂了")
}

当连接进行初始化的时候,就把这些回调函数注册到连接中去

func DBConnectInit() {
	ctx2, _ := context.WithTimeout(context.Background(), 10*time.Second)
	monitor := &event.ServerMonitor{
		ServerDescriptionChanged:   nil,
		ServerOpening:              serverOpened,
		ServerClosed:               serverClosed,
		TopologyDescriptionChanged: nil,
		TopologyOpening:            nil,
		TopologyClosed:             nil,
		ServerHeartbeatStarted:     serverHearbeatFailed,
		ServerHeartbeatSucceeded:   nil,
		ServerHeartbeatFailed:      serverHearFailed,
	}
    // 一个事件的注册器 把写过的函数注册进去
	var err error
	client,err = mongo.Connect(ctx2, options.Client().ApplyURI("mongodb://localhost:27017").SetServerMonitor(monitor).SetHeartbeatInterval(1*time.Second))
    // SetHeartbeatInterval 用于指定心跳间隔
	if err != nil {
		log.Panic("client error ",err)
	}
    fmt.Println("启动中")
	// client.Disconnect(ctx)
	globalH = client.Database("test").Collection("col") 
}
/*
type Client struct {
	id              uuid.UUID
	
	monitor         *event.CommandMonitor
	serverAPI       *driver.ServerAPIOptions
	serverMonitor   *event.ServerMonitor // 关于事件的
	sessionPool     *session.Pool

}
*/

每当需要获取连接的时候就应该判断服务器的状态

func GetConnect() *mongo.Client { // 获取一个连接过来
	serverStatus := GetServerStatus()
	if *serverStatus == false {
		return nil
	}
	return client
}

这样,就不必要时时去ping服务器,只需要对他进行注册回调和设置心跳间隔既可以轻松实现非阻塞的高效连接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值