public interface ClientRequestInterceptorOperations
客户端的请求 interceptor。
请求 Interceptor 用于通过 ORB 在指定点截取请求/应答序列流,以便服务能够查询请求信息并操作在客户端和服务器之间传播的服务上下文。请求 Interceptor 主要用途是使 ORB 服务能够在客户端和服务器之间传输上下文信息。请求 Interceptor 有两种类型:客户端和服务器端。
编写客户端 Interceptor 需要实现 ClientRequestInterceptor
接口。
ClientRequestInfo
方法摘要 | |
---|---|
void |
receive_exception(ClientRequestInfo ri) 指示 interceptor 发生异常。 |
void |
receive_other(ClientRequestInfo ri) 允许 Interceptor 在请求引起了正常应答和异常之外的情况时查询可用信息。 |
void |
receive_reply(ClientRequestInfo ri) 允许 Interceptor 在从服务器返回后但在向客户端返回控件前查询信息。 |
void |
send_poll(ClientRequestInfo ri) 允许 Interceptor 在轮询获取应答序列的与时间无关的调用(Time-Independent Invocation,TII)时查询信息。 |
void |
send_request(ClientRequestInfo ri) 允许 Interceptor 在请求被发送到服务器前查询请求信息并修改服务上下文。 |
从接口 org.omg.PortableInterceptor.InterceptorOperations 继承的方法 |
---|
destroy, name |
方法详细信息 |
---|
void send_request(ClientRequestInfo ri) throws ForwardRequest
此截取点可能抛出系统异常。如果抛出异常,则不调用其他任何 Interceptor 的 send_request
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 receive_exception
截取点。此截取点也可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则不调用其他任何 Interceptor 的 send_request
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 receive_other
截取点。
符合的 Interceptor 如果从此截取点抛出系统异常,则它们应该完全遵守 completion_status 语义。completion_status
应为 COMPLETED_NO
。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。
void send_poll(ClientRequestInfo ri)
利用 TII,应用程序可以轮询对之前由轮询客户端或其他客户端发送的请求所做出的响应。此轮询将通过 send_poll
截取点报告给 Interceptor,响应将通过 receive_reply
或 receive_exception
截取点返回。如果在超过轮询超时期前没有获得响应,则抛出系统异常 TIMEOUT
,并使用该异常调用 receive_exception
。
此截取点可能抛出系统异常。如果抛出异常,则不调用其他任何 Interceptor 的 send_poll
操作。移除那些 Flow Stack 上的 Interceptor 并调用其 receive_exception
截取点。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status 应为 COMPLETED_NO
。
ri
- 关于将被截取的当前请求的信息。
TIMEOUT
- 如果在超过轮询超时期前没有获得响应。
void receive_reply(ClientRequestInfo ri)
此截取点可能抛出系统异常。如果抛出异常,则不调用其他任何 Interceptor 的 receive_reply
操作。将调用 Flow Stack 中剩余 Interceptor 的 receive_exception
截取点。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应为 COMPLETED_YES
。
ri
- 关于将被截取的当前请求的信息。
void receive_exception(ClientRequestInfo ri) throws ForwardRequest
此截取点可能抛出系统异常。这等效于更改连续 Interceptor(从 Flow Stack 中移除的)调用 receive_exception
接收到的异常。对客户端抛出的异常将是 Interceptor 抛出的最终异常或者原始异常(如果没有 Interceptor 更改了异常)。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则不调用其他任何 Interceptor 的 receive_exception
操作。移除 Flow Stack 中剩余的 Interceptor 并调用其 receive_other
截取点。
如果异常的 completion_status
不是 COMPLETED_NO
,则此截取点抛出 ForwardRequest
异常是不恰当的。将失去请求的最多一次 (at-most-once) 语义。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。如果原始异常为系统异常,则新异常的 completion_status
将与原始异常相同。如果原始异常为用户异常,则新异常的 completion_status
应为 COMPLETED_YES
。
在某些情况下,异常(如 COMM_FAILURE
)可能导致重试请求,具体取决于实行的策略。虽然这种重试对于 Interceptor 而言是一个新的请求,但是在原始请求和重试请求之间仍然存在一种相关性:因为没有向客户端返回控制信息,所以原始请求和重试请求的 PortableInterceptor.Current
是相同的。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。
void receive_other(ClientRequestInfo ri) throws ForwardRequest
LOCATION_FORWARD
状态的 GIOP 应答);又如异步调用时,请求后不会立即应答,但是将向客户端返回控制信息并调用终端截取点。
对于重试而言,当已经指示重试后可能执行一个新的请求,也可能不执行,具体取决于实行的策略。如果执行新的请求,则虽然这种重试对于 Interceptor 而言是一个新的请求,但是在原始请求和重试请求之间仍然存在一种相关性:因为没有向客户端返回控制信息,所以原始请求和重试请求的请求域 PortableInterceptor.Current
是相同的。
此截取点可能抛出系统异常。如果抛出异常,则不调用其他任何 Interceptor 的 receive_other
操作。移除 Flow Stack 中剩余的 Interceptor 并调用其 receive_exception
截取点。
此截取点同样可能抛出 ForwardRequest
异常。如果 Interceptor 抛出此异常,则使用 ForwardRequest
异常提供的新信息调用连续 Interceptor 的 receive_other
操作。
如果符合的 Interceptor 从此截取点抛出系统异常,则它们应该完全遵守 completion_status
语义。completion_status
应该是 COMPLETED_NO
。如果已经完成了目标调用,则将调用此截取点。
ri
- 关于将被截取的当前请求的信息。
ForwardRequest
- 抛出此异常指示 ORB 重试请求应该与异常中给定的新对象一起发生。