概述

Hprose 定义了一个 ServiceEvent 接口。

  1. type ServiceEvent interface{}

这是一个空接口,但是你可以在实现中添加下面一些事件方法:

  • OnBeforeInvoke
  • OnAfterInvoke
  • OnSendError
    以上三个事件所有的 Hprose 服务器都支持。

  • OnSendHeader
    这个事件仅 HTTP 和 FastHTTP 服务器支持,但它们的参数不一样。

  • OnAccept

  • OnClose
    这两个事件 TCP 和 Unix Socket 服务器支持。

上面的所有事件,只要你的服务器支持,你都可以实现或者不实现,并且可以任意组合。

下面来分别介绍一下这些事件。

OnBeforeInvoke 事件

  1. type beforeInvokeEvent interface {
  2. OnBeforeInvoke(name string, args []reflect.Value, byref bool, context Context)
  3. }
  4.  
  5. type beforeInvokeEvent2 interface {
  6. OnBeforeInvoke(name string, args []reflect.Value, byref bool, context Context) error
  7. }

OnBeforeInvoke 事件被定义在上面两个接口中,因为 go 语言特殊的隐式接口,因此在这里把这两个事件接口定义为私有的。你可以实现其中任意一个(但不要两个都实现)。

该事件在调用执行前触发。

参数 name 是服务器函数/方法名。

参数 args 是调用的参数数组。

参数 byref 表示是否是引用参数传递。

参数 context 是该调用的上下文参数,这个在 Hprose 过滤器 一章中我们已经见识过了。

如果在该事件中发生 panic,或者返回非 nilerror 结果,则不再执行服务函数/方法,同时跳过下面的 OnAfterInvoke 事件,直接进入 OnSendError 事件。

OnAfterInvoke 事件

  1. type afterInvokeEvent interface {
  2. OnAfterInvoke(name string, args []reflect.Value, byref bool, result []reflect.Value, context Context)
  3. }
  4.  
  5. type afterInvokeEvent2 interface {
  6. OnAfterInvoke(name string, args []reflect.Value, byref bool, result []reflect.Value, context Context) error
  7. }

OnBeforeInvoke 事件一样,对于 OnAfterInvoke 事件你也可以实现其中任意一个(但不要两个都实现)。

该事件在调用执行后触发。

参数 name 是服务器函数/方法名。

参数 args 是调用的参数数组。

参数 byref 表示是否是引用参数传递。

参数 result 表示调用执行结果,注意,如果服务方法的返回结果最后定义了 error 类型的返回结果,该 error 类型结果的返回值在 result 中并不会包含。

参数 context 是该调用的上下文参数,

如果在该事件中发生 panic,或者返回非 nilerror 结果,则进入 OnSendError 事件。

OnSendError 事件

  1. type sendErrorEvent interface {
  2. OnSendError(err error, context Context)
  3. }
  4.  
  5. type sendErrorEvent2 interface {
  6. OnSendError(err error, context Context) error
  7. }

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

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

如果在该事件中发生 panic,或者返回非 nilerror 结果。则 panic 的值或者返回的 error 值会替代原来的错误信息返回给客户端。

OnSendHeader 事件

  1. type sendHeaderEvent interface {
  2. OnSendHeader(context *HTTPContext)
  3. }
  4.  
  5. type sendHeaderEvent2 interface {
  6. OnSendHeader(context *HTTPContext) error
  7. }
  8.  
  9. type fastSendHeaderEvent interface {
  10. OnSendHeader(context *FastHTTPContext)
  11. }
  12.  
  13. type fastSendHeaderEvent2 interface {
  14. OnSendHeader(context *FastHTTPContext) error
  15. }

如果你是用的是 net/http 服务,你应该从前面两个 OnSendHeader 事件中二选一,如果你使用的是 fasthttp 服务,则应该从后面两个 OnSendHeader 事件中二选一。

该事件在服务器发送 HTTP 头时触发。

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

OnAccept 事件

  1. type acceptEvent interface {
  2. OnAccept(context *SocketContext)
  3. }
  4.  
  5. type acceptEvent2 interface {
  6. OnAccept(context *SocketContext) error
  7. }

二选一。

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

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

OnClose 事件

  1. type closeEvent interface {
  2. OnClose(context *SocketContext)
  3. }
  4.  
  5. type closeEvent2 interface {
  6. OnClose(context *SocketContext) error
  7. }

选一。

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

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

原文:

https://github.com/hprose/hprose-golang/wiki/Hprose-%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BA%8B%E4%BB%B6