• 概述
  • OnBeforeInvoke 事件
  • OnAfterInvoke 事件
  • OnSendError 事件
  • OnSendHeader 事件
  • OnAccept 事件
  • OnClose 事件

    概述

    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