私はジープを使用しています。私が使用しているサービスは時々タイムアウトエラーを生成します、そして私は自動再試行機能を使いたいです。
Requests再試行セッションを使用しようとしていますが、タイムアウト例外がキャッチされず、再試行が試行されません。
Requests再試行セッション(以下)を設定し、クラスのクライアント属性を設定しました(現在、エラーを発生させるためのタイムアウト値を使用しています)。
session = requests_retry_session()
transport = Transport(session=session,timeout=20,operation_timeout=.001)
self.client = Client(self.wsdl_url,transport=transport)
..。
def requests_retry_session(
retries=10,
backoff_factor=0.3,
status_forcelist=(500, 502, 503, 504),
session=None,
) -> requests.Session:
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
私はrequests.exceptions.ReadTimeoutを取得しています(このエラーは実際に発生しているエラーと同じだと思いますが、タイムアウトが20秒であるため、ロギングはまだ十分ではありません)
例外はセッションによって処理されていません。
何故なの?
編集:zeepはPOSTリクエストをどこかに送信します。これは、私自身のデバッグでは見つかりませんでしたが、リクエストでデバッグログをアクティブにすると表示されます。
デフォルトでは、再試行はPOSTでは機能しません。
https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html
これを変更するためにmethod_whitelist = Falseを設定し、再試行をトリガーしています。
method_whitelist=False
POSTが失敗したときに再試行をトリガーするセット。注意してください; エンドポイントへのPOSTを繰り返すことが悪い考えかどうかを知る必要があります。
リクエストを使用して再試行セッションを設定するコードを次に示します。
from zeep import Client
from zeep.transports import Transport
import requests
from requests.adapters import HTTPAdapter, Retry
def requests_retry_session(
retries=5,
backoff_factor=0.3,
status_forcelist=(500, 502, 503, 504),
session=None,**kwargs) -> requests.Session:
session = session or requests.Session()
retry = Retry(
total=retries,
read=retries,
connect=retries,
backoff_factor=backoff_factor,
status_forcelist=status_forcelist,
**kwargs
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
return session
そして、POSTで再試行するZeepクライアントのインスタンスを作成すると失敗します
session = requests_retry_session(method_whitelist=False)
transport = Transport(session=session,timeout=30,operation_timeout=30)
zeep_client = Client(your_wsdl_url,transport=transport)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加