Skip to content

Hprose 服务器事件

小马哥 edited this page Oct 31, 2016 · 1 revision

概述

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,或者返回非 nilerror 结果,则不再执行服务函数/方法,同时跳过下面的 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,或者返回非 nilerror 结果,则进入 OnSendError 事件。

OnSendError 事件

type sendErrorEvent interface {
	OnSendError(err error, context Context)
}

type sendErrorEvent2 interface {
	OnSendError(err error, context Context) error
}

上面两个事件在实现时,同样根据喜好二选一。

该事件在服务端发生错误时触发。

如果在该事件中发生 panic,或者返回非 nilerror 结果。则 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,或者返回非 nilerror 结果,则进入 OnSendError 事件,在之后直接返回错误信息给客户端。

OnAccept 事件

type acceptEvent interface {
	OnAccept(context *SocketContext)
}

type acceptEvent2 interface {
	OnAccept(context *SocketContext) error
}

二选一。

该事件在 Socket 服务器接受客户端连接时触发。

如果在该事件中发生 panic,或者返回非 nilerror 结果,则进入 OnSendError 事件,并断开跟该客户端的连接。你可以在 OnSendError 事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了。

OnClose 事件

type closeEvent interface {
	OnClose(context *SocketContext)
}

type closeEvent2 interface {
	OnClose(context *SocketContext) error
}

选一。

该事件在 Socket 服务器跟客户端之间的连接关闭时触发。

如果在该事件中发生 panic,或者返回非 nilerror 结果,则进入 OnSendError 事件,你可以在 OnSendError 事件中统一记录日志,但是之后并不会返回错误给客户端,因为客户端已经断开了,所以不会对服务器和客户端有任何影响。