The Autobahn guys still show ReconnectingClientFactory in their docs,
Where did you find that? That would be a doc bug, but in the _docs_,
there is no reference to ReconnectingClientFactory
(cpy372_3) oberstet@intel-nuci7:~$ find
~/scm/crossbario/autobahn-python/docs/ -type f -exec grep -Hi
"ReconnectingClientFactory" {} \;
(cpy372_3) oberstet@intel-nuci7:~$
We do have some example code using ReconnectingClientFactory though:
(cpy372_3) oberstet@intel-nuci7:~$ find
~/scm/crossbario/autobahn-python/examples/ -type f -exec grep -Hi
"ReconnectingClientFactory" {} \; | wc -l
8
and I remember looking at this before and ending up going with
ReconnectingClientFactory because it works and didn't look like it'd
need much effort to integrated into an existing code base.
Let me count the ways.
1. ReconnectingClientFactory is destined for deprecation, eventually.
You should just adopt the "new" thing now so that if we get more
energy to cycle the APIs and delete the old stuff, you'll have less
hassle to deal with. ("New" is in quotes here since it's been
around for well over 3 years at this point; Autobahn should update
too, not just you.)
Autobahn will automatically use
twisted.application.internet.ClientService
for auto-reconnect when on Twisted 16.1.0+
https://github.com/crossbario/autobahn-python/blob/master/autobahn/twisted/wamp.py#L349
2. ClientService works with endpoints, which means you can use it with
/any/ kind of transport, like SSH transports, subprocesses, etc.
Most practically, it works with HostnameEndpoint which is a much
better way to get TLS than connectSSL; ReconnectingClientFactory
works, kind of accidentally, with TLS since connectSSL is on the
reactor, but it won't use happy eyeballs and it won't connect over
IPv6, so connections will be slower and less reliable.
3. Conceptually, ClientService has a much clearer and more useful
responsibility: its job is to /maintain a state/ (i.e.: that there
is a single connection, that it is connected) rather than to /do a
thing/. For example,
1. if you want to shut down a ReconnectingClientFactory:
1. you have to call stopTrying, then uh...
2. find the last protocol it built with buildProtocol, then
3. grab its transport (hope it's saving that transport as
'.transport', because it doesn't actually have to)
4. call loseConnection
5. remember to trap connectionLost so you can see when its done.
2. if you want to shut down a ClientService
1. call stopService
2. wait for the Deferred that it returned to fire
4. ClientService is (mostly) implemented using composition rather than
inheritance, so much less of the guts of the internal implementation
is hanging around where you might accidentally twiddle it and break
its assumptions, so you can trust its guarantees more.
++1
(note: Autobahn is a culprit to the overuse of inheritance vs
composition too .. but the so-called "new API" (for WAMP) is following
composition + observer pattern, while the "old API" (that is inheriting
from ApplicationSession) is still pretty much around. we have some
legacy already ..)
1. other benefits of composition: you don't have to override
attributes of your Protocol and thereby indulge in subclassing
yourself to get notifications; consider 'prepareConnection',
'whenConnected'.
2. the retry policy mechanics are better documented and much easier
to customize
3. it's backed by a formal state machine - not that I'm aware of
any specific bugs in ReconnectingClientFactory but do you think
it got /all/ of these state transitions correct:
https://gist.github.com/glyph/614be03151556333efe04b849fa05930
5. It's more testable because it just takes its clock and reactor as
constructor parameters, rather than requiring post-hoc
poorly-documented attribute patching to become testable.
Hopefully at least some of this is convincing :)
all and each of them is convincing;)
-g
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
--
Tobias Oberstein - phone +49 176 2375 2055 - tobias.oberst...@crossbario.com
Crossbar.io GmbH - Waldstrasse 18 - 91054 Erlangen
HRB 15870 - Amtsgericht Fuerth - Geschäftsfuehrer/CEO - Tobias Oberstein
https://crossbar.io
https://crossbario.com
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python