-
Notifications
You must be signed in to change notification settings - Fork 205
Hprose 服务器事件
Hprose 定义了一个 ServiceEvent 接口。
type ServiceEvent interface{}
这是一个空接口,但是你可以在实现中添加下面一些事件方法:
OnBeforeInvoke
OnAfterInvoke
OnSendError
以上三个事件所有的 Hprose 服务器都支持。
OnSendHeader
这个事件仅 HTTP 和 FastHTTP 服务器支持,但它们的参数不一样。
OnAccept
OnClose
这两个事件 TCP 和 Unix Socket 服务器支持。
上面的所有事件,只要你的服务器支持,你都可以实现或者不实现,并且可以任意组合。
下面来分别介绍一下这些事件。
type beforeInvokeEvent interface {
OnBeforeInvoke(name string, args []reflect.Value, byref bool, context Context)
}
type beforeInvokeEvent2 interface {
OnBeforeInvoke(name string, args []reflect.Value, byref bool, context Context) error
}
OnBeforeInvoke
事件被定义在上面两个接口中,因为 go 语言特殊的隐式接口,因此在这里把这两个事件接口定义为私有的。你可以实现其中任意一个(但不要两个都实现)。
该事件在调用执行前触发。
参数 name
是服务器函数/方法名。
参数 args
是调用的参数数组。
参数 byref
表示是否是引用参数传递。
参数 context
是该调用的上下文参数,这个在 Hprose 过滤器 一章中我们已经见识过了。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则不再执行服务函数/方法,同时跳过下面的 OnAfterInvoke
事件,直接进入 OnSendError
事件。
type afterInvokeEvent interface {
OnAfterInvoke(name string, args []reflect.Value, byref bool, result []reflect.Value, context Context)
}
type afterInvokeEvent2 interface {
OnAfterInvoke(name string, args []reflect.Value, byref bool, result []reflect.Value, context Context) error
}
同 OnBeforeInvoke
事件一样,对于 OnAfterInvoke
事件你也可以实现其中任意一个(但不要两个都实现)。
该事件在调用执行后触发。
参数 name
是服务器函数/方法名。
参数 args
是调用的参数数组。
参数 byref
表示是否是引用参数传递。
参数 result
表示调用执行结果,注意,如果服务方法的返回结果最后定义了 error
类型的返回结果,该 error
类型结果的返回值在 result
中并不会包含。
参数 context
是该调用的上下文参数,
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件。
type sendErrorEvent interface {
OnSendError(err error, context Context)
}
type sendErrorEvent2 interface {
OnSendError(err error, context Context) error
}
上面两个事件在实现时,同样根据喜好二选一。
该事件在服务端发生错误时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果。则 panic 的值或者返回的 error
值会替代原来的错误信息返回给客户端。
type sendHeaderEvent interface {
OnSendHeader(context *HTTPContext)
}
type sendHeaderEvent2 interface {
OnSendHeader(context *HTTPContext) error
}
type fastSendHeaderEvent interface {
OnSendHeader(context *FastHTTPContext)
}
type fastSendHeaderEvent2 interface {
OnSendHeader(context *FastHTTPContext) error
}
如果你是用的是 net/http 服务,你应该从前面两个 OnSendHeader
事件中二选一,如果你使用的是 fasthttp 服务,则应该从后面两个 OnSendHeader
事件中二选一。
该事件在服务器发送 HTTP 头时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件,在之后直接返回错误信息给客户端。
type acceptEvent interface {
OnAccept(context *SocketContext)
}
type acceptEvent2 interface {
OnAccept(context *SocketContext) error
}
二选一。
该事件在 Socket 服务器接受客户端连接时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件,并断开跟该客户端的连接。你可以在 OnSendError
事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了。
type closeEvent interface {
OnClose(context *SocketContext)
}
type closeEvent2 interface {
OnClose(context *SocketContext) error
}
选一。
该事件在 Socket 服务器跟客户端之间的连接关闭时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件,你可以在 OnSendError
事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了,所以不会对服务器和客户端有任何影响。