repoze.retry
¶
repoze.retry
implements a WSGI middleware filter which intercepts
“retryable” exceptions and retries the WSGI request a configurable
number of times. Such exceptions are normally raised when a conflict is
detected in an optimistic concurrency scheme [1] is configured
for a database such Postgres [2] or ZODB [3] (in ZODB, optimistic
concurrency is always enabled).
If the request cannot be satisfied via retries, the filter re-raises the exception.
Note
If your WSGI pipeline includes the transaction filter provided by
repoze.tm
or repoze.tm2
, the retry filter should come
before it (to the “left”), so that retried requests are first
aborted and then restarted in a new transaction
Configuration via Python¶
Wire up the middleware in your application:
from repoze.retry import Retry
mw = Retry(app, tries=3, retryable=(ValueError, IndexError))
By default, the retryable exception is repoze.retry.ConflictError
.
- If
Zope2
is installed, the default is replaced byZPublisher.Publish.Retry
. - If ZODB is installed, the default is extended to include includes
ZODB.POSException.ConflictError
.
tries
is an integer count, defaulting to 3 times.
Configuration via Paste¶
To use the default configuration, you can just include the filter in your application’s pipeline.
[pipeline:main]
pipeline =
egg:Paste#cgitb
egg:Paste#httpexceptions
egg:repoze.retry#retry
egg:repoze.tm#tm
egg:repoze.vhm#vhm_xheaders
zope2
If you want to override the defaults, e.g. to change the number of retries, or the exceptions which will be retried, configure the filter in a separate section:
[filter:retry]
use = egg:repoze.retry
tries = 2
retryable = mypackage.exceptions:SomeRetryableException
and then use it in your pipeline:
[pipeline:main]
pipeline =
egg:Paste#cgitb
egg:Paste#httpexceptions
retry
myapp
Reporting Bugs / Development Versions¶
The repoze developers hang out in the repoze IRC channel.
Email discussion of the filter’s development takes place on the repoze-dev mailing list.
Visit https://github.com/repoze/repoze.retry/issues to report bugs.
Visit http://github.com/repoze/repoze.retry/ to check out development or tagged versions.