6

sudsがWSDLとXSDを期待どおりにキャッシュしていないことは間違いありません。キャッシュされたオブジェクトが使用されていないことを私が知る方法は次のとおりです。

  1. クライアントの作成には約30秒かかります。client = Client(url)
  2. ロガーエントリは、30秒間全体でXSDファイルとWSDLファイルの一貫したダイジェストを示しています
  3. Wiresharkは、30秒間全体でXSDファイルとWSDLファイルを保存しているサーバーへの一貫したTCPトラフィックを示しています
  4. プログラムを実行するたびに、キャッシュ内のファイルが更新されているのがわかります

私は、sudsクライアントを作成し、単一の要求を送信し、応答を取得してから終了する小さなプログラムを持っています。私の期待は、プログラムを実行するたびに、URLからではなく、ファイルキャッシュからWSDLファイルとXSDファイルをフェッチする必要があることです。これが私が思う理由です:

  1. client.options.cache.durationに設定されています('days', 1)
  2. client.options.cache.locationに設定されてc:\docume~1\mlin\locals~1\temp\sudsいると、プログラムを実行するたびにキャッシュファイルが生成および再生成されているのがわかります
  3. しばらくの間、プログラムの実行間でキャッシュが再利用されないのではないかと思いましたが、その場合はファイルキャッシュは使用されないと思います。これは、メモリ内キャッシュで問題がないためです。

sudsキャッシングがどのように機能するのか誤解していますか?

4

1 に答える 1

16

問題はsudsライブラリ自体にあります。cache.pyでは、ObjectCache.get()常に有効なファイルポインターを取得していますが、例外(EOFError)が発生していpickle.load(fp)ます。その場合、ファイルは再度ダウンロードされます。

イベントのシーケンスは次のとおりです。

DocumentReader.open():

  1. http://172.28.50.249/wsdl/billingServices/v3.0/RequestScrubAddress.wsdlを試してみます
  2. ObjectCache51012453のロード-ドキュメント
  3. 漬物を読み込んでいます...
  4. 発生した例外:
  5. キャッシュからNoneを取得しました
  6. ダウンロード中...完了
  7. FileCache51012453を保存しています-ドキュメント...完了

したがって、次に実行したときに同じことが起こるため、新しいキャッシュファイルが保存されているかどうかは実際には問題ではありません。これは、すべての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メーリングリスト(redhat dot comのfedora-suds-list)に送信しました。

于 2011-07-22T18:27:41.830 に答える