1.9 服务端
服务端
服务端统一为一个 Service
类型。下面来分别介绍它所包含的属性和方法。
属性
timeout
codec
maxRequestLength
names
options
timeout
属性是用来限制服务代码执行时间的,如果服务执行超时,则返回超时异常。需要注意的是,即使服务执行超时,也不意味着在超时后,服务代码本身会被强行中断,实际上服务代码仍然会继续执行,只是执行结果不会作为调用结果被返回。因此,如果客户端调用某个服务发生超时异常,应该检查服务本身是否编写错误,如果某个服务因为死锁而造成超时,服务器最终将会被该服务耗尽资源。该设置默认值为 30 秒。
codec
属性用来设置编解码器。默认设置是 hprose 编解码器,如果替换为 JSONRPC 编解码器,则服务器不但可以处理 hprose 请求,也可以同时处理 JSONRPC 请求。
maxRequestLength
属性用来设置请求编码后的最大字节数。如果请求字节数超过该设置,则返回异常。该设置默认值为 0x7FFFFFFF(2147483647),相当于没有限制。为了保证不会因为请求太大造成内存溢出的错误,最好根据具体业务将该值设置为一个更为合理的值。
names
只读属性。返回服务端已发布的所有方法名列表。
options
只读属性。它是一个 Map<String, Object>
的属性,它当中默认没有值,服务端默认也没有任何针对它的操作。它是为用户提供扩展功能使用的,用户在编写针对服务端的自定义插件时,可以使用它来存取用户自定义的全局选项。
方法
bind
handle
process
execute
use
unuse
get
remove
add
addMissingMethod
bind
方法的功能跟处理器接口的 bind
方法功能一致,但是处理器接口的 bind
方法是针对具体某个类型的服务器的。而服务对象上的 bind
方法,可以跟已经注册过的任何服务器进行绑定。因此,用户不需要调用处理器接口上的 bind
方法,而应该使用服务对象上的 bind
方法来统一操作。
handle
方法接受编码后的请求并返回服务执行后已编码响应结果。该方法是留给处理器实现 handler
方法时使用的,用户如果不需要编写自定义处理器,则不需要关心该方法。
process
方法是服务端的输入输出处理器链中最后执行的方法。如果在实现服务端的输入输出处理器时,希望跳过输入输出处理器链上后面所有的输入输出处理器,可以通过直接调用该方法来代替调用 next
。其他情况下,用户不需要关心该方法。
execute
方法是服务端的调用处理器链中最后执行的方法。如果在实现服务端的调用处理器时,希望跳过调用处理器链上后面所有的调用处理器,可以通过直接调用该方法来代替调用 next
。其他情况下,用户不需要关心该方法。
use
方法用来添加输入输出处理器或调用处理器,unuse
方法用来删除输入输出处理器或调用处理器。对于不支持使用 use
作为方法名的语言,使用 addHandler
和 removeHandler
代替。
get
方法用来通过发布名称获取已发布的服务方法对象。在某些语言中(比如 C#),允许发布相同名称但参数个数不同的重载方法,因此,在这些语言中,get
方法本身会有 2 个参数(发布名称,参数个数)。
remove
方法用来删除已发布的服务方法。该方法的参数与 get
方法相同。
add
方法用来添加发布的服务方法。该方法在不同的语言中,可以根据具体情况提供多个重载或不同命名的多个实现,例如:addMethod
,addMethods
,addFunction
,addFunctions
,addStaticMethods
,addInstanceMethods
等等。
addMissingMethod
方法用来添加一个通用的服务方法,当客户端调用的服务方法不存在时,该服务方法才会被调用。
当调用 get
方法时,如果查找的具体服务方法不存在,但是通用服务方法存在的话,则会返回通用服务方法,否则返回 null
。
另外,还可以通过 service[name]
的方式来存取处理器对象,例如通过 service["http"]
可以获得已经注册的 HttpHandler
对象实例。