2010-03-22 44 views
3

我一直在探索Spring 2.5中的org.springframework.remoting.httpinvoker包,試圖找到一種方法來獲得對響應大小的可見性,但我一直在繞圈轉。如何從Spring 2.5 HTTP遠程調用獲取響應的大小?

通過我在這裏看到的另一個問題,我想我要做的是獲得代表服務器響應的InputStream的句柄,然後用Apache commons-io CountingInputStream包裝它。要做到這一點,最好的方法是什麼?

目前,我只想將響應的大小打印到標準輸出,但最終我想將它存儲在我的應用程序中一個衆所周知的位置以供選擇性顯示。

+0

你想在客戶端或服務器上做到這一點嗎? – skaffman 2010-03-22 20:23:49

+0

我想在客戶端上做到這一點理想,但我想客戶端或服務器將工作。我主要感興趣的是看到請求後從服務器返回的總流量 - 如果服務器端比客戶端更容易執行操作,那我也沒問題。 – aarestad 2010-03-22 20:38:12

回答

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的新實例,然後將字節數暴露給您的用戶界面。

+0

嗯,有人一直在搗亂的代碼格式在SO ....不是一個改進... ... – skaffman 2010-03-22 20:38:07

+0

是的,這個「伎倆」是我一直在腦海中繞過的問題的堅果。我試圖通過覆蓋invoke()在重寫的HttpInvokerProxyFactoryBean中獲取它,但由於受保護的方法不能幹淨地做到這一點。 – aarestad 2010-03-22 20:41:37

1

以上是我所需要做的大部分工作,以獲得Input/OutputStreams連線。實際報告涉及覆蓋Commons-io CountingStreams'close()方法的信息的最後一步是簡單報告在該會話期間讀取/寫入的總字節數。我用日誌打印出來,然後我們就去!這樣做的缺點是無法將大小與特定的服務調用進行匹配,但可能會進一步覆蓋SimpleHttpInvokerRequestExecutor可能會增加一些進一步的日誌記錄,但這需要同步記錄發生,這是一個可疑的假設。