【问题标题】:Suds is not reusing cached WSDLs and XSDs, although I expect it toSuds 没有重用缓存的 WSDL 和 XSD,尽管我希望它能够
【发布时间】:2011-05-17 23:15:28
【问题描述】:

我很确定 suds 没有缓存我的 WSDL 和 XSD like I expect it to。以下是我知道没有使用缓存对象的方法:

  1. 创建客户端大约需要30秒:client = Client(url)
  2. 记录器条目显示在整个 30 秒内对 XSD 和 WSDL 文件的一致消化
  3. Wireshark 在整个 30 秒内向存储 XSD 和 WSDL 文件的服务器显示一致的 TCP 流量
  4. 我看到每次运行程序时缓存中的文件都会更新

我有一个小程序,它创建一个 suds 客户端,发送一个请求,获取响应,然后结束。我的期望是每次我运行程序时,它都应该从文件缓存中获取 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 缓存应该如何工作?

【问题讨论】:

  • 当我将此 WSDL 和 XSD 复制到本地文件系统时,从那里加载只需要大约 3 秒。考虑到这个 Web 服务定义的小规模,仍然太慢了。我有一项 Web 服务需要 2 分钟以上才能从本​​地文件系统加载 suds。您不想知道从 URL 加载需要多长时间!

标签: suds


【解决方案1】:

问题出在 suds 库本身。在 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-document
  3. 正在加载腌制对象...
  4. 引发异常:
  5. 没有从缓存中获取
  6. 正在下载...完成
  7. 正在保存 FileCache 51012453-document... 完成

所以保存新的缓存文件并不重要,因为下次运行时会发生同样的事情。所有 WSDL 和 XSD 文件都会发生这种情况。

我通过在读写时以二进制模式打开缓存文件来解决这个问题。具体来说,我所做的更改是在 cache.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 主线中。我已经将它发送到 suds 邮件列表(redhat dot com 上的 fedora-suds-list)。

【讨论】:

  • 工作就像一个魅力。这个问题让我非常沮丧。谢谢!
  • 您是否从 suds 开发人员那里得到任何反馈?我找不到你的票...
  • 我从邮件列表中得到了反馈。我们甚至在 BitBucket 的一个分支中进行了修复(后来被删除),但这些更改从未被拉入项目中。随时重新提交。在此处关注电子邮件线程:lists.fedoraproject.org/pipermail/suds/2011-July/001481.html
  • 太好了,我在调试一个小时后找到了你的答案,我自己也得出了完全相同的结论。 ;) 不认真,谢谢!
  • 我还把它放到了我维护的 suds fork 中,并带有一些我需要的补丁:github.com/hheimbuerger/suds-gzip
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多