3

我一直org.springframework.remoting.httpinvoker在 Spring 2.5 中寻找包,试图找到一种方法来了解响应的大小,但我一直在绕圈子。

通过我在这里看到的另一个问题,我想我想做的是获取InputStream代表来自服务器的响应的句柄,然后用 Apache commons-io 包装它CountingInputStream。这样做的最佳方法是什么?

目前,我很乐意将响应的大小打印到标准输出,但最终我想将它存储在我的应用程序中一个众所周知的位置以供可选显示。

4

2 回答 2

2

你的思路是正确的,它只需要用细节来充实。振作起来,我要用一堆长的类名来打击你……

生成与远程服务对话的存根的客户端工厂是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然后将字节数暴露给您的用户界面。

于 2010-03-22T20:34:26.817 回答
1

以上是我连接 Input/OutputStreams 所需要做的大部分工作。实际报告信息的最后一步涉及覆盖 commons-io CountingStreams 的close()方法,以简单地报告该会话期间读取/写入的总字节数。我使用日志将其打印出来,然后就可以了!这样做的缺点是无法将大小与特定的服务调用相匹配,但也许一些进一步的覆盖SimpleHttpInvokerRequestExecutor可能会添加一些进一步的日志记录,尽管这需要同步发生日志记录,这是一个可疑的假设。

于 2010-05-18T15:48:38.893 回答