通过对SimpleHttpInvokerRequestExecutor的分析,我们看到,HTTP调用请求执行器的处理逻辑是:首先,打开指定URL的HTTP连接,设置连接属性。其次,将封装请求的RemoteInvocation对象序列化到请求体中,请HTTP请求发送到服务器端。最后,从服务器端的HTTP响应中读取输入流,并将响应结果转换成RemoteInvocationResult。
将远程调用的HTTP响应转换为RemoteInvocationResult是由AbstractHttpInvokerRequestExecutor的readRemoteInvocationResult方法实现,下面我们将分析其将HTTP响应结果转换成RemoteInvocationResult的实现。
6.AbstractHttpInvokerRequestExecutor其将HTTP响应结果转换成RemoteInvocationResult:
AbstractHttpInvokerRequestExecutor中处理远程调用结果,并HTTP响应转换为RemoteInvocationResult的主要方法如下:
[java] view plaincopyprint
- //从HTTP响应中读取远程调用结果入口方法 protected RemoteInvocationResult readRemoteInvocationResult(InputStream is, String codebaseUrl)
- throws IOException, ClassNotFoundException { //根据给定的输入流和类创建对象输入流
- ObjectInputStream ois = createObjectInputStream(decorateInputStream(is), codebaseUrl); try {
- //从对象输入流中读取远程调用结果 return doReadRemoteInvocationResult(ois);
- } finally {
- ois.close(); }
- } //从对象输入流中读取远程调用结果
- protected RemoteInvocationResult doReadRemoteInvocationResult(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- //获取对象输入流中的对象 Object obj = ois.readObject();
- if (!(obj instanceof RemoteInvocationResult)) { throw new RemoteException("Deserialized object needs to be assignable to type [" +
- RemoteInvocationResult.class.getName() + "]: " + obj); }
- //将获取到的对象封装为RemoteInvocationResult return (RemoteInvocationResult) obj;
- }
7.HTTP调用器的服务器端配置:
和HTTP调用器客户端类似,服务器端也需要进行如下的配置:
[xhtml] view plaincopyprint