我一直在搜寻Spring 2.5中的org.springframework.remoting.httpinvoker软件包,试图找到一种方法来获得对响应大小的可见性,但是我一直在绕圈.
通过在这里看到的另一个问题,我认为我想做的是在InputStream上获取一个表示服务器响应的句柄,然后将其包装为Apache commons-io CountingInputStream.这样做的最佳方法是什么?
目前,我只希望打印对stdout的响应的大小就满意了,但是最终我希望将其存储在我的应用程序中的知名位置以进行可选显示.
最佳答案
您正在按照正确的思路思考,只需要充实细节即可.振作起来,我要用一堆长长的班级名字打你…
生成与远程服务对话的存根的客户端工厂是HttpInvokerProxyfactorybean.超类(HttpInvokerClientInterceptor)具有一个名为httpInvokerRequestExecutor的属性,该属性默认为SimpleHttpInvokerRequestExecutor的实例.
进行子类化和扩展的时机已经成熟.特别是它具有decorateInputStream方法,可以使用:
public class CountingHttpInvokerRequestExecutor extends SimpleHttpInvokerRequestExecutor {
@Override
protected InputStream decorateInputStream(InputStream is) throws IOException {
return new CountingInputStream(super.decorateInputStream(is));
}
}
然后将其注入代理工厂:
<bean class="org.springframework.remoting.httpinvoker.HttpInvokerProxyfactorybean">
<property name="httpInvokerRequestExecutor">
<bean class="com.mycompany.CountingHttpInvokerRequestExecutor"/>
</property>
<!-- Plus the varIoUs other properties required by HttpInvokerProxyfactorybean -->
<!-- URL,proxy interface,etc -->
</bean>
然后,技巧就变成了掌握这些信息,这需要重新进行创造性的布线.例如,您可以从某个地方的另一个工厂获取CountingInputStream的新实例,然后将字节数公开给您的用户界面.