Hprose 服务器事件
Hprose 定义了一个 ServiceEvent 接口。
- type ServiceEvent interface{}
这是一个空接口,但是你可以在实现中添加下面一些事件方法:
- OnBeforeInvoke
- OnAfterInvoke
OnSendError
以上三个事件所有的 Hprose 服务器都支持。OnSendHeader
这个事件仅 HTTP 和 FastHTTP 服务器支持,但它们的参数不一样。OnAccept
- OnClose
这两个事件 TCP 和 Unix Socket 服务器支持。
上面的所有事件,只要你的服务器支持,你都可以实现或者不实现,并且可以任意组合。
下面来分别介绍一下这些事件。
OnBeforeInvoke 事件
- 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
事件。
OnAfterInvoke 事件
- 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
事件。
OnSendError 事件
- type sendErrorEvent interface {
- OnSendError(err error, context Context)
- }
- type sendErrorEvent2 interface {
- OnSendError(err error, context Context) error
- }
上面两个事件在实现时,同样根据喜好二选一。
该事件在服务端发生错误时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果。则 panic 的值或者返回的 error
值会替代原来的错误信息返回给客户端。
OnSendHeader 事件
- 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
事件,在之后直接返回错误信息给客户端。
OnAccept 事件
- type acceptEvent interface {
- OnAccept(context *SocketContext)
- }
- type acceptEvent2 interface {
- OnAccept(context *SocketContext) error
- }
二选一。
该事件在 Socket 服务器接受客户端连接时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件,并断开跟该客户端的连接。你可以在 OnSendError
事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了。
OnClose 事件
- type closeEvent interface {
- OnClose(context *SocketContext)
- }
- type closeEvent2 interface {
- OnClose(context *SocketContext) error
- }
选一。
该事件在 Socket 服务器跟客户端之间的连接关闭时触发。
如果在该事件中发生 panic,或者返回非 nil
的 error
结果,则进入 OnSendError
事件,你可以在 OnSendError
事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了,所以不会对服务器和客户端有任何影响。