2011-05-17 77 views
6

我確定suds沒有緩存我的WSDL和XSD like I expect it to。以下是我知道在不使用緩存對象:Suds不重複使用緩存的WSDL和XSD,但我期望它能夠

  1. 它需要大約30秒來創建一個客戶端:整個30秒
  2. 期間 client = Client(url)
  3. 的記錄條目顯示了XSD和WSDL文件的一致消化
  4. Wireshark是一致顯示TCP流量的服務器在整個30秒內存儲XSD和WSDL文件
  5. 我看到在緩存中的文件被各運行我的程序時更新

我有一個小程序創建一個泡沫客戶端,發送一個請求,獲取響應,然後結束。我的期望是每次運行程序時,它都應該從文件緩存中獲取WSDL和XSD文件,而不是從URL中獲取。這也是爲什麼我認爲:

  1. client.options.cache.duration設置爲('days', 1)
  2. client.options.cache.location設置爲c:\docume~1\mlin\locals~1\temp\suds,我看到正在生成緩存文件,每次我運行程序
  3. 有一刻時重新生成我想,也許緩存是不是一個程序的運行之間重複使用,但我不認爲一個文件緩存將被使用,如果是這樣的話,因爲在內存中緩存會做就好了

我誤解了suds緩存應該如何工作?

+1

當我將WSDL和XSD複製到本地文件系統時,它只需要大約3秒鐘就從這裏加載。考慮到這個Web服務定義的小尺寸,仍然太慢。我有一個Web服務需要2分鐘的時間才能從本地文件系統加載泡沫。您不想知道從網址加載需要多長時間! – 2011-05-18 00:02:27

回答

15

問題在於泡沫庫本身。在cache.py中,儘管ObjectCache.get()總是得到一個有效的文件指針,但它正在執行pickle.load(fp)的異常(EOFError)。當發生這種情況時,該文件只是再次下載。

這裏的事件序列:)

DocumentReader.open(:

  1. 試圖http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdl
  2. 加載ObjectCache 51012453文檔
  3. 加載醃製對象...
  4. 異常提出:
  5. Got無從緩存中
  6. 下載...完成
  7. 保存FileCache 51012453文檔...完成

所以也沒有真正的問題是,新的緩存文件被保存,因爲同樣的事情發生在下次我跑步。這發生在所有的WSDL和XSD文件中。

我通過在讀寫時以二進制模式打開緩存文件解決了這個問題。具體來說,我所做的更改是在緩存中。PY:

1)FileCache.put(),改變這一行:

f = self.open(fn, 'w') 

f = self.open(fn, 'wb') 

2)在FileCache.getf(),改變這一行:

return self.open(fn) 

return self.open(fn, 'rb') 

我不知道該代碼庫不夠好,知道這些變化是安全的,但它是文件緩存拉動對象,服務仍然成功運行,並加載客戶端去從16秒降到2.5秒。如果你問我,會好得多。

希望這個修復,或類似的東西可以引入到泡沫主線。我已經把這個發送到了suds郵件列表(fedora-suds-list at redhat dot com)。

+1

工作就像一個魅力。這個問題對我來說非常令人沮喪。謝謝! – serialworm 2011-09-23 16:57:16

+0

你是否從泡沫開發者那裏得到任何反饋?我找不到您的票... – 2012-08-23 15:31:50

+2

我收到了郵件列表的反饋。我們甚至在BitBucket的一個分支上修復了(自從刪除之後),但是這些修改從未被拉入到項目中。隨意重新提交。按照這裏的電子郵件線程:http://lists.fedoraproject.org/pipermail/suds/2011-July/001481.html – 2012-08-24 17:42:06