6
6
7
7
context = zmq .Context ()
8
8
POLL_MS = 1000
9
+ MAX_SKIPS = 150
9
10
MAX_POLLS = 5
10
11
12
+
11
13
class ZMQListener (object ):
12
14
def __init__ (self , remoteAddress , onMessage , encoding , consumerType ):
13
15
self ._encoding = encoding
@@ -18,6 +20,8 @@ def __init__(self, remoteAddress, onMessage, encoding, consumerType):
18
20
self ._pollTimeoutCount = 0
19
21
self ._remoteAddress = remoteAddress
20
22
self ._worker = self ._worker_socket (remoteAddress )
23
+ self ._numberOfNoMsg = 0
24
+ self ._numberOfTimesSkipped = 0
21
25
22
26
def _worker_socket (self , remoteAddress ):
23
27
"""Helper function that returns a new configured socket
@@ -43,24 +47,26 @@ def fetch(self):
43
47
if (self ._active is False ):
44
48
time .sleep (0.2 )
45
49
return
46
-
47
- if (self ._pollTimeoutCount == MAX_POLLS ):
48
- log .warning ('ZMQListener poll timeout reached' )
49
- self ._pollTimeoutCount = 0
50
- self ._worker .close ()
51
- self ._worker = self ._worker_socket (self ._remoteAddress )
52
-
53
- if (self ._pollTimeoutCount > 0 ):
50
+ skip = self ._numberOfTimesSkipped < MAX_SKIPS and self ._numberOfNoMsg > 0
51
+ if not skip :
52
+ self ._numberOfTimesSkipped = 0
53
+ if (self ._pollTimeoutCount == MAX_POLLS ):
54
+ log .warning ('ZMQListener poll timeout reached' )
55
+ self ._pollTimeoutCount = 0
56
+ self ._worker .close ()
57
+ self ._worker = self ._worker_socket (self ._remoteAddress )
58
+ if (self ._pollTimeoutCount > 0 ):
59
+ self ._readMessage ()
60
+ return
61
+ self ._send (signals .PPP_READY )
54
62
self ._readMessage ()
55
- return
56
-
57
- self ._send (signals .PPP_READY )
58
- self ._readMessage ()
59
-
63
+ else :
64
+ time .sleep (0.01 )
65
+ self ._numberOfTimesSkipped += 1
60
66
except Exception as e :
61
67
log .error ('ZMQListener.fetch {e}' , e = str (e ))
62
68
finally :
63
- if (self ._active is False ):
69
+ if (self ._active is False ):
64
70
self ._working = False
65
71
66
72
def _readMessage (self , timeout = POLL_MS ):
@@ -75,7 +81,9 @@ def _readMessage(self, timeout=POLL_MS):
75
81
hasMsg = True
76
82
msgResult = self ._handleAMessage (frames )
77
83
self ._send (signals .PPP_DONE , msgResult )
84
+ self ._numberOfNoMsg = 0
78
85
else :
86
+ self ._numberOfNoMsg += 1
79
87
time .sleep (0.005 )
80
88
else :
81
89
self ._pollTimeoutCount += 1
0 commit comments