public interface ServerRequestInterceptorOperations
服务器端的请求 interceptor。
请求 Interceptor 用于通过 ORB 在指定点截取请求/应答序列流,以便服务能够查询请求信息并操作在客户端和服务器之间传播的服务上下文。请求 Interceptor 主要用途是使 ORB 服务能够在客户端和服务器之间传输上下文信息。请求 Interceptor 有两种类型:客户端和服务器端。
编写服务器端 Interceptor 需要实现 ServerRequestInterceptor 接口。
ServerRequestInfo
方法摘要 | |
---|---|
void |
receive_request_service_contexts(ServerRequestInfo ri) 允许 interceptor 处理服务上下文信息。 |
void |
receive_request(ServerRequestInfo ri) 允许 Interceptor 在所有信息(包括操作参数)可用后查询信息。 |
void |
send_exception(ServerRequestInfo ri) 允许 Interceptor 在向客户端抛出异常前查询异常信息并修改应答服务上下文。 |
void |
send_other(ServerRequestInfo ri) 允许 Interceptor 在请求引起了正常应答和异常之外的情况时查询可用信息。 |
void |
send_reply(ServerRequestInfo ri) 允许 Interceptor 在已调用目标操作后、向客户端返回应答前查询应答信息并修改应答服务上下文。 |
从接口 org.omg.PortableInterceptor.InterceptorOperations 继承的方法 |
---|
destroy, name |
方法详细信息 |
---|
void receive_request_service_contexts(ServerRequestInfo ri) throws ForwardRequest
在此截取点,Interceptor 必须从传入请求获取其服务上下文信息,并将其传输到 PortableInterceptor.Current
的槽 (slot)。
在调用 servant 管理器之前调用此截取点。此时操作参数尚未可用。此截取点可能执行与目标调用相同的线程,也可能不执行。
此截取点可能抛出系统异常。如果抛出异常,则不调用任何其他 Interceptor 的 receive_request_service_contexts
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 send_exception
截取点。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则不调用任何其他 Interceptor 的 receive_request_service_contexts
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 send_other
截取点。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应为 COMPLETED_NO。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。
void receive_request(ServerRequestInfo ri) throws ForwardRequest
在 DSI 模型中,因为在用户代码调用 arguments
时参数首次可用,所以将从 arguments
内部调用 receive_request
。有可能不是在 DSI 模型中调用 arguments
。目标可以在调用 arguments
之前调用 set_exception
。ORB 应保证通过 arguments
或 set_exception
调用 receive_request
一次。如果通过 set_exception
调用,则请求参数将导致抛出 NO_RESOURCES
,并带有标准次要代码 1。
此截取点可能抛出系统异常。如果抛出异常,则不调用任何其他 Interceptor 的 receive_request
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 send_exception
截取点。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则不调用任何其他 Interceptor 的 receive_request
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 send_other
截取点。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应为 COMPLETED_NO
。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。
void send_reply(ServerRequestInfo ri)
此截取点可能抛出系统异常。如果抛出异常,则不调用任何其他 Interceptor 的 send_reply
操作。Flow Stack 中剩余的 Interceptor 将使其 send_exception
截取点被调用。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应为 COMPLETED_YES
。
ri
- 关于将被截取的当前请求的信息。
void send_exception(ServerRequestInfo ri) throws ForwardRequest
此截取点可能抛出系统异常。这可以更改连续 Interceptor(从 Flow Stack 中移除的)调用 send_exception
收到的异常。对客户端抛出的异常将是 Interceptor 抛出的最终异常或者原始异常(如果没有 Interceptor 更改了异常)。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则不调用任何其他 Interceptor 的 send_exception
操作。将调用 Flow Stack 中剩余 Interceptor 的 send_other
截取点。
如果异常的 completion_status
不是 COMPLETED_NO
,则此截取点抛出 ForwardRequest
异常是不恰当的。将失去请求的最多一次 (at-most-once) 语义。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。如果原始异常为系统异常,则新异常的 completion_status
将与原始异常相同。如果原始异常为用户异常,则新异常的 completion_status
应为 COMPLETED_YES
。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。
void send_other(ServerRequestInfo ri) throws ForwardRequest
LOCATION_FORWARD
状态的 GIOP 应答)。此截取点应该执行与目标调用相同的线程。
此截取点可能抛出系统异常。如果抛出异常,则不调用任何其他 Interceptor 的 send_other
操作。将调用 Flow Stack 中剩余 Interceptor 的 send_exception
截取点。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则使用 ForwardRequest
异常提供的新信息调用连续 Interceptor 的 send_other
操作。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应为 COMPLETED_NO
。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。