aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--_sources/protocol.txt118
-rw-r--r--_static/pygments.css2
-rw-r--r--api.html2
-rw-r--r--client.html2
-rw-r--r--client/messages.html27
-rw-r--r--contributing.html2
-rw-r--r--exceptions.html8
-rw-r--r--genindex.html39
-rw-r--r--index.html2
-rw-r--r--jobmanager.html30
-rw-r--r--objects.invbin1369 -> 1419 bytes
-rw-r--r--poller.html2
-rw-r--r--protocol.html275
-rw-r--r--py-modindex.html2
-rw-r--r--receiver.html2
-rw-r--r--router.html37
-rw-r--r--search.html2
-rw-r--r--searchindex.js2
-rw-r--r--sender.html2
-rw-r--r--settings_file.html2
-rw-r--r--using.html2
-rw-r--r--utils/classes.html2
-rw-r--r--utils/devices.html2
-rw-r--r--utils/index.html2
-rw-r--r--utils/messages.html2
-rw-r--r--utils/settings.html2
-rw-r--r--utils/timeutils.html2
27 files changed, 363 insertions, 209 deletions
diff --git a/_sources/protocol.txt b/_sources/protocol.txt
index c341403..44544d6 100644
--- a/_sources/protocol.txt
+++ b/_sources/protocol.txt
@@ -5,12 +5,12 @@ EventMQ Protocol Specification
5 5
6Goals 6Goals
7===== 7=====
8The EventMQ Protocol (eMQP) defines a reliable service-oriented request-reply and pub-sub dialog between a set of clients, a broker, and a set of workers. This goal is to 8The EventMQ Protocol (eMQP) defines a reliable service-oriented request-reply and pub-sub dialog between a set of clients, a broker, and a set of workers.
9 9
10The goals are to: 10The goals are to:
11 11
12 * Specify a protocol to follow when implementing a component to EventMQ. 12 * Specify a protocol to follow when implementing a component to EventMQ.
13 * Allow requests to be routed to workers by an abstracted service name. 13 * Allow requests to be routed to workers by an abstracted service name (named queues).
14 * Detect disconnected peers through heartbeating. 14 * Detect disconnected peers through heartbeating.
15 * Allow for message tracing and debugging. 15 * Allow for message tracing and debugging.
16 16
@@ -60,6 +60,52 @@ FRAME Value Description
604 _MSGID_ The message id of the message this ACK is acknowledging 604 _MSGID_ The message id of the message this ACK is acknowledging
61====== ============== =========== 61====== ============== ===========
62 62
63A **REPLY** frame consists of a 5-frame multipart message, formatted as follows.
64
65====== ============== ===========
66FRAME Value Description
67====== ============== ===========
680 _EMPTY_ leave empty
691 eMQP/1.0 Protocol version
702 REPLY command
713 _MSGID_ A unique id for the msg
724 _MSG_ The reply to respond with
73====== ============== ===========
74
75A **HEARTBEAT** frame consists of a
76
77====== ============== ===========
78FRAME Value Description
79====== ============== ===========
800 _EMPTY_ leave empty
811 eMQP/1.0 Protocol version
822 HEARTBEAT command
833 _MSGID_ A unique id for the msg
844 _UNIX_TS_ A unix timestamp
85====== ============== ===========
86
87A **DISCONNECT** frame consists of
88
89====== ============== ===========
90FRAME Value Description
91====== ============== ===========
920 _EMPTY_ leave empty
931 eMQP/1.0 Protocol version
942 DISCONNECT command
953 _MSGID_ A unique id for the msg
96====== ============== ===========
97
98A **KBAI** frame consists of
99
100====== ============== ===========
101FRAME Value Description
102====== ============== ===========
1030 _EMPTY_ leave empty
1041 eMQP/1.0 Protocol version
1052 KBAI command
1063 _MSGID_ A unique id for the msg
107====== ============== ===========
108
63eMQP / Client 109eMQP / Client
64------------- 110-------------
65A **REQUEST** command consists of a 7-frame multipart message, formatted as follows. 111A **REQUEST** command consists of a 7-frame multipart message, formatted as follows.
@@ -159,44 +205,9 @@ FRAME Value Description
1593 _MSGID_ A unique id for the msg 2053 _MSGID_ A unique id for the msg
160====== ============== =========== 206====== ============== ===========
161 207
162A **REPLY** frame consists of a 5-frame multipart message, formatted as follows.
163
164====== ============== ===========
165FRAME Value Description
166====== ============== ===========
1670 _EMPTY_ leave empty
1681 eMQP/1.0 Protocol version
1692 REPLY command
1703 _MSGID_ A unique id for the msg
1714 _MSG_ The reply to respond with
172====== ============== ===========
173
174A **HEARTBEAT** frame consists of a
175
176====== ============== ===========
177FRAME Value Description
178====== ============== ===========
1790 _EMPTY_ leave empty
1801 eMQP/1.0 Protocol version
1812 HEARTBEAT command
1823 _MSGID_ A unique id for the msg
1834 _UNIX_TS_ A unix timestamp
184====== ============== ===========
185
186A **DISCONNECT** frame consists of
187
188====== ============== ===========
189FRAME Value Description
190====== ============== ===========
1910 _EMPTY_ leave empty
1921 eMQP/1.0 Protocol version
1932 DISCONNECT command
1943 _MSGID_ A unique id for the msg
195====== ============== ===========
196
197Heartbeating 208Heartbeating
198------------ 209------------
199 * HEARTBEAT commands are valid at any time after an INFORM command 210 * HEARTBEAT commands are valid at any time after an INFORM command.
200 * Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands. 211 * Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands.
201 * Worker and broker MUST send heartbeats at regular and agreed-upon intervals. 212 * Worker and broker MUST send heartbeats at regular and agreed-upon intervals.
202 * Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals. 213 * Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals.
@@ -204,16 +215,29 @@ Heartbeating
204 * If the broker detects that a worker has disconnected it should stop sending it a message of any type. 215 * If the broker detects that a worker has disconnected it should stop sending it a message of any type.
205 * If the scheduler detects that the broker disconnects it SHOULD restart the conversation. 216 * If the scheduler detects that the broker disconnects it SHOULD restart the conversation.
206 217
207REQUEST Headers 218Headers
208--------------- 219---------------
209Headers MUST be 0 to many comma seperated values inserted into the header field. If there are no headers required, send an empty string MUST be sent where headers are required. 220Headers MUST be 0 to many comma seperated values inserted into the header field. If there are no headers required, an empty string MUST be sent where headers are required.
210 221
211Below is a table which defines and describes the headers. 222Below is a table which defines and describes the headers.
212 223
213=============== ======= ======= ======= =========== 224
214Header REQUEST PUBLISH Default Description 225================= ======= ======= ======== ======= ===========
215=============== ======= ======= ======= =========== 226Header REQUEST PUBLISH SCHEDULE Default Description
216reply-requested X False Once the job is finished, send a reply back with information from the job. If there is no information reply with a True value. 227================= ======= ======= ======== ======= ===========
217retry-count:# X 0 Retry a failed job this many times before accepting defeat. 228reply-requested X False Once the job is finished, send a reply back with information from the job. If there is no information reply with a True value.
218guarantee X False Ensure the job completes by letting someone else worry about a success reply. 229retry-count:# X 0 Retry a failed job this many times before accepting defeat.
219=============== ======= ======= ======= =========== 230guarantee X False Ensure the job completes by letting someone else worry about a success reply.
231nohaste X False When scheduling a job, set this to True if you don't want the job to run immediately as it's scheduled. Instead, it will run for the first time when the interval has elapsed.
232================= ======= ======= ======== ======= ===========
233
234DISCONNECT and KBAI
235===================
236When a component receives a DISCONNECT command it:
237 * MUST send a KBAI command to all connected components.
238 * MUST stop sending and receiving any messages
239 * MUST allow any pending messages or jobs to complete.
240
241When a component receives a KBAI command it:
242 * MUST stop sending any messages to the disconnecting component.
243 * SHOULD Clean up references to the disconnecting component.
diff --git a/_static/pygments.css b/_static/pygments.css
index 57eadc0..8213e90 100644
--- a/_static/pygments.css
+++ b/_static/pygments.css
@@ -4,8 +4,10 @@
4.highlight .err { border: 1px solid #FF0000 } /* Error */ 4.highlight .err { border: 1px solid #FF0000 } /* Error */
5.highlight .k { color: #007020; font-weight: bold } /* Keyword */ 5.highlight .k { color: #007020; font-weight: bold } /* Keyword */
6.highlight .o { color: #666666 } /* Operator */ 6.highlight .o { color: #666666 } /* Operator */
7.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
7.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ 8.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
8.highlight .cp { color: #007020 } /* Comment.Preproc */ 9.highlight .cp { color: #007020 } /* Comment.Preproc */
10.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
9.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ 11.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
10.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ 12.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
11.highlight .gd { color: #A00000 } /* Generic.Deleted */ 13.highlight .gd { color: #A00000 } /* Generic.Deleted */
diff --git a/api.html b/api.html
index 03dcd6d..3e45b93 100644
--- a/api.html
+++ b/api.html
@@ -60,7 +60,7 @@
60 60
61 61
62 <div class="version"> 62 <div class="version">
63 0.2.1 63 0.2.6.2
64 </div> 64 </div>
65 65
66 66
diff --git a/client.html b/client.html
index 86c2456..dab0af9 100644
--- a/client.html
+++ b/client.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/client/messages.html b/client/messages.html
index fa76d2a..b59cf18 100644
--- a/client/messages.html
+++ b/client/messages.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
@@ -150,27 +150,8 @@
150 <span class="target" id="module-eventmq.client.messages"></span><div class="section" id="messages-client-messaging"> 150 <span class="target" id="module-eventmq.client.messages"></span><div class="section" id="messages-client-messaging">
151<h1><code class="xref py py-mod docutils literal"><span class="pre">messages</span></code> &#8211; Client Messaging<a class="headerlink" href="#messages-client-messaging" title="Permalink to this headline">¶</a></h1> 151<h1><code class="xref py py-mod docutils literal"><span class="pre">messages</span></code> &#8211; Client Messaging<a class="headerlink" href="#messages-client-messaging" title="Permalink to this headline">¶</a></h1>
152<dl class="function"> 152<dl class="function">
153<dt id="eventmq.client.messages.build_module_path">
154<code class="descclassname">eventmq.client.messages.</code><code class="descname">build_module_path</code><span class="sig-paren">(</span><em>func</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.client.messages.build_module_path" title="Permalink to this definition">¶</a></dt>
155<dd><p>Builds the module path in string format for a callable.</p>
156<table class="docutils field-list" frame="void" rules="none">
157<col class="field-name" />
158<col class="field-body" />
159<tbody valign="top">
160<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>func</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#callable" title="(in Python v2.7)"><em>callable</em></a>) &#8211; The function or method to build the path for</td>
161</tr>
162<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">(import path (w/ class seperated by a &#8216;:&#8217;), callable name) or
163(None, None) on error</td>
164</tr>
165<tr class="field-odd field"><th class="field-name">Return type:</th><td class="field-body"><a class="reference external" href="https://docs.python.org/library/functions.html#list" title="(in Python v2.7)">list</a></td>
166</tr>
167</tbody>
168</table>
169</dd></dl>
170
171<dl class="function">
172<dt id="eventmq.client.messages.defer_job"> 153<dt id="eventmq.client.messages.defer_job">
173<code class="descclassname">eventmq.client.messages.</code><code class="descname">defer_job</code><span class="sig-paren">(</span><em>socket</em>, <em>func</em>, <em>args=()</em>, <em>kwargs=None</em>, <em>class_args=()</em>, <em>class_kwargs=None</em>, <em>reply_requested=False</em>, <em>guarantee=False</em>, <em>retry_count=0</em>, <em>queue='default'</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.client.messages.defer_job" title="Permalink to this definition">¶</a></dt> 154<code class="descclassname">eventmq.client.messages.</code><code class="descname">defer_job</code><span class="sig-paren">(</span><em>socket</em>, <em>func</em>, <em>args=()</em>, <em>kwargs=None</em>, <em>class_args=()</em>, <em>class_kwargs=None</em>, <em>reply_requested=False</em>, <em>guarantee=False</em>, <em>retry_count=0</em>, <em>debounce_secs=False</em>, <em>queue='default'</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.client.messages.defer_job" title="Permalink to this definition">¶</a></dt>
174<dd><p>Used to send a job to a worker to execute via <cite>socket</cite>.</p> 155<dd><p>Used to send a job to a worker to execute via <cite>socket</cite>.</p>
175<p>This tries not to raise any exceptions so use some of the message flags to 156<p>This tries not to raise any exceptions so use some of the message flags to
176guarentee things.</p> 157guarentee things.</p>
@@ -188,11 +169,11 @@ initializing (if applicable).</li>
188<li><strong>class_kwargs</strong> (<a class="reference external" href="https://docs.python.org/library/stdtypes.html#dict" title="(in Python v2.7)"><em>dict</em></a>) &#8211; dict of <a href="#id7"><span class="problematic" id="id8">**</span></a>kwargs to pass to the class when 169<li><strong>class_kwargs</strong> (<a class="reference external" href="https://docs.python.org/library/stdtypes.html#dict" title="(in Python v2.7)"><em>dict</em></a>) &#8211; dict of <a href="#id7"><span class="problematic" id="id8">**</span></a>kwargs to pass to the class when
189initializing (if applicable).</li> 170initializing (if applicable).</li>
190<li><strong>reply_requested</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#bool" title="(in Python v2.7)"><em>bool</em></a>) &#8211; request the return value of func as a reply</li> 171<li><strong>reply_requested</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#bool" title="(in Python v2.7)"><em>bool</em></a>) &#8211; request the return value of func as a reply</li>
191<li><strong>guarantee</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#bool" title="(in Python v2.7)"><em>bool</em></a>) &#8211; (Give your best effort) to guarantee that func is
192executed. Exceptions and things will be logged.</li>
193<li><strong>retry_count</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#int" title="(in Python v2.7)"><em>int</em></a>) &#8211; How many times should be retried when encountering 172<li><strong>retry_count</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#int" title="(in Python v2.7)"><em>int</em></a>) &#8211; How many times should be retried when encountering
194an Exception or some other failure before giving up. (default: 0 173an Exception or some other failure before giving up. (default: 0
195or immediately fail)</li> 174or immediately fail)</li>
175<li><strong>debounce_secs</strong> (<em>secs</em>) &#8211; Number of seconds to debounce the job. See
176<cite>debounce_deferred_job</cite> for more information.</li>
196<li><strong>queue</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; Name of queue to use when executing the job. If this value 177<li><strong>queue</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; Name of queue to use when executing the job. If this value
197evaluates to False, the default is used. Default: is configured 178evaluates to False, the default is used. Default: is configured
198default queue name</li> 179default queue name</li>
diff --git a/contributing.html b/contributing.html
index 205bd46..45ee99e 100644
--- a/contributing.html
+++ b/contributing.html
@@ -60,7 +60,7 @@
60 60
61 61
62 <div class="version"> 62 <div class="version">
63 0.2.1 63 0.2.6.2
64 </div> 64 </div>
65 65
66 66
diff --git a/exceptions.html b/exceptions.html
index 4f94f7f..b3a9914 100644
--- a/exceptions.html
+++ b/exceptions.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
@@ -147,6 +147,12 @@
147<p>These are the exceptions that are raised by EventMQ. All exceptions should 147<p>These are the exceptions that are raised by EventMQ. All exceptions should
148be subclasses of <a class="reference internal" href="#eventmq.exceptions.EventMQError" title="eventmq.exceptions.EventMQError"><code class="xref py py-class docutils literal"><span class="pre">EventMQError</span></code></a></p> 148be subclasses of <a class="reference internal" href="#eventmq.exceptions.EventMQError" title="eventmq.exceptions.EventMQError"><code class="xref py py-class docutils literal"><span class="pre">EventMQError</span></code></a></p>
149<dl class="exception"> 149<dl class="exception">
150<dt id="eventmq.exceptions.CallableFromPathError">
151<em class="property">exception </em><code class="descclassname">eventmq.exceptions.</code><code class="descname">CallableFromPathError</code><a class="headerlink" href="#eventmq.exceptions.CallableFromPathError" title="Permalink to this definition">¶</a></dt>
152<dd><p>Raised when construction of a callable from a path and callable_name fails.</p>
153</dd></dl>
154
155<dl class="exception">
150<dt id="eventmq.exceptions.EventMQError"> 156<dt id="eventmq.exceptions.EventMQError">
151<em class="property">exception </em><code class="descclassname">eventmq.exceptions.</code><code class="descname">EventMQError</code><a class="headerlink" href="#eventmq.exceptions.EventMQError" title="Permalink to this definition">¶</a></dt> 157<em class="property">exception </em><code class="descclassname">eventmq.exceptions.</code><code class="descname">EventMQError</code><a class="headerlink" href="#eventmq.exceptions.EventMQError" title="Permalink to this definition">¶</a></dt>
152<dd><p>All exceptions raised by EventMQ inherit from this base exception.</p> 158<dd><p>All exceptions raised by EventMQ inherit from this base exception.</p>
diff --git a/genindex.html b/genindex.html
index dbfbf25..6bd3f7f 100644
--- a/genindex.html
+++ b/genindex.html
@@ -59,7 +59,7 @@
59 59
60 60
61 <div class="version"> 61 <div class="version">
62 0.2.1 62 0.2.6.2
63 </div> 63 </div>
64 64
65 65
@@ -132,7 +132,6 @@
132<div class="genindex-jumpbox"> 132<div class="genindex-jumpbox">
133 <a href="#_"><strong>_</strong></a> 133 <a href="#_"><strong>_</strong></a>
134 | <a href="#A"><strong>A</strong></a> 134 | <a href="#A"><strong>A</strong></a>
135 | <a href="#B"><strong>B</strong></a>
136 | <a href="#C"><strong>C</strong></a> 135 | <a href="#C"><strong>C</strong></a>
137 | <a href="#D"><strong>D</strong></a> 136 | <a href="#D"><strong>D</strong></a>
138 | <a href="#E"><strong>E</strong></a> 137 | <a href="#E"><strong>E</strong></a>
@@ -243,19 +242,13 @@
243 </dl></td> 242 </dl></td>
244</tr></table> 243</tr></table>
245 244
246<h2 id="B">B</h2> 245<h2 id="C">C</h2>
247<table style="width: 100%" class="indextable genindextable"><tr> 246<table style="width: 100%" class="indextable genindextable"><tr>
248 <td style="width: 33%" valign="top"><dl> 247 <td style="width: 33%" valign="top"><dl>
249 248
250 <dt><a href="client/messages.html#eventmq.client.messages.build_module_path">build_module_path() (in module eventmq.client.messages)</a> 249 <dt><a href="exceptions.html#eventmq.exceptions.CallableFromPathError">CallableFromPathError</a>
251 </dt> 250 </dt>
252 251
253 </dl></td>
254</tr></table>
255
256<h2 id="C">C</h2>
257<table style="width: 100%" class="indextable genindextable"><tr>
258 <td style="width: 33%" valign="top"><dl>
259 252
260 <dt><a href="router.html#eventmq.router.Router.clean_up_dead_schedulers">clean_up_dead_schedulers() (eventmq.router.Router method)</a> 253 <dt><a href="router.html#eventmq.router.Router.clean_up_dead_schedulers">clean_up_dead_schedulers() (eventmq.router.Router method)</a>
261 </dt> 254 </dt>
@@ -400,6 +393,10 @@
400 <dt><a href="router.html#eventmq.router.Router.get_available_worker">get_available_worker() (eventmq.router.Router method)</a> 393 <dt><a href="router.html#eventmq.router.Router.get_available_worker">get_available_worker() (eventmq.router.Router method)</a>
401 </dt> 394 </dt>
402 395
396
397 <dt><a href="router.html#eventmq.router.Router.get_status">get_status() (eventmq.router.Router method)</a>
398 </dt>
399
403 </dl></td> 400 </dl></td>
404</tr></table> 401</tr></table>
405 402
@@ -457,6 +454,10 @@
457<table style="width: 100%" class="indextable genindextable"><tr> 454<table style="width: 100%" class="indextable genindextable"><tr>
458 <td style="width: 33%" valign="top"><dl> 455 <td style="width: 33%" valign="top"><dl>
459 456
457 <dt><a href="router.html#eventmq.router.Router.job_latencies">job_latencies (eventmq.router.Router attribute)</a>
458 </dt>
459
460
460 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager">JobManager (class in eventmq.jobmanager)</a> 461 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager">JobManager (class in eventmq.jobmanager)</a>
461 </dt> 462 </dt>
462 463
@@ -492,10 +493,14 @@
492 <dt><a href="exceptions.html#eventmq.exceptions.MessageError">MessageError</a> 493 <dt><a href="exceptions.html#eventmq.exceptions.MessageError">MessageError</a>
493 </dt> 494 </dt>
494 495
496
497 <dt><a href="utils/timeutils.html#eventmq.utils.timeutils.monotonic">monotonic() (in module eventmq.utils.timeutils)</a>
498 </dt>
499
495 </dl></td> 500 </dl></td>
496 <td style="width: 33%" valign="top"><dl> 501 <td style="width: 33%" valign="top"><dl>
497 502
498 <dt><a href="utils/timeutils.html#eventmq.utils.timeutils.monotonic">monotonic() (in module eventmq.utils.timeutils)</a> 503 <dt><a href="jobmanager.html#eventmq.jobmanager.mp_init">mp_init() (in module eventmq.jobmanager)</a>
499 </dt> 504 </dt>
500 505
501 </dl></td> 506 </dl></td>
@@ -535,6 +540,10 @@
535 </dt> 540 </dt>
536 541
537 542
543 <dt><a href="router.html#eventmq.router.Router.on_disconnect">on_disconnect() (eventmq.router.Router method)</a>
544 </dt>
545
546
538 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager.on_heartbeat">on_heartbeat() (eventmq.jobmanager.JobManager method)</a> 547 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager.on_heartbeat">on_heartbeat() (eventmq.jobmanager.JobManager method)</a>
539 </dt> 548 </dt>
540 549
@@ -555,6 +564,10 @@
555 </dt> 564 </dt>
556 565
557 566
567 <dt><a href="router.html#eventmq.router.Router.on_reply">on_reply() (eventmq.router.Router method)</a>
568 </dt>
569
570
558 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager.on_request">on_request() (eventmq.jobmanager.JobManager method)</a> 571 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager.on_request">on_request() (eventmq.jobmanager.JobManager method)</a>
559 </dt> 572 </dt>
560 573
@@ -775,6 +788,10 @@
775 </dt> 788 </dt>
776 789
777 790
791 <dt><a href="jobmanager.html#eventmq.jobmanager.JobManager.send_reply">send_reply() (eventmq.jobmanager.JobManager method)</a>
792 </dt>
793
794
778 <dt><a href="client/messages.html#eventmq.client.messages.send_request">send_request() (in module eventmq.client.messages)</a> 795 <dt><a href="client/messages.html#eventmq.client.messages.send_request">send_request() (in module eventmq.client.messages)</a>
779 </dt> 796 </dt>
780 797
diff --git a/index.html b/index.html
index 738c479..f401403 100644
--- a/index.html
+++ b/index.html
@@ -59,7 +59,7 @@
59 59
60 60
61 <div class="version"> 61 <div class="version">
62 0.2.1 62 0.2.6.2
63 </div> 63 </div>
64 64
65 65
diff --git a/jobmanager.html b/jobmanager.html
index aa262fa..7712021 100644
--- a/jobmanager.html
+++ b/jobmanager.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
@@ -263,6 +263,34 @@ of work.</p>
263for another REQUEST message.</p> 263for another REQUEST message.</p>
264</dd></dl> 264</dd></dl>
265 265
266<dl class="method">
267<dt id="eventmq.jobmanager.JobManager.send_reply">
268<code class="descname">send_reply</code><span class="sig-paren">(</span><em>res</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.jobmanager.JobManager.send_reply" title="Permalink to this definition">¶</a></dt>
269<dd><p>Sends an REPLY response</p>
270<table class="docutils field-list" frame="void" rules="none">
271<col class="field-name" />
272<col class="field-body" />
273<tbody valign="top">
274<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
275<li><strong>socket</strong> (<a class="reference external" href="https://docs.python.org/library/socket.html#module-socket" title="(in Python v2.7)"><em>socket</em></a>) &#8211; The socket to use for this ack</li>
276<li><strong>recipient</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; The recipient id for the ack</li>
277<li><strong>msgid</strong> &#8211; The unique id that we are acknowledging</li>
278</ul>
279</td>
280</tr>
281</tbody>
282</table>
283</dd></dl>
284
285</dd></dl>
286
287<dl class="function">
288<dt id="eventmq.jobmanager.mp_init">
289<code class="descclassname">eventmq.jobmanager.</code><code class="descname">mp_init</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.jobmanager.mp_init" title="Permalink to this definition">¶</a></dt>
290<dd><p>The instance of Context is copied when python multiprocessing fork()s the
291worker processes, so we need to terminate that Context so a new one can be
292rebuilt. Without doing this, messages sent from functions in those child
293processes will never be delivered.</p>
266</dd></dl> 294</dd></dl>
267 295
268</div> 296</div>
diff --git a/objects.inv b/objects.inv
index ac41242..79ff0a4 100644
--- a/objects.inv
+++ b/objects.inv
Binary files differ
diff --git a/poller.html b/poller.html
index 60e660e..4d406ae 100644
--- a/poller.html
+++ b/poller.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/protocol.html b/protocol.html
index 274f8d1..828731e 100644
--- a/protocol.html
+++ b/protocol.html
@@ -60,7 +60,7 @@
60 60
61 61
62 <div class="version"> 62 <div class="version">
63 0.2.1 63 0.2.6.2
64 </div> 64 </div>
65 65
66 66
@@ -97,9 +97,10 @@
97<li class="toctree-l4"><a class="reference internal" href="#emqp-scheduler">eMQP / Scheduler</a></li> 97<li class="toctree-l4"><a class="reference internal" href="#emqp-scheduler">eMQP / Scheduler</a></li>
98<li class="toctree-l4"><a class="reference internal" href="#emqp-worker">eMQP / Worker</a></li> 98<li class="toctree-l4"><a class="reference internal" href="#emqp-worker">eMQP / Worker</a></li>
99<li class="toctree-l4"><a class="reference internal" href="#heartbeating">Heartbeating</a></li> 99<li class="toctree-l4"><a class="reference internal" href="#heartbeating">Heartbeating</a></li>
100<li class="toctree-l4"><a class="reference internal" href="#request-headers">REQUEST Headers</a></li> 100<li class="toctree-l4"><a class="reference internal" href="#headers">Headers</a></li>
101</ul> 101</ul>
102</li> 102</li>
103<li class="toctree-l3"><a class="reference internal" href="#disconnect-and-kbai">DISCONNECT and KBAI</a></li>
103</ul> 104</ul>
104</li> 105</li>
105<li class="toctree-l2"><a class="reference external" href="https://github.com/enderlabs/eventmq">Source Code</a></li> 106<li class="toctree-l2"><a class="reference external" href="https://github.com/enderlabs/eventmq">Source Code</a></li>
@@ -157,12 +158,12 @@
157<p><em>The status of this document is alpha and subject to heavy change</em></p> 158<p><em>The status of this document is alpha and subject to heavy change</em></p>
158<div class="section" id="goals"> 159<div class="section" id="goals">
159<h2>Goals<a class="headerlink" href="#goals" title="Permalink to this headline">¶</a></h2> 160<h2>Goals<a class="headerlink" href="#goals" title="Permalink to this headline">¶</a></h2>
160<p>The EventMQ Protocol (eMQP) defines a reliable service-oriented request-reply and pub-sub dialog between a set of clients, a broker, and a set of workers. This goal is to</p> 161<p>The EventMQ Protocol (eMQP) defines a reliable service-oriented request-reply and pub-sub dialog between a set of clients, a broker, and a set of workers.</p>
161<p>The goals are to:</p> 162<p>The goals are to:</p>
162<blockquote> 163<blockquote>
163<div><ul class="simple"> 164<div><ul class="simple">
164<li>Specify a protocol to follow when implementing a component to EventMQ.</li> 165<li>Specify a protocol to follow when implementing a component to EventMQ.</li>
165<li>Allow requests to be routed to workers by an abstracted service name.</li> 166<li>Allow requests to be routed to workers by an abstracted service name (named queues).</li>
166<li>Detect disconnected peers through heartbeating.</li> 167<li>Detect disconnected peers through heartbeating.</li>
167<li>Allow for message tracing and debugging.</li> 168<li>Allow for message tracing and debugging.</li>
168</ul> 169</ul>
@@ -231,15 +232,12 @@
231</tr> 232</tr>
232</tbody> 233</tbody>
233</table> 234</table>
234</div> 235<p>A <strong>REPLY</strong> frame consists of a 5-frame multipart message, formatted as follows.</p>
235<div class="section" id="emqp-client">
236<h3>eMQP / Client<a class="headerlink" href="#emqp-client" title="Permalink to this headline">¶</a></h3>
237<p>A <strong>REQUEST</strong> command consists of a 7-frame multipart message, formatted as follows.</p>
238<table border="1" class="docutils"> 236<table border="1" class="docutils">
239<colgroup> 237<colgroup>
240<col width="8%" /> 238<col width="13%" />
241<col width="20%" /> 239<col width="31%" />
242<col width="72%" /> 240<col width="56%" />
243</colgroup> 241</colgroup>
244<thead valign="bottom"> 242<thead valign="bottom">
245<tr class="row-odd"><th class="head">FRAME</th> 243<tr class="row-odd"><th class="head">FRAME</th>
@@ -257,7 +255,7 @@
257<td>Protocol version</td> 255<td>Protocol version</td>
258</tr> 256</tr>
259<tr class="row-even"><td>2</td> 257<tr class="row-even"><td>2</td>
260<td>REQUEST</td> 258<td>REPLY</td>
261<td>command</td> 259<td>command</td>
262</tr> 260</tr>
263<tr class="row-odd"><td>3</td> 261<tr class="row-odd"><td>3</td>
@@ -265,25 +263,17 @@
265<td>A unique id for the msg</td> 263<td>A unique id for the msg</td>
266</tr> 264</tr>
267<tr class="row-even"><td>4</td> 265<tr class="row-even"><td>4</td>
268<td>_QUEUE_NAME_</td>
269<td>the name of the queue the request should be sent to</td>
270</tr>
271<tr class="row-odd"><td>5</td>
272<td>_HEADERS_</td>
273<td>dictionary of headers. can be an empty set</td>
274</tr>
275<tr class="row-even"><td>6</td>
276<td>_MSG_</td> 266<td>_MSG_</td>
277<td>The message to send</td> 267<td>The reply to respond with</td>
278</tr> 268</tr>
279</tbody> 269</tbody>
280</table> 270</table>
281<p>A <strong>PUBLISH</strong> command consists of a 7-frame multipart messag, formatted as follows.</p> 271<p>A <strong>HEARTBEAT</strong> frame consists of a</p>
282<table border="1" class="docutils"> 272<table border="1" class="docutils">
283<colgroup> 273<colgroup>
284<col width="7%" /> 274<col width="14%" />
285<col width="17%" /> 275<col width="33%" />
286<col width="75%" /> 276<col width="53%" />
287</colgroup> 277</colgroup>
288<thead valign="bottom"> 278<thead valign="bottom">
289<tr class="row-odd"><th class="head">FRAME</th> 279<tr class="row-odd"><th class="head">FRAME</th>
@@ -301,7 +291,7 @@
301<td>Protocol version</td> 291<td>Protocol version</td>
302</tr> 292</tr>
303<tr class="row-even"><td>2</td> 293<tr class="row-even"><td>2</td>
304<td>PUBLISH</td> 294<td>HEARTBEAT</td>
305<td>command</td> 295<td>command</td>
306</tr> 296</tr>
307<tr class="row-odd"><td>3</td> 297<tr class="row-odd"><td>3</td>
@@ -309,25 +299,17 @@
309<td>A unique id for the msg</td> 299<td>A unique id for the msg</td>
310</tr> 300</tr>
311<tr class="row-even"><td>4</td> 301<tr class="row-even"><td>4</td>
312<td>_TOPIC_NAME_</td> 302<td>_UNIX_TS_</td>
313<td>the name of the topic this message should be published across</td> 303<td>A unix timestamp</td>
314</tr>
315<tr class="row-odd"><td>5</td>
316<td>_HEADERS_</td>
317<td>csv list of headers</td>
318</tr>
319<tr class="row-even"><td>6</td>
320<td>_MSG_</td>
321<td>The message to send</td>
322</tr> 304</tr>
323</tbody> 305</tbody>
324</table> 306</table>
325<p>A <strong>SCHEDULE</strong> command consists of a 7-frame multipart message, formatted as follows.</p> 307<p>A <strong>DISCONNECT</strong> frame consists of</p>
326<table border="1" class="docutils"> 308<table border="1" class="docutils">
327<colgroup> 309<colgroup>
328<col width="10%" /> 310<col width="14%" />
329<col width="23%" /> 311<col width="33%" />
330<col width="67%" /> 312<col width="53%" />
331</colgroup> 313</colgroup>
332<thead valign="bottom"> 314<thead valign="bottom">
333<tr class="row-odd"><th class="head">FRAME</th> 315<tr class="row-odd"><th class="head">FRAME</th>
@@ -345,28 +327,51 @@
345<td>Protocol version</td> 327<td>Protocol version</td>
346</tr> 328</tr>
347<tr class="row-even"><td>2</td> 329<tr class="row-even"><td>2</td>
348<td>SCHEDULE</td> 330<td>DISCONNECT</td>
349<td>command</td> 331<td>command</td>
350</tr> 332</tr>
351<tr class="row-odd"><td>3</td> 333<tr class="row-odd"><td>3</td>
352<td>_MSGID_</td> 334<td>_MSGID_</td>
353<td>A unique id for the msg</td> 335<td>A unique id for the msg</td>
354</tr> 336</tr>
355<tr class="row-even"><td>4</td> 337</tbody>
356<td>_QUEUE_NAME_</td> 338</table>
357<td>name of queue that the job should run in</td> 339<p>A <strong>KBAI</strong> frame consists of</p>
340<table border="1" class="docutils">
341<colgroup>
342<col width="14%" />
343<col width="33%" />
344<col width="53%" />
345</colgroup>
346<thead valign="bottom">
347<tr class="row-odd"><th class="head">FRAME</th>
348<th class="head">Value</th>
349<th class="head">Description</th>
358</tr> 350</tr>
359<tr class="row-odd"><td>5</td> 351</thead>
360<td>_HEADERS_</td> 352<tbody valign="top">
361<td>csv list of headers for this message</td> 353<tr class="row-even"><td>0</td>
354<td>_EMPTY_</td>
355<td>leave empty</td>
362</tr> 356</tr>
363<tr class="row-even"><td>6</td> 357<tr class="row-odd"><td>1</td>
364<td>_MSG_</td> 358<td>eMQP/1.0</td>
365<td>The message to send</td> 359<td>Protocol version</td>
360</tr>
361<tr class="row-even"><td>2</td>
362<td>KBAI</td>
363<td>command</td>
364</tr>
365<tr class="row-odd"><td>3</td>
366<td>_MSGID_</td>
367<td>A unique id for the msg</td>
366</tr> 368</tr>
367</tbody> 369</tbody>
368</table> 370</table>
369<p>An <strong>UNSCHEDULE</strong> command consists of a 7-frame multipart message, formatted as follows.</p> 371</div>
372<div class="section" id="emqp-client">
373<h3>eMQP / Client<a class="headerlink" href="#emqp-client" title="Permalink to this headline">¶</a></h3>
374<p>A <strong>REQUEST</strong> command consists of a 7-frame multipart message, formatted as follows.</p>
370<table border="1" class="docutils"> 375<table border="1" class="docutils">
371<colgroup> 376<colgroup>
372<col width="8%" /> 377<col width="8%" />
@@ -389,7 +394,7 @@
389<td>Protocol version</td> 394<td>Protocol version</td>
390</tr> 395</tr>
391<tr class="row-even"><td>2</td> 396<tr class="row-even"><td>2</td>
392<td>UNSCHEDULE</td> 397<td>REQUEST</td>
393<td>command</td> 398<td>command</td>
394</tr> 399</tr>
395<tr class="row-odd"><td>3</td> 400<tr class="row-odd"><td>3</td>
@@ -398,11 +403,11 @@
398</tr> 403</tr>
399<tr class="row-even"><td>4</td> 404<tr class="row-even"><td>4</td>
400<td>_QUEUE_NAME_</td> 405<td>_QUEUE_NAME_</td>
401<td>ignored for this command, broadcasted to all queues</td> 406<td>the name of the queue the request should be sent to</td>
402</tr> 407</tr>
403<tr class="row-odd"><td>5</td> 408<tr class="row-odd"><td>5</td>
404<td>_HEADERS_</td> 409<td>_HEADERS_</td>
405<td>csv list of headers for this message</td> 410<td>dictionary of headers. can be an empty set</td>
406</tr> 411</tr>
407<tr class="row-even"><td>6</td> 412<tr class="row-even"><td>6</td>
408<td>_MSG_</td> 413<td>_MSG_</td>
@@ -410,15 +415,12 @@
410</tr> 415</tr>
411</tbody> 416</tbody>
412</table> 417</table>
413</div> 418<p>A <strong>PUBLISH</strong> command consists of a 7-frame multipart messag, formatted as follows.</p>
414<div class="section" id="emqp-scheduler">
415<h3>eMQP / Scheduler<a class="headerlink" href="#emqp-scheduler" title="Permalink to this headline">¶</a></h3>
416<p>An <strong>INFORM</strong> command consists of a 6-frame multipart message, formatted as follows.</p>
417<table border="1" class="docutils"> 419<table border="1" class="docutils">
418<colgroup> 420<colgroup>
419<col width="13%" /> 421<col width="7%" />
420<col width="29%" /> 422<col width="17%" />
421<col width="58%" /> 423<col width="75%" />
422</colgroup> 424</colgroup>
423<thead valign="bottom"> 425<thead valign="bottom">
424<tr class="row-odd"><th class="head">FRAME</th> 426<tr class="row-odd"><th class="head">FRAME</th>
@@ -436,7 +438,7 @@
436<td>Protocol version</td> 438<td>Protocol version</td>
437</tr> 439</tr>
438<tr class="row-even"><td>2</td> 440<tr class="row-even"><td>2</td>
439<td>INFORM</td> 441<td>PUBLISH</td>
440<td>command</td> 442<td>command</td>
441</tr> 443</tr>
442<tr class="row-odd"><td>3</td> 444<tr class="row-odd"><td>3</td>
@@ -444,24 +446,25 @@
444<td>A unique id for the msg</td> 446<td>A unique id for the msg</td>
445</tr> 447</tr>
446<tr class="row-even"><td>4</td> 448<tr class="row-even"><td>4</td>
447<td>&nbsp;</td> 449<td>_TOPIC_NAME_</td>
448<td>Queues. Unused for scheduler</td> 450<td>the name of the topic this message should be published across</td>
449</tr> 451</tr>
450<tr class="row-odd"><td>5</td> 452<tr class="row-odd"><td>5</td>
451<td>scheduler</td> 453<td>_HEADERS_</td>
452<td>type of peer connecting</td> 454<td>csv list of headers</td>
455</tr>
456<tr class="row-even"><td>6</td>
457<td>_MSG_</td>
458<td>The message to send</td>
453</tr> 459</tr>
454</tbody> 460</tbody>
455</table> 461</table>
456</div> 462<p>A <strong>SCHEDULE</strong> command consists of a 7-frame multipart message, formatted as follows.</p>
457<div class="section" id="emqp-worker">
458<h3>eMQP / Worker<a class="headerlink" href="#emqp-worker" title="Permalink to this headline">¶</a></h3>
459<p>An <strong>INFORM</strong> command consists of a 5-frame multipart message, formatted as follows.</p>
460<table border="1" class="docutils"> 463<table border="1" class="docutils">
461<colgroup> 464<colgroup>
462<col width="5%" /> 465<col width="10%" />
463<col width="13%" /> 466<col width="23%" />
464<col width="82%" /> 467<col width="67%" />
465</colgroup> 468</colgroup>
466<thead valign="bottom"> 469<thead valign="bottom">
467<tr class="row-odd"><th class="head">FRAME</th> 470<tr class="row-odd"><th class="head">FRAME</th>
@@ -479,7 +482,7 @@
479<td>Protocol version</td> 482<td>Protocol version</td>
480</tr> 483</tr>
481<tr class="row-even"><td>2</td> 484<tr class="row-even"><td>2</td>
482<td>INFORM</td> 485<td>SCHEDULE</td>
483<td>command</td> 486<td>command</td>
484</tr> 487</tr>
485<tr class="row-odd"><td>3</td> 488<tr class="row-odd"><td>3</td>
@@ -487,21 +490,25 @@
487<td>A unique id for the msg</td> 490<td>A unique id for the msg</td>
488</tr> 491</tr>
489<tr class="row-even"><td>4</td> 492<tr class="row-even"><td>4</td>
490<td>_QUEUES_</td> 493<td>_QUEUE_NAME_</td>
491<td>csv seperated arrays containing an int and a string for weight and name. e.g. [40, &#8216;email&#8217;]</td> 494<td>name of queue that the job should run in</td>
492</tr> 495</tr>
493<tr class="row-odd"><td>5</td> 496<tr class="row-odd"><td>5</td>
494<td>worker</td> 497<td>_HEADERS_</td>
495<td>type of peer connecting</td> 498<td>csv list of headers for this message</td>
499</tr>
500<tr class="row-even"><td>6</td>
501<td>_MSG_</td>
502<td>The message to send</td>
496</tr> 503</tr>
497</tbody> 504</tbody>
498</table> 505</table>
499<p>A <strong>READY</strong> frame consists of a 4-frame multipart message, formatted as follows.</p> 506<p>An <strong>UNSCHEDULE</strong> command consists of a 7-frame multipart message, formatted as follows.</p>
500<table border="1" class="docutils"> 507<table border="1" class="docutils">
501<colgroup> 508<colgroup>
502<col width="14%" /> 509<col width="8%" />
503<col width="33%" /> 510<col width="20%" />
504<col width="53%" /> 511<col width="72%" />
505</colgroup> 512</colgroup>
506<thead valign="bottom"> 513<thead valign="bottom">
507<tr class="row-odd"><th class="head">FRAME</th> 514<tr class="row-odd"><th class="head">FRAME</th>
@@ -519,21 +526,36 @@
519<td>Protocol version</td> 526<td>Protocol version</td>
520</tr> 527</tr>
521<tr class="row-even"><td>2</td> 528<tr class="row-even"><td>2</td>
522<td>READY</td> 529<td>UNSCHEDULE</td>
523<td>command</td> 530<td>command</td>
524</tr> 531</tr>
525<tr class="row-odd"><td>3</td> 532<tr class="row-odd"><td>3</td>
526<td>_MSGID_</td> 533<td>_MSGID_</td>
527<td>A unique id for the msg</td> 534<td>A unique id for the msg</td>
528</tr> 535</tr>
536<tr class="row-even"><td>4</td>
537<td>_QUEUE_NAME_</td>
538<td>ignored for this command, broadcasted to all queues</td>
539</tr>
540<tr class="row-odd"><td>5</td>
541<td>_HEADERS_</td>
542<td>csv list of headers for this message</td>
543</tr>
544<tr class="row-even"><td>6</td>
545<td>_MSG_</td>
546<td>The message to send</td>
547</tr>
529</tbody> 548</tbody>
530</table> 549</table>
531<p>A <strong>REPLY</strong> frame consists of a 5-frame multipart message, formatted as follows.</p> 550</div>
551<div class="section" id="emqp-scheduler">
552<h3>eMQP / Scheduler<a class="headerlink" href="#emqp-scheduler" title="Permalink to this headline">¶</a></h3>
553<p>An <strong>INFORM</strong> command consists of a 6-frame multipart message, formatted as follows.</p>
532<table border="1" class="docutils"> 554<table border="1" class="docutils">
533<colgroup> 555<colgroup>
534<col width="13%" /> 556<col width="13%" />
535<col width="31%" /> 557<col width="29%" />
536<col width="56%" /> 558<col width="58%" />
537</colgroup> 559</colgroup>
538<thead valign="bottom"> 560<thead valign="bottom">
539<tr class="row-odd"><th class="head">FRAME</th> 561<tr class="row-odd"><th class="head">FRAME</th>
@@ -551,7 +573,7 @@
551<td>Protocol version</td> 573<td>Protocol version</td>
552</tr> 574</tr>
553<tr class="row-even"><td>2</td> 575<tr class="row-even"><td>2</td>
554<td>REPLY</td> 576<td>INFORM</td>
555<td>command</td> 577<td>command</td>
556</tr> 578</tr>
557<tr class="row-odd"><td>3</td> 579<tr class="row-odd"><td>3</td>
@@ -559,17 +581,24 @@
559<td>A unique id for the msg</td> 581<td>A unique id for the msg</td>
560</tr> 582</tr>
561<tr class="row-even"><td>4</td> 583<tr class="row-even"><td>4</td>
562<td>_MSG_</td> 584<td>&nbsp;</td>
563<td>The reply to respond with</td> 585<td>Queues. Unused for scheduler</td>
586</tr>
587<tr class="row-odd"><td>5</td>
588<td>scheduler</td>
589<td>type of peer connecting</td>
564</tr> 590</tr>
565</tbody> 591</tbody>
566</table> 592</table>
567<p>A <strong>HEARTBEAT</strong> frame consists of a</p> 593</div>
594<div class="section" id="emqp-worker">
595<h3>eMQP / Worker<a class="headerlink" href="#emqp-worker" title="Permalink to this headline">¶</a></h3>
596<p>An <strong>INFORM</strong> command consists of a 5-frame multipart message, formatted as follows.</p>
568<table border="1" class="docutils"> 597<table border="1" class="docutils">
569<colgroup> 598<colgroup>
570<col width="14%" /> 599<col width="5%" />
571<col width="33%" /> 600<col width="13%" />
572<col width="53%" /> 601<col width="82%" />
573</colgroup> 602</colgroup>
574<thead valign="bottom"> 603<thead valign="bottom">
575<tr class="row-odd"><th class="head">FRAME</th> 604<tr class="row-odd"><th class="head">FRAME</th>
@@ -587,7 +616,7 @@
587<td>Protocol version</td> 616<td>Protocol version</td>
588</tr> 617</tr>
589<tr class="row-even"><td>2</td> 618<tr class="row-even"><td>2</td>
590<td>HEARTBEAT</td> 619<td>INFORM</td>
591<td>command</td> 620<td>command</td>
592</tr> 621</tr>
593<tr class="row-odd"><td>3</td> 622<tr class="row-odd"><td>3</td>
@@ -595,12 +624,16 @@
595<td>A unique id for the msg</td> 624<td>A unique id for the msg</td>
596</tr> 625</tr>
597<tr class="row-even"><td>4</td> 626<tr class="row-even"><td>4</td>
598<td>_UNIX_TS_</td> 627<td>_QUEUES_</td>
599<td>A unix timestamp</td> 628<td>csv seperated arrays containing an int and a string for weight and name. e.g. [40, &#8216;email&#8217;]</td>
629</tr>
630<tr class="row-odd"><td>5</td>
631<td>worker</td>
632<td>type of peer connecting</td>
600</tr> 633</tr>
601</tbody> 634</tbody>
602</table> 635</table>
603<p>A <strong>DISCONNECT</strong> frame consists of</p> 636<p>A <strong>READY</strong> frame consists of a 4-frame multipart message, formatted as follows.</p>
604<table border="1" class="docutils"> 637<table border="1" class="docutils">
605<colgroup> 638<colgroup>
606<col width="14%" /> 639<col width="14%" />
@@ -623,7 +656,7 @@
623<td>Protocol version</td> 656<td>Protocol version</td>
624</tr> 657</tr>
625<tr class="row-even"><td>2</td> 658<tr class="row-even"><td>2</td>
626<td>DISCONNECT</td> 659<td>READY</td>
627<td>command</td> 660<td>command</td>
628</tr> 661</tr>
629<tr class="row-odd"><td>3</td> 662<tr class="row-odd"><td>3</td>
@@ -637,7 +670,7 @@
637<h3>Heartbeating<a class="headerlink" href="#heartbeating" title="Permalink to this headline">¶</a></h3> 670<h3>Heartbeating<a class="headerlink" href="#heartbeating" title="Permalink to this headline">¶</a></h3>
638<blockquote> 671<blockquote>
639<div><ul class="simple"> 672<div><ul class="simple">
640<li>HEARTBEAT commands are valid at any time after an INFORM command</li> 673<li>HEARTBEAT commands are valid at any time after an INFORM command.</li>
641<li>Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands.</li> 674<li>Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands.</li>
642<li>Worker and broker MUST send heartbeats at regular and agreed-upon intervals.</li> 675<li>Worker and broker MUST send heartbeats at regular and agreed-upon intervals.</li>
643<li>Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals.</li> 676<li>Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals.</li>
@@ -647,22 +680,24 @@
647</ul> 680</ul>
648</div></blockquote> 681</div></blockquote>
649</div> 682</div>
650<div class="section" id="request-headers"> 683<div class="section" id="headers">
651<h3>REQUEST Headers<a class="headerlink" href="#request-headers" title="Permalink to this headline">¶</a></h3> 684<h3>Headers<a class="headerlink" href="#headers" title="Permalink to this headline">¶</a></h3>
652<p>Headers MUST be 0 to many comma seperated values inserted into the header field. If there are no headers required, send an empty string MUST be sent where headers are required.</p> 685<p>Headers MUST be 0 to many comma seperated values inserted into the header field. If there are no headers required, an empty string MUST be sent where headers are required.</p>
653<p>Below is a table which defines and describes the headers.</p> 686<p>Below is a table which defines and describes the headers.</p>
654<table border="1" class="docutils"> 687<table border="1" class="docutils">
655<colgroup> 688<colgroup>
656<col width="9%" /> 689<col width="8%" />
657<col width="4%" /> 690<col width="3%" />
658<col width="4%" /> 691<col width="3%" />
659<col width="4%" /> 692<col width="4%" />
660<col width="78%" /> 693<col width="3%" />
694<col width="79%" />
661</colgroup> 695</colgroup>
662<thead valign="bottom"> 696<thead valign="bottom">
663<tr class="row-odd"><th class="head">Header</th> 697<tr class="row-odd"><th class="head">Header</th>
664<th class="head">REQUEST</th> 698<th class="head">REQUEST</th>
665<th class="head">PUBLISH</th> 699<th class="head">PUBLISH</th>
700<th class="head">SCHEDULE</th>
666<th class="head">Default</th> 701<th class="head">Default</th>
667<th class="head">Description</th> 702<th class="head">Description</th>
668</tr> 703</tr>
@@ -671,25 +706,53 @@
671<tr class="row-even"><td>reply-requested</td> 706<tr class="row-even"><td>reply-requested</td>
672<td>X</td> 707<td>X</td>
673<td>&nbsp;</td> 708<td>&nbsp;</td>
709<td>&nbsp;</td>
674<td>False</td> 710<td>False</td>
675<td>Once the job is finished, send a reply back with information from the job. If there is no information reply with a True value.</td> 711<td>Once the job is finished, send a reply back with information from the job. If there is no information reply with a True value.</td>
676</tr> 712</tr>
677<tr class="row-odd"><td>retry-count:#</td> 713<tr class="row-odd"><td>retry-count:#</td>
678<td>X</td> 714<td>X</td>
679<td>&nbsp;</td> 715<td>&nbsp;</td>
716<td>&nbsp;</td>
680<td>0</td> 717<td>0</td>
681<td>Retry a failed job this many times before accepting defeat.</td> 718<td>Retry a failed job this many times before accepting defeat.</td>
682</tr> 719</tr>
683<tr class="row-even"><td>guarantee</td> 720<tr class="row-even"><td>guarantee</td>
684<td>X</td> 721<td>X</td>
685<td>&nbsp;</td> 722<td>&nbsp;</td>
723<td>&nbsp;</td>
686<td>False</td> 724<td>False</td>
687<td>Ensure the job completes by letting someone else worry about a success reply.</td> 725<td>Ensure the job completes by letting someone else worry about a success reply.</td>
688</tr> 726</tr>
727<tr class="row-odd"><td>nohaste</td>
728<td>&nbsp;</td>
729<td>&nbsp;</td>
730<td>X</td>
731<td>False</td>
732<td>When scheduling a job, set this to True if you don&#8217;t want the job to run immediately as it&#8217;s scheduled. Instead, it will run for the first time when the interval has elapsed.</td>
733</tr>
689</tbody> 734</tbody>
690</table> 735</table>
691</div> 736</div>
692</div> 737</div>
738<div class="section" id="disconnect-and-kbai">
739<h2>DISCONNECT and KBAI<a class="headerlink" href="#disconnect-and-kbai" title="Permalink to this headline">¶</a></h2>
740<dl class="docutils">
741<dt>When a component receives a DISCONNECT command it:</dt>
742<dd><ul class="first last simple">
743<li>MUST send a KBAI command to all connected components.</li>
744<li>MUST stop sending and receiving any messages</li>
745<li>MUST allow any pending messages or jobs to complete.</li>
746</ul>
747</dd>
748<dt>When a component receives a KBAI command it:</dt>
749<dd><ul class="first last simple">
750<li>MUST stop sending any messages to the disconnecting component.</li>
751<li>SHOULD Clean up references to the disconnecting component.</li>
752</ul>
753</dd>
754</dl>
755</div>
693</div> 756</div>
694 757
695 758
diff --git a/py-modindex.html b/py-modindex.html
index 43f24ef..181c5b3 100644
--- a/py-modindex.html
+++ b/py-modindex.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/receiver.html b/receiver.html
index ccce6d3..664c268 100644
--- a/receiver.html
+++ b/receiver.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/router.html b/router.html
index 86fe30d..ca90e13 100644
--- a/router.html
+++ b/router.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
@@ -226,6 +226,30 @@ self.queues</li>
226</dd></dl> 226</dd></dl>
227 227
228<dl class="method"> 228<dl class="method">
229<dt id="eventmq.router.Router.get_status">
230<code class="descname">get_status</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.get_status" title="Permalink to this definition">¶</a></dt>
231<dd><dl class="docutils">
232<dt>Return</dt>
233<dd>(str) Serialized information about the current state of the router.</dd>
234</dl>
235</dd></dl>
236
237<dl class="attribute">
238<dt id="eventmq.router.Router.job_latencies">
239<code class="descname">job_latencies</code><em class="property"> = None</em><a class="headerlink" href="#eventmq.router.Router.job_latencies" title="Permalink to this definition">¶</a></dt>
240<dd><p>Latency tracking dictionary
241Key: msgid of message each REQUEST received and forwarded to a worker
242Value: (timestamp, queue_name)</p>
243</dd></dl>
244
245<dl class="method">
246<dt id="eventmq.router.Router.on_disconnect">
247<code class="descname">on_disconnect</code><span class="sig-paren">(</span><em>msgid</em>, <em>msg</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_disconnect" title="Permalink to this definition">¶</a></dt>
248<dd><p>Prepare router for disconnecting by removing schedulers, clearing
249worker queue (if needed), and removing workers.</p>
250</dd></dl>
251
252<dl class="method">
229<dt id="eventmq.router.Router.on_heartbeat"> 253<dt id="eventmq.router.Router.on_heartbeat">
230<code class="descname">on_heartbeat</code><span class="sig-paren">(</span><em>sender</em>, <em>msgid</em>, <em>msg</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_heartbeat" title="Permalink to this definition">¶</a></dt> 254<code class="descname">on_heartbeat</code><span class="sig-paren">(</span><em>sender</em>, <em>msgid</em>, <em>msg</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_heartbeat" title="Permalink to this definition">¶</a></dt>
231<dd><p>a placeholder for a no-op command. The actual &#8216;logic&#8217; for HEARTBEAT is 255<dd><p>a placeholder for a no-op command. The actual &#8216;logic&#8217; for HEARTBEAT is
@@ -260,6 +284,13 @@ and announces itself.</p>
260</dd></dl> 284</dd></dl>
261 285
262<dl class="method"> 286<dl class="method">
287<dt id="eventmq.router.Router.on_reply">
288<code class="descname">on_reply</code><span class="sig-paren">(</span><em>sender</em>, <em>msgid</em>, <em>msg</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_reply" title="Permalink to this definition">¶</a></dt>
289<dd><p>Handles an REPLY message. Replies are sent by the worker for latanecy
290measurements</p>
291</dd></dl>
292
293<dl class="method">
263<dt id="eventmq.router.Router.on_request"> 294<dt id="eventmq.router.Router.on_request">
264<code class="descname">on_request</code><span class="sig-paren">(</span><em>sender</em>, <em>msgid</em>, <em>msg</em>, <em>depth=1</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_request" title="Permalink to this definition">¶</a></dt> 295<code class="descname">on_request</code><span class="sig-paren">(</span><em>sender</em>, <em>msgid</em>, <em>msg</em>, <em>depth=1</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.on_request" title="Permalink to this definition">¶</a></dt>
265<dd><p>Process a client REQUEST frame</p> 296<dd><p>Process a client REQUEST frame</p>
@@ -465,7 +496,7 @@ process receives a SIGHUP from the system.</p>
465 496
466<dl class="method"> 497<dl class="method">
467<dt id="eventmq.router.Router.start"> 498<dt id="eventmq.router.Router.start">
468<code class="descname">start</code><span class="sig-paren">(</span><em>frontend_addr='tcp://127.0.0.1:47291'</em>, <em>backend_addr='tcp://127.0.0.1:47290'</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.start" title="Permalink to this definition">¶</a></dt> 499<code class="descname">start</code><span class="sig-paren">(</span><em>frontend_addr='tcp://127.0.0.1:47291'</em>, <em>backend_addr='tcp://127.0.0.1:47290'</em>, <em>administrative_addr='tcp://127.0.0.1:47293'</em><span class="sig-paren">)</span><a class="headerlink" href="#eventmq.router.Router.start" title="Permalink to this definition">¶</a></dt>
469<dd><p>Begin listening for connections on the provided connection strings</p> 500<dd><p>Begin listening for connections on the provided connection strings</p>
470<table class="docutils field-list" frame="void" rules="none"> 501<table class="docutils field-list" frame="void" rules="none">
471<col class="field-name" /> 502<col class="field-name" />
@@ -474,6 +505,8 @@ process receives a SIGHUP from the system.</p>
474<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple"> 505<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
475<li><strong>frontend_addr</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; connection string to listen for requests</li> 506<li><strong>frontend_addr</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; connection string to listen for requests</li>
476<li><strong>backend_addr</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; connection string to listen for workers</li> 507<li><strong>backend_addr</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; connection string to listen for workers</li>
508<li><strong>administrative_addr</strong> (<a class="reference external" href="https://docs.python.org/library/functions.html#str" title="(in Python v2.7)"><em>str</em></a>) &#8211; connection string to listen for emq-cli
509commands on.</li>
477</ul> 510</ul>
478</td> 511</td>
479</tr> 512</tr>
diff --git a/search.html b/search.html
index c280580..ad81164 100644
--- a/search.html
+++ b/search.html
@@ -58,7 +58,7 @@
58 58
59 59
60 <div class="version"> 60 <div class="version">
61 0.2.1 61 0.2.6.2
62 </div> 62 </div>
63 63
64 64
diff --git a/searchindex.js b/searchindex.js
index ab28224..fb8ebac 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
Search.setIndex({envversion:46,filenames:["api","client","client/messages","contributing","exceptions","index","jobmanager","poller","protocol","receiver","router","sender","settings_file","using","utils/classes","utils/devices","utils/index","utils/messages","utils/settings","utils/timeutils"],objects:{"eventmq.client":{messages:[2,0,0,"-"]},"eventmq.client.messages":{build_module_path:[2,3,1,""],defer_job:[2,3,1,""],schedule:[2,3,1,""],send_request:[2,3,1,""],send_schedule_request:[2,3,1,""]},"eventmq.exceptions":{EventMQError:[4,5,1,""],InvalidMessageError:[4,5,1,""],MessageError:[4,5,1,""],NoAvailableWorkerSlotsError:[4,5,1,""],PeerGoneAwayError:[4,5,1,""],UnknownQueueError:[4,5,1,""]},"eventmq.jobmanager":{JobManager:[6,4,1,""]},"eventmq.jobmanager.JobManager":{"__init__":[6,2,1,""],concurrent_jobs:[6,1,1,""],jobmanager_main:[6,2,1,""],name:[6,1,1,""],on_heartbeat:[6,2,1,""],on_request:[6,2,1,""],outgoing:[6,1,1,""],queues:[6,1,1,""],send_ready:[6,2,1,""]},"eventmq.poller":{Poller:[7,4,1,""]},"eventmq.poller.Poller":{"__init__":[7,2,1,""],poll:[7,2,1,""],register:[7,2,1,""],unregister:[7,2,1,""]},"eventmq.receiver":{Receiver:[9,4,1,""]},"eventmq.receiver.Receiver":{"__init__":[9,2,1,""],connect:[9,2,1,""],listen:[9,2,1,""],name:[9,1,1,""],ready:[9,1,1,""],unbind:[9,2,1,""],zcontext:[9,1,1,""],zsocket:[9,1,1,""]},"eventmq.router":{Router:[10,4,1,""]},"eventmq.router.Router":{add_scheduler:[10,2,1,""],add_worker:[10,2,1,""],clean_up_dead_schedulers:[10,2,1,""],clean_up_dead_workers:[10,2,1,""],get_available_worker:[10,2,1,""],on_heartbeat:[10,2,1,""],on_inform:[10,2,1,""],on_ready:[10,2,1,""],on_request:[10,2,1,""],prioritize_queue_list:[10,6,1,""],process_client_message:[10,2,1,""],process_worker_message:[10,2,1,""],queues:[10,1,1,""],received_disconnect:[10,1,1,""],requeue_worker:[10,2,1,""],reset_heartbeat_counters:[10,2,1,""],router_main:[10,2,1,""],scheduler_queue:[10,1,1,""],schedulers:[10,1,1,""],send_ack:[10,2,1,""],send_heartbeat:[10,2,1,""],send_schedulers_heartbeats:[10,2,1,""],send_workers_heartbeats:[10,2,1,""],sighup_handler:[10,2,1,""],start:[10,2,1,""],waiting_messages:[10,1,1,""],workers:[10,1,1,""]},"eventmq.sender":{Sender:[11,4,1,""]},"eventmq.sender.Sender":{"__init__":[11,2,1,""],connect:[11,2,1,""],listen:[11,2,1,""],name:[11,1,1,""],ready:[11,1,1,""],rebuild:[11,2,1,""],unbind:[11,2,1,""],zcontext:[11,1,1,""],zsocket:[11,1,1,""]},"eventmq.utils":{classes:[14,0,0,"-"],devices:[15,0,0,"-"],messages:[17,0,0,"-"],random_characters:[16,3,1,""],settings:[18,0,0,"-"],timeutils:[19,0,0,"-"],tuplify:[16,3,1,""],zero_index_cmp:[16,3,1,""]},"eventmq.utils.classes":{EMQPService:[14,4,1,""],EMQdeque:[14,4,1,""],HeartbeatMixin:[14,4,1,""],ZMQReceiveMixin:[14,4,1,""],ZMQSendMixin:[14,4,1,""]},"eventmq.utils.classes.EMQPService":{"__weakref__":[14,1,1,""],is_heartbeat_enabled:[14,1,1,""],on_ack:[14,2,1,""],process_message:[14,2,1,""],reset:[14,2,1,""],send_inform:[14,2,1,""],start:[14,2,1,""]},"eventmq.utils.classes.EMQdeque":{"__init__":[14,2,1,""],"__weakref__":[14,1,1,""],append:[14,2,1,""],appendleft:[14,2,1,""],extend:[14,2,1,""],is_empty:[14,2,1,""],is_full:[14,2,1,""],is_pfull:[14,2,1,""],pop:[14,2,1,""],popleft:[14,2,1,""],remove:[14,2,1,""]},"eventmq.utils.classes.HeartbeatMixin":{"__init__":[14,2,1,""],"__weakref__":[14,1,1,""],is_dead:[14,2,1,""],reset_heartbeat_counters:[14,2,1,""],send_heartbeat:[14,2,1,""]},"eventmq.utils.classes.ZMQReceiveMixin":{"__weakref__":[14,1,1,""],recv:[14,2,1,""],recv_multipart:[14,2,1,""]},"eventmq.utils.classes.ZMQSendMixin":{"__weakref__":[14,1,1,""],send:[14,2,1,""],send_multipart:[14,2,1,""]},"eventmq.utils.devices":{generate_device_name:[15,3,1,""]},"eventmq.utils.messages":{fwd_emqp_router_message:[17,3,1,""],generate_msgid:[17,3,1,""],parse_message:[17,3,1,""],parse_router_message:[17,3,1,""],send_emqp_message:[17,3,1,""],send_emqp_router_message:[17,3,1,""]},"eventmq.utils.settings":{import_settings:[18,3,1,""]},"eventmq.utils.timeutils":{IntervalIter:[19,4,1,""],monotonic:[19,3,1,""],seconds_until:[19,3,1,""],timestamp:[19,3,1,""]},"eventmq.utils.timeutils.IntervalIter":{"__init__":[19,2,1,""],"__weakref__":[19,1,1,""]},eventmq:{client:[1,0,0,"-"],exceptions:[4,0,0,"-"],jobmanager:[6,0,0,"-"],poller:[7,0,0,"-"],receiver:[9,0,0,"-"],router:[10,0,0,"-"],sender:[11,0,0,"-"],utils:[16,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","class","Python class"],"5":["py","exception","Python exception"],"6":["py","classmethod","Python class method"]},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:function","4":"py:class","5":"py:exception","6":"py:classmethod"},terms:{"0mq":[8,14],"5min":19,"__init__":[6,7,9,11,14,19],"__weakref__":[14,19],"_empty_":8,"_headers_":8,"_issu":[],"_msg_":8,"_msgid_":8,"_queue_name_":8,"_queues_":8,"_recipient_id":14,"_sourc":[],"_topic_name_":8,"_unix_ts_":8,"abstract":8,"boolean":14,"case":[8,14,19],"class":[],"default":[2,6,8,9,10,11,12,14],"float":[14,19],"function":2,"import":[2,3,6,10,12,18],"int":[2,7,8,10,14,19],"long":[7,14],"new":[10,14],"public":8,"return":[2,3,7,9,10,11,14,15,16,17,19],"short":10,"true":[8,9,10,11,14],"while":8,abl:[10,12],about:[6,8,10],absolut:3,accept:[8,12,14],account:[10,17],ack:[8,10],ackd_msgid:14,acknowledg:[8,10],across:8,act:[1,8],activ:[],active_job:[],actual:[6,10],add:10,add_schedul:10,add_work:10,addr:[9,11,14],address:[],after:8,agre:8,all:[2,4,6,8,9,10,11,14],allow:8,alon:[],alpha:8,alreadi:10,also:14,alwai:2,and_data:17,ani:[2,8,10,16],announc:10,anoth:[6,10,12],anyth:12,api:[],app:14,appear:7,append:14,appendleft:14,appened:10,appli:18,applic:[2,8],architectur:[],aren:[],arg2:2,arg3:2,arg:[2,6,7,9,10,11,14],argument:14,arithmet:19,around:[],arrai:8,ascii:15,assign:12,assum:19,attempt:[4,10],attr:7,automat:14,avail:[4,10],available_slot:10,available_work:[],awaiting_ack:14,back:[8,10,14],backend_addr:10,backward:14,base:[4,7,12,14],basi:8,becaus:[10,14],becom:12,been:[2,10,14],befor:[2,7,8],begin:[10,12,14],belong:10,below:8,best:2,between:[2,8],bin:[],block:12,bool:[2,6,9,11,14],boot:19,both:[7,8],box:12,broadcast:8,broker:[6,8,14],broker_addr:6,buffer:10,build:[2,10,11],build_module_path:2,built:8,bulid:9,busi:[],calcul:19,call:[7,10,14],callabl:[2,6,9],callback:14,can:[1,2,8,10,14,15,17],captur:14,care:15,caus:15,certain:14,chang:8,charact:16,check:[9,11,14],choos:12,circuit:10,class_arg:[2,6],class_kwarg:[2,6],classmethod:10,clean_up_dead_schedul:10,clean_up_dead_work:10,client:[],clock:19,close:[14,19],cmp:16,code:[3,5,14],collect:14,colon:[2,12],column:[],com:[],come:[2,10],comma:8,command:[2,6,8,10,14,17],compar:16,compat:14,complet:8,compon:8,concurr:12,conf:12,config:12,configur:[2,10,18],connction:[9,11],connect:[6,8,9,10,11,14,17],consist:8,contact:4,contain:[1,8,10,14,16],content:[],context:[9,11],control:12,contruct:14,convers:8,convert:16,convienc:[7,14],core:12,correctli:[],count:[6,8,10,19],counter:[10,14],cpu:12,creat:[10,11,16],cron:2,cross:[],csv:8,current:[9,11,14],custom:10,cycl:12,data:[10,17],data_process:12,deal:16,dealer:11,death:14,debug:8,decor:[],decrypt:[],decsend:10,def:[],defeat:8,defer:2,defer_job:2,defin:[2,6,8,9,11,14,19],deliv:8,denot:2,depth:10,dequ:14,describ:8,descript:8,detail:8,detect:8,determin:8,devic:[],dialog:8,dict:[2,6,7],dictionari:[7,8,10],did:[],die:10,differ:3,directli:[7,14],disabl:2,disconnect:[8,9],distribut:8,doe:14,doesn:7,don:6,dot:2,down:[12,19],dst:19,duplic:10,dure:11,each:[],effici:12,effort:2,either:[8,14],element:[10,14],els:[3,8],email:[8,12],empti:[8,17],emqdequ:14,emqp:[],emqpservic:14,enabl:[2,14],encod:15,encount:[2,4],end:[2,14],enderlab:[],ensur:[2,6,8,14],entri:10,equal:12,error:[2,14,15],etc:[10,12],evalu:2,even:8,event:[7,14],eventloop:[],eventmqerror:4,everi:[2,6],everyth:15,exampl:[10,12,14,19],except:[],exectu:10,execut:[2,8,12,19],exist:[4,6],explicitli:[12,14],expos:6,extend:14,extra:8,fail:[2,8],failur:2,fair:8,fals:[2,8,9,11,14],featur:15,few:3,field:8,file:12,find:14,finish:[8,10],first:[8,10,14,17],fit:8,flag:[2,7],follow:[2,8,14],form:14,format:[2,6,8,10,17],forward:[14,17],found:[4,10,12],foundat:8,frame:[],free:8,from:[4,7,8,9,10,11,14,19],frontend_addr:10,full:14,func:[2,6,14],fwd_emqp_router_messag:17,gener:[6,7,8,9,11,17],generate_device_nam:15,generate_msgid:17,get_available_work:10,github:[],give:2,given:10,gmtime:[],gnu:8,goal:[],good:14,group:12,guarante:[2,8],guarente:2,hand:16,handl:[6,8,10,14],handler:6,happen:[2,7,10,11],hard:14,hasn:10,have:[2,12,14,17],haven:10,header:[],heartbeat:[],heartbeat_timeout:10,heartbeati:14,heartbeatmixin:14,heavi:8,help:12,helper:14,here:[8,10],high:[],highest:12,hit:14,home:[],hope:8,how:[2,7],html:8,http:8,ident:[8,15],identifi:10,ietf:8,ignor:[8,14],immedi:2,immediatli:2,implement:[8,14],impli:8,import_set:18,includ:[2,8,14],incom:[],index:[5,10,16],indexerror:10,indiviud:12,inform:[6,8,10,14],inform_typ:[],inherit:4,ini:[12,18],initi:[2,14],insert:[8,14],instal:3,instanc:6,instanti:[2,6],integ:10,intens:12,interest:16,intern:4,interpret:8,interv:[2,8,19],interval_min:[],interval_sec:[2,19],intervalit:19,intes:[],invalidmessageerror:[4,10],is_dead:14,is_empti:14,is_ful:14,is_heartbeat_en:14,is_pful:14,isn:[10,14],issu:[3,5,8],item:14,iter:[7,10,14],iterat:14,itself:10,job:[],job_schedul:2,jobmanag:[],jobmanager_main:6,keep:[6,10],kei:[7,8,10],kick:[6,10],know:[2,6,10],kwarg2:2,kwarg:[2,6,7,9,10,11,14],languag:[],larg:12,larger:12,largest:10,last:[2,10,14],last_recv_heartbeat:10,later:8,least:[8,14],leav:[8,12],left:14,length:[14,16],lesser:8,let:8,lib:[],licens:[],like:[6,14,16],limit:14,list:[2,4,6,8,10,12,14,16,19],listen:[6,9,10,11,12,14],load:12,local:12,locat:2,log:[2,6,10],logic:[6,10],longer:[4,12],look:14,loop:[7,10,14],lot:12,low:[],lower:10,mai:[8,10,14],main:6,make:16,malform:4,manag:[],mani:[2,8,11],manual:8,master:8,match:14,med:[],member:10,memebership:10,merchant:8,mess:19,messag:[],message_bodi:17,message_id:17,messageerror:4,met:14,meta:[10,17],method:[2,6,7,10,14],minut:2,mod:[],mode:[],model:12,modifi:8,modul:[1,2,5,6,16],monoton:[10,14,19],more:[8,14,16],most:14,msg:[6,8,10,14,17],msg_id:[],msgid:[6,10,14],multipart:[8,14],multiprocess:[6,12],must:[8,14],name:[2,6,8,9,10,11,12,18],need:[10,11],never:19,next:[7,10,12,19],noavailableworkerslotserror:[4,10],none:[2,6,9,10,11,14,15,17],noop:6,normal:14,note:[6,9,11],notifi:14,now:14,number:[10,12,19],numer:19,obj:10,object:[7,14,16,19],occur:14,off:[6,10],on_ack:14,on_command:[10,14],on_emqp_command:14,on_ful:14,on_heartbeat:[6,10],on_inform:10,on_readi:10,on_receive_repli:[],on_receive_request:[],on_recv:9,on_request:[6,10],on_schedul:14,onc:8,onli:[],onlin:[10,14],option:[2,6,8,9,11,17],order:10,org:8,orient:8,origin:8,original_msg:10,other:[2,8,12],otherwis:[6,9,11,14],out:[6,14],outgo:[6,14],overwhelm:[],own:14,packag:[],page:5,param:2,paramet:[2,6,7,9,10,11,14,15,16,17,18,19],pars:[10,14,17],parse_messag:17,parse_router_messag:17,part:[8,17],particular:[8,11],pass:[2,8,9,14],path:[2,6],payload:17,peer:[4,8,14],peergoneawayerror:[4,10],per:10,pfull:14,philosophi:[],pictur:8,pip:[],placehold:[6,10],point:12,poll:7,poller:[],pollin:7,pollout:7,pool:[8,10],pop:[10,14],popleft:14,port:10,portion:6,possibl:3,practic:14,prefix:[15,17],prepend:8,pretti:[8,12],primari:[],priorit:10,prioriti:10,prioritiess:10,prioritize_queue_list:10,problem:4,process:[8,10,11,12,14],process_client_messag:10,process_messag:[6,14],process_worker_messag:10,programm:14,prop:[],proper:14,properti:[9,11,14],protocol:[],protocol_vers:14,provid:[10,14],pub:8,publish:8,purpos:8,push_notif:14,py2:19,py3:19,python2:[],python3:15,python:14,queu:[],queue:[],queue_messag:[],queue_nam:10,quick:[],rais:[2,4,9,10,11,14,17],random:[16,17],random_charact:16,raw:14,raw_messag:[],readi:[6,8,9,10,11,12,14],rebind:10,rebuild:11,receiv:[],received_disconnect:10,recent:[8,10],reciev:[],recip:[],recipi:[10,14,17],recipient_id:17,recommend:[8,12,14],reconnect:11,recurs:[10,16],recus:10,recv:14,recv_multipart:14,redistribut:8,refer:[6,14,19],regist:[6,7,10],regular:8,reject:14,rel:3,reliabl:8,reload:10,remain:7,remot:14,remov:[8,10,14],reopen:14,rep:9,repli:[2,6,8,17],reply_request:2,repres:19,req:11,request:[],request_queu:[],requeue_work:10,requir:8,requri:[],reset:[10,14],reset_heartbeat_count:[10,14],resourc:[6,8],respond:[8,10,14],respons:[6,9,10,11],restart:[8,11],retri:[2,8,10],retry_count:2,rfc2119:8,rfc:8,right:14,robin:8,roughli:11,round:8,rout:[8,10],router:[],router_main:10,run:[2,6,8,10,12,14],safe:12,sake:19,same:[11,16],schedul:[],scheduler_id:10,scheduler_queu:10,scheduler_zmq_id:10,search:5,second:19,seconds_until:19,section:18,see:[7,8,10,14],self:[6,10,11,14],semi:12,send:[2,4,6,8,10,11,14,17],send_ack:10,send_emqp_messag:17,send_emqp_router_messag:17,send_heartbeat:[10,14],send_inform:14,send_messag:[],send_multipart:14,send_raw:[],send_readi:6,send_request:2,send_schedule_request:2,send_schedulers_heartbeat:10,send_workers_heartbeat:10,sender:[],sender_id:17,sent:[2,8,10,12,14],seper:[2,8,12],serv:8,server:[6,8,12],servic:[8,14],service_typ:14,set:[],setup:[],shall:8,shalt:[],should:[2,4,7,8,9,10,11,12,14,17],shown:8,sighup:10,sighup_handl:10,signal:6,signum:10,similar:12,simpl:[10,16],sinc:19,singl:[8,14],site:[],size:14,skip:[11,14],skip_sign:6,skip_zmqstream:11,slot:10,slow:12,smaller:12,socket:[2,7,8,9,10,11,14,15,17],softwar:8,some:[2,6,12,14,16,17],someon:8,someth:[2,11,12,14,19],somewher:3,sort:16,sourc:[3,5],spawn:6,specif:[],specifi:[8,14,16],standard:12,start:[],start_valu:19,state:14,statu:8,still:[10,12],stop:8,store:10,str:[2,6,9,10,11,14,15,16,17,18],string:[2,8,9,10,11,14,15,17],structur:4,sub:8,subclass:4,subcmd:6,subcommand:[2,6],subject:8,subsequ:[],subset:8,subtract:19,success:8,successfulli:14,support:14,system:[3,10],take:[10,11,14,15,17],taken:[],task:[2,6],tcp:10,tell:6,term:8,test:6,than:[],thei:[2,14],them:9,thi:[1,2,4,6,7,8,9,10,11,12,14,15,16,17,19],thier:12,thing:[2,6,11,12,14,16,17],thou:[],thread:12,threshold:14,through:[8,10],thy:[],time:[],timeout:7,timestamp:[8,10,19],timeutil:[],timezon:[],tip:3,tool:8,topic:8,topolog:[],tornado:[],trace:8,track:[6,10,14],tri:2,tune:12,tupl:[6,7,10,14,16,17],tuplifi:16,type:[2,8,9,10,11,14,16,17],type_:14,typecast:7,typeerror:9,unabl:10,unbind:[9,11],undefin:7,under:8,unicod:15,uniqu:[6,8,10],unit:6,univers:[],unix:8,unknownqueueerror:[4,10],unless:[6,9,11],unprioritized_iter:10,unregist:7,unschedul:[2,8],until:[12,19],untouch:[10,17],unus:8,updat:14,upon:8,upstream:6,usag:19,usual:14,utilit:[],utlitii:14,uuid:[6,9,10,11],vagrant:[],valid:8,valu:[2,7,8,14,16,17,19],valueerror:14,variabl:14,version:[3,8,14],via:[2,19],virtualenv:[],wait:[2,7,12],waiting_messag:10,walk:6,want:[12,14],warn:10,warranti:8,weak:[14,19],web:8,weight:[8,12,14],well:8,went:[],when:[1,2,3,4,6,8,9,10,11,14,15,16],where:[2,8,10,14,19],which:[8,10,14,15],who:[1,10],wish:17,without:[8,11],word:8,work:[3,6,14],worker:[],worker_id:10,worri:8,would:[12,14,19],wrap:[],wrong:[],you:[3,8,10,11,12,14,17],your:[2,8,12,14],zcontext:[9,11],zero_index_cmp:16,zeromq:8,zmq:[7,8,9,10,11,14,15,17],zmqreceivemixin:14,zmqsendmixin:14,zmqstream:11,zsocket:[9,11]},titles:["API Documentation","<code class=\"docutils literal\"><span class=\"pre\">client</span></code> &#8211; Client Utilities","<code class=\"docutils literal\"><span class=\"pre\">messages</span></code> &#8211; Client Messaging","Contributing to EventMQ","<code class=\"docutils literal\"><span class=\"pre\">exceptions</span></code> &#8211; Exceptions","EventMQ Documentation","<code class=\"docutils literal\"><span class=\"pre\">jobmanager</span></code> &#8211; Job Manager","<code class=\"docutils literal\"><span class=\"pre\">poller</span></code> &#8211; Poller","EventMQ Protocol Specification","<code class=\"docutils literal\"><span class=\"pre\">receiver</span></code> &#8211; Receiver","<code class=\"docutils literal\"><span class=\"pre\">router</span></code> &#8211; Router","<code class=\"docutils literal\"><span class=\"pre\">sender</span></code> &#8211; Sender","Settings","Using EventMQ","<code class=\"docutils literal\"><span class=\"pre\">classes</span></code> &#8211; Utility Classes","<code class=\"docutils literal\"><span class=\"pre\">devices</span></code> &#8211; Device Utilities","<code class=\"docutils literal\"><span class=\"pre\">utils</span></code> &#8211; Utilities","<code class=\"docutils literal\"><span class=\"pre\">messages</span></code> &#8211; Message Utilities","<code class=\"docutils literal\"><span class=\"pre\">settings</span></code> &#8211; Settings Utilities","<code class=\"docutils literal\"><span class=\"pre\">timeutils</span></code> &#8211; Time Utilites"],titleterms:{"class":14,address:8,api:0,architectur:8,client:[1,2,8],concurrent_job:12,contribut:3,devic:15,document:[0,5],emqp:8,eventmq:[3,5,8,13],except:4,frame:8,get:[],global:8,glossari:[],goal:8,guid:[],header:8,heartbeat:8,indic:5,job:[6,12],jobmanag:6,languag:8,licens:8,manag:[6,12],messag:[2,17],mod:[],poller:7,protocol:8,queue:12,receiv:9,request:8,router:[8,10,12],schedul:[8,12],sender:11,set:[12,18],specif:8,start:[],style:[],tabl:5,time:19,timeutil:19,topolog:8,util:[1,14,15,16,17,18],utilit:19,welcom:[],worker:8}}) \ No newline at end of file Search.setIndex({envversion:46,filenames:["api","client","client/messages","contributing","exceptions","index","jobmanager","poller","protocol","receiver","router","sender","settings_file","using","utils/classes","utils/devices","utils/index","utils/messages","utils/settings","utils/timeutils"],objects:{"eventmq.client":{messages:[2,0,0,"-"]},"eventmq.client.messages":{defer_job:[2,3,1,""],schedule:[2,3,1,""],send_request:[2,3,1,""],send_schedule_request:[2,3,1,""]},"eventmq.exceptions":{CallableFromPathError:[4,5,1,""],EventMQError:[4,5,1,""],InvalidMessageError:[4,5,1,""],MessageError:[4,5,1,""],NoAvailableWorkerSlotsError:[4,5,1,""],PeerGoneAwayError:[4,5,1,""],UnknownQueueError:[4,5,1,""]},"eventmq.jobmanager":{JobManager:[6,4,1,""],mp_init:[6,3,1,""]},"eventmq.jobmanager.JobManager":{"__init__":[6,2,1,""],concurrent_jobs:[6,1,1,""],jobmanager_main:[6,2,1,""],name:[6,1,1,""],on_heartbeat:[6,2,1,""],on_request:[6,2,1,""],outgoing:[6,1,1,""],queues:[6,1,1,""],send_ready:[6,2,1,""],send_reply:[6,2,1,""]},"eventmq.poller":{Poller:[7,4,1,""]},"eventmq.poller.Poller":{"__init__":[7,2,1,""],poll:[7,2,1,""],register:[7,2,1,""],unregister:[7,2,1,""]},"eventmq.receiver":{Receiver:[9,4,1,""]},"eventmq.receiver.Receiver":{"__init__":[9,2,1,""],connect:[9,2,1,""],listen:[9,2,1,""],name:[9,1,1,""],ready:[9,1,1,""],unbind:[9,2,1,""],zcontext:[9,1,1,""],zsocket:[9,1,1,""]},"eventmq.router":{Router:[10,4,1,""]},"eventmq.router.Router":{add_scheduler:[10,2,1,""],add_worker:[10,2,1,""],clean_up_dead_schedulers:[10,2,1,""],clean_up_dead_workers:[10,2,1,""],get_available_worker:[10,2,1,""],get_status:[10,2,1,""],job_latencies:[10,1,1,""],on_disconnect:[10,2,1,""],on_heartbeat:[10,2,1,""],on_inform:[10,2,1,""],on_ready:[10,2,1,""],on_reply:[10,2,1,""],on_request:[10,2,1,""],prioritize_queue_list:[10,6,1,""],process_client_message:[10,2,1,""],process_worker_message:[10,2,1,""],queues:[10,1,1,""],received_disconnect:[10,1,1,""],requeue_worker:[10,2,1,""],reset_heartbeat_counters:[10,2,1,""],router_main:[10,2,1,""],scheduler_queue:[10,1,1,""],schedulers:[10,1,1,""],send_ack:[10,2,1,""],send_heartbeat:[10,2,1,""],send_schedulers_heartbeats:[10,2,1,""],send_workers_heartbeats:[10,2,1,""],sighup_handler:[10,2,1,""],start:[10,2,1,""],waiting_messages:[10,1,1,""],workers:[10,1,1,""]},"eventmq.sender":{Sender:[11,4,1,""]},"eventmq.sender.Sender":{"__init__":[11,2,1,""],connect:[11,2,1,""],listen:[11,2,1,""],name:[11,1,1,""],ready:[11,1,1,""],rebuild:[11,2,1,""],unbind:[11,2,1,""],zcontext:[11,1,1,""],zsocket:[11,1,1,""]},"eventmq.utils":{classes:[14,0,0,"-"],devices:[15,0,0,"-"],messages:[17,0,0,"-"],random_characters:[16,3,1,""],settings:[18,0,0,"-"],timeutils:[19,0,0,"-"],tuplify:[16,3,1,""],zero_index_cmp:[16,3,1,""]},"eventmq.utils.classes":{EMQPService:[14,4,1,""],EMQdeque:[14,4,1,""],HeartbeatMixin:[14,4,1,""],ZMQReceiveMixin:[14,4,1,""],ZMQSendMixin:[14,4,1,""]},"eventmq.utils.classes.EMQPService":{"__weakref__":[14,1,1,""],is_heartbeat_enabled:[14,1,1,""],on_ack:[14,2,1,""],process_message:[14,2,1,""],reset:[14,2,1,""],send_inform:[14,2,1,""],start:[14,2,1,""]},"eventmq.utils.classes.EMQdeque":{"__init__":[14,2,1,""],"__weakref__":[14,1,1,""],append:[14,2,1,""],appendleft:[14,2,1,""],extend:[14,2,1,""],is_empty:[14,2,1,""],is_full:[14,2,1,""],is_pfull:[14,2,1,""],pop:[14,2,1,""],popleft:[14,2,1,""],remove:[14,2,1,""]},"eventmq.utils.classes.HeartbeatMixin":{"__init__":[14,2,1,""],"__weakref__":[14,1,1,""],is_dead:[14,2,1,""],reset_heartbeat_counters:[14,2,1,""],send_heartbeat:[14,2,1,""]},"eventmq.utils.classes.ZMQReceiveMixin":{"__weakref__":[14,1,1,""],recv:[14,2,1,""],recv_multipart:[14,2,1,""]},"eventmq.utils.classes.ZMQSendMixin":{"__weakref__":[14,1,1,""],send:[14,2,1,""],send_multipart:[14,2,1,""]},"eventmq.utils.devices":{generate_device_name:[15,3,1,""]},"eventmq.utils.messages":{fwd_emqp_router_message:[17,3,1,""],generate_msgid:[17,3,1,""],parse_message:[17,3,1,""],parse_router_message:[17,3,1,""],send_emqp_message:[17,3,1,""],send_emqp_router_message:[17,3,1,""]},"eventmq.utils.settings":{import_settings:[18,3,1,""]},"eventmq.utils.timeutils":{IntervalIter:[19,4,1,""],monotonic:[19,3,1,""],seconds_until:[19,3,1,""],timestamp:[19,3,1,""]},"eventmq.utils.timeutils.IntervalIter":{"__init__":[19,2,1,""],"__weakref__":[19,1,1,""]},eventmq:{client:[1,0,0,"-"],exceptions:[4,0,0,"-"],jobmanager:[6,0,0,"-"],poller:[7,0,0,"-"],receiver:[9,0,0,"-"],router:[10,0,0,"-"],sender:[11,0,0,"-"],utils:[16,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","method","Python method"],"3":["py","function","Python function"],"4":["py","class","Python class"],"5":["py","exception","Python exception"],"6":["py","classmethod","Python class method"]},objtypes:{"0":"py:module","1":"py:attribute","2":"py:method","3":"py:function","4":"py:class","5":"py:exception","6":"py:classmethod"},terms:{"0mq":[8,14],"5min":19,"__init__":[6,7,9,11,14,19],"__weakref__":[14,19],"_empty_":8,"_headers_":8,"_issu":[],"_msg_":8,"_msgid_":8,"_queue_name_":8,"_queues_":8,"_recipient_id":14,"_sourc":[],"_topic_name_":8,"_unix_ts_":8,"abstract":8,"boolean":14,"case":[8,14,19],"class":[],"default":[2,6,8,9,10,11,12,14],"float":[14,19],"function":[2,6],"import":[2,3,6,10,12,18],"int":[2,7,8,10,14,19],"long":[7,14],"new":[6,10,14],"public":8,"return":[2,3,7,9,10,11,14,15,16,17,19],"short":10,"true":[8,9,10,11,14],"while":8,abl:[10,12],about:[6,8,10],absolut:3,accept:[8,12,14],account:[10,17],ack:[6,8,10],ackd_msgid:14,acknowledg:[6,8,10],across:8,act:[1,8],activ:[],active_job:[],actual:[6,10],add:10,add_schedul:10,add_work:10,addr:[9,11,14],address:[],administrative_addr:10,after:8,agre:8,all:[2,4,6,8,9,10,11,14],allow:8,alon:[],alpha:8,alreadi:10,also:14,alwai:2,and_data:17,ani:[2,8,10,16],announc:10,anoth:[6,10,12],anyth:12,api:[],app:14,appear:7,append:14,appendleft:14,appened:10,appli:18,applic:[2,8],architectur:[],aren:[],arg2:2,arg3:2,arg:[2,6,7,9,10,11,14],argument:14,arithmet:19,around:[],arrai:8,ascii:15,assign:12,assum:19,attempt:[4,10],attr:7,automat:14,avail:[4,10],available_slot:10,available_work:[],awaiting_ack:14,back:[8,10,14],backend_addr:10,backward:14,base:[4,7,12,14],basi:8,becaus:[10,14],becom:12,been:[2,10,14],befor:[2,7,8],begin:[10,12,14],belong:10,below:8,best:2,between:[2,8],bin:[],block:12,bool:[2,6,9,11,14],boot:19,both:[7,8],box:12,broadcast:8,broker:[6,8,14],broker_addr:6,buffer:10,build:[10,11],build_module_path:[],built:8,bulid:9,busi:[],calcul:19,call:[7,10,14],callabl:[2,4,6,9],callable_nam:4,callablefrompatherror:4,callback:14,can:[1,2,6,8,10,14,15,17],captur:14,care:15,caus:15,certain:14,chang:8,charact:16,check:[9,11,14],child:6,choos:12,circuit:10,class_arg:[2,6],class_kwarg:[2,6],classmethod:10,clean:8,clean_up_dead_schedul:10,clean_up_dead_work:10,clear:10,cli:10,client:[],clock:19,close:[14,19],cmp:16,code:[3,5,14],collect:14,colon:[2,12],column:[],com:[],come:[2,10],comma:8,command:[2,6,8,10,14,17],compar:16,compat:14,complet:8,compon:8,concurr:12,conf:12,config:12,configur:[2,10,18],connction:[9,11],connect:[6,8,9,10,11,14,17],consist:8,construct:4,contact:4,contain:[1,8,10,14,16],content:[],context:[6,9,11],control:12,contruct:14,convers:8,convert:16,convienc:[7,14],copi:6,core:12,correctli:[],count:[6,8,10,19],counter:[10,14],cpu:12,creat:[10,11,16],cron:2,cross:[],csv:8,current:[9,10,11,14],custom:10,cycl:12,data:[10,17],data_process:12,deal:16,dealer:11,death:14,debounc:2,debounce_deferred_job:2,debounce_sec:2,debug:8,decor:[],decrypt:[],decsend:10,def:[],defeat:8,defer:2,defer_job:2,defin:[2,6,8,9,11,14,19],deliv:[6,8],denot:2,depth:10,dequ:14,describ:8,descript:8,detail:8,detect:8,determin:8,devic:[],dialog:8,dict:[2,6,7],dictionari:[7,8,10],did:[],die:10,differ:3,directli:[7,14],disabl:2,disconnect:[],distribut:8,doe:14,doesn:7,don:[6,8],dot:2,down:[12,19],dst:19,duplic:10,dure:11,each:10,easi:[],effici:12,effort:2,either:[8,14],elaps:8,element:[10,14],els:[3,8],email:[8,12],empti:[8,17],emq:10,emqdequ:14,emqp:[],emqpservic:14,enabl:[2,14],encod:15,encount:[2,4],end:[2,14],enderlab:[],ensur:[2,6,8,14],entri:10,equal:12,error:[2,14,15],etc:[10,12],evalu:2,even:8,event:[7,14],eventloop:[],eventmqerror:4,everi:[2,6],everyth:15,exampl:[10,12,14,19],except:[],exectu:10,execut:[2,8,12,19],exist:[4,6],explicitli:[12,14],expos:6,extend:14,extra:8,fail:[2,4,8],failur:2,fair:8,fals:[2,8,9,11,14],featur:15,few:3,field:8,file:12,filter:[],find:14,finish:[8,10],first:[8,10,14,17],fit:8,flag:[2,7],follow:[2,8,14],fork:6,form:14,format:[2,6,8,10,17],forward:[10,14,17],found:[4,10,12],foundat:8,frame:[],free:8,from:[4,6,7,8,9,10,11,14,19],frontend_addr:10,full:14,func:[2,6,14],fwd_emqp_router_messag:17,gener:[6,7,8,9,11,17],generate_device_nam:15,generate_msgid:17,get_available_work:10,get_statu:10,github:[],give:2,given:10,gmtime:[],gnu:8,goal:[],good:14,group:12,guarante:[2,8],guarente:2,hand:16,handl:[6,8,10,14],handler:6,happen:[2,7,10,11],hard:14,hasn:10,have:[2,12,14,17],haven:10,header:[],heartbeat:[],heartbeat_timeout:10,heartbeati:14,heartbeatmixin:14,heavi:8,help:12,helper:14,here:[8,10],high:[],highest:12,hit:14,home:[],hope:8,how:[2,7],html:8,http:8,id_:[],ident:[8,15],identifi:10,ietf:8,ignor:[8,14],immedi:[2,8],immediatli:2,implement:[8,14],impli:8,import_set:18,inbetween:[],includ:[2,8,14],incom:[],index:[5,10,16],indexerror:10,indiviud:12,inform:[2,6,8,10,14],inform_typ:[],inherit:4,ini:[12,18],initi:[2,14],insert:[8,14],instal:3,instanc:6,instanti:[2,6],instead:8,integ:10,intens:12,interest:16,intern:4,interpret:8,interv:[2,8,19],interval_min:[],interval_sec:[2,19],intervalit:19,intes:[],invalidmessageerror:[4,10],is_dead:14,is_empti:14,is_ful:14,is_heartbeat_en:14,is_pful:14,isn:[10,14],issu:[3,5,8],item:14,iter:[7,10,14],iterat:14,itself:10,job:[],job_lat:10,job_schedul:2,jobmanag:[],jobmanager_main:6,keep:[6,10],kei:[7,8,10],keyword:[],kick:[6,10],know:[2,6,10],kwarg2:2,kwarg:[2,6,7,9,10,11,14],languag:[],larg:12,larger:12,largest:10,last:[2,10,14],last_recv_heartbeat:10,lataneci:10,latenc:10,later:8,least:[8,14],leav:[8,12],left:14,length:[14,16],lesser:8,let:8,lib:[],licens:[],like:[6,14,16],limit:14,list:[2,4,6,8,10,12,14,16,19],listen:[6,9,10,11,12,14],load:12,local:12,locat:2,log:[2,6,10],logic:[6,10],longer:[4,12],look:14,loop:[7,10,14],lot:12,low:[],lower:10,mai:[8,10,14],main:6,make:16,malform:4,manag:[],mani:[2,8,11],manual:8,master:8,match:14,measur:10,med:[],member:10,memebership:10,merchant:8,mess:19,messag:[],message_bodi:17,message_id:17,messageerror:4,met:14,meta:[10,17],method:[2,6,7,10,14],minut:2,mod:[],mode:[],model:12,modifi:8,modul:[1,5,6,16],monoton:[10,14,19],more:[2,8,14,16],most:14,mp_init:6,msg:[6,8,10,14,17],msg_id:[],msgid:[6,10,14],multipart:[8,14],multiprocess:[6,12],must:[8,14],name:[2,6,8,9,10,11,12,18],need:[6,10,11],never:[6,19],next:[7,10,12,19],noavailableworkerslotserror:[4,10],nohast:8,none:[2,6,9,10,11,14,15,17],noop:6,normal:14,note:[6,9,11],notifi:14,now:14,number:[2,10,12,19],numer:19,obj:10,object:[7,14,16,19],occur:14,off:[6,10],offlin:[],on_ack:14,on_command:[10,14],on_disconnect:10,on_emqp_command:14,on_ful:14,on_heartbeat:[6,10],on_inform:10,on_readi:10,on_receive_repli:[],on_receive_request:[],on_recv:9,on_repli:10,on_request:[6,10],on_schedul:14,onc:8,onli:[],onlin:[10,14],option:[2,6,8,9,11,17],order:10,org:8,orient:8,origin:8,original_msg:10,other:[2,8,12],otherwis:[6,9,11,14],out:[6,14],outgo:[6,14],overwhelm:[],own:14,packag:[],page:5,param:2,paramet:[2,6,7,9,10,11,14,15,16,17,18,19],pars:[10,14,17],parse_messag:17,parse_router_messag:17,part:[8,17],particular:[8,11],pass:[2,8,9,14],path:[2,4,6],payload:17,peer:[4,8,14],peergoneawayerror:[4,10],pend:8,per:10,pfull:14,philosophi:[],pictur:8,pip:[],placehold:[6,10],point:12,poll:7,poller:[],pollin:7,pollout:7,pool:[8,10],pop:[10,14],popleft:14,port:10,portion:6,possibl:3,practic:14,prefix:[15,17],prepar:10,prepend:8,pretti:[8,12],primari:[],priorit:10,prioriti:10,prioritiess:10,prioritize_queue_list:10,problem:4,process:[6,8,10,11,12,14],process_client_messag:10,process_messag:[6,14],process_worker_messag:10,programm:14,prop:[],proper:14,properti:[9,11,14],protocol:[],protocol_vers:14,provid:[10,14],pub:8,publish:8,purpos:8,push_notif:14,py2:19,py3:19,python2:[],python3:15,python:[6,14],queu:[],queue:[],queue_messag:[],queue_nam:10,quick:[],rais:[2,4,9,10,11,14,17],random:[16,17],random_charact:16,raw:14,raw_messag:[],readi:[6,8,9,10,11,12,14],rebind:10,rebuild:11,rebuilt:6,receiv:[],received_disconnect:10,recent:[8,10],reciev:[],recip:[],recipi:[6,10,14,17],recipient_id:17,recommend:[8,12,14],reconnect:11,recurs:[10,16],recus:10,recv:14,recv_multipart:14,redistribut:8,refer:[6,8,14,19],regist:[6,7,10],regular:8,reject:14,rel:3,reliabl:8,reload:10,remain:7,remot:14,remov:[8,10,14],reopen:14,rep:9,repli:[2,6,8,10,17],reply_request:2,repres:19,req:11,request:[],request_queu:[],requeue_work:10,requir:8,requri:[],reset:[10,14],reset_heartbeat_count:[10,14],resourc:[6,8],respond:[8,10,14],respons:[6,9,10,11],restart:[8,11],retri:[2,8,10],retry_count:2,rfc2119:8,rfc:8,right:14,robin:8,roughli:11,round:8,rout:[8,10],router:[],router_main:10,run:[2,6,8,10,12,14],safe:12,sake:19,same:[11,16],schedul:[],scheduler_id:10,scheduler_queu:10,scheduler_zmq_id:10,search:5,sec:2,second:[2,19],seconds_until:19,section:18,see:[2,7,8,10,14],self:[6,10,11,14],semi:12,send:[2,4,6,8,10,11,14,17],send_ack:10,send_emqp_messag:17,send_emqp_router_messag:17,send_heartbeat:[10,14],send_inform:14,send_kby:[],send_messag:[],send_multipart:14,send_raw:[],send_readi:6,send_repli:6,send_request:2,send_schedule_request:2,send_schedulers_heartbeat:10,send_workers_heartbeat:10,sender:[],sender_id:17,sent:[2,6,8,10,12,14],seper:[2,8,12],serial:10,serv:8,server:[6,8,12],servic:[8,14],service_typ:14,set:[],setup:[],shall:8,shalt:[],should:[2,4,7,8,9,10,11,12,14,17],shown:8,sighup:10,sighup_handl:10,signal:6,signum:10,similar:12,simpl:[10,16],sinc:19,singl:[8,14],site:[],size:14,skip:[11,14],skip_sign:6,skip_zmqstream:11,slot:10,slow:12,smaller:12,socket:[2,6,7,8,9,10,11,14,15,17],softwar:8,some:[2,6,12,14,16,17],someon:8,someth:[2,11,12,14,19],somewher:3,sort:16,sourc:[3,5],spawn:6,specif:[],specifi:[8,14,16],standard:12,start:[],start_valu:19,state:[10,14],statu:8,still:[10,12],stop:8,store:10,str:[2,6,9,10,11,14,15,16,17,18],string:[2,8,9,10,11,14,15,17],structur:4,sub:8,subclass:4,subcmd:6,subcommand:[2,6],subject:8,subsequ:[],subset:8,subtract:19,success:8,successfulli:14,support:14,system:[3,10],take:[10,11,14,15,17],taken:[],task:[2,6],tcp:10,tell:6,term:8,termin:6,test:6,than:[],thei:[2,14],them:9,thi:[1,2,4,6,7,8,9,10,11,12,14,15,16,17,19],thier:12,thing:[2,6,11,12,14,16,17],those:6,thou:[],thread:12,threshold:14,through:[8,10],thy:[],time:[],timeout:7,timestamp:[8,10,19],timeutil:[],timezon:[],tip:3,tool:8,topic:8,topolog:[],tornado:[],trace:8,track:[6,10,14],tri:2,tune:12,tupl:[6,7,10,14,16,17],tuplifi:16,type:[2,8,9,10,11,14,16,17],type_:14,typecast:7,typeerror:9,uint:[],unabl:10,unbind:[9,11],undefin:7,under:8,unicod:15,uniqu:[6,8,10],unit:6,univers:[],unix:8,unknownqueueerror:[4,10],unless:[6,9,11],unprioritized_iter:10,unregist:7,unschedul:[2,8],until:[12,19],untouch:[10,17],unus:8,updat:14,upon:8,upstream:6,usag:19,usual:14,utilit:[],utlitii:14,uuid:[6,9,10,11],vagrant:[],valid:8,valu:[2,7,8,10,14,16,17,19],valueerror:14,variabl:14,version:[3,8,14],via:[2,19],virtualenv:[],wait:[2,7,12],waiting_messag:10,walk:6,want:[8,12,14],warn:10,warranti:8,weak:[14,19],web:8,weight:[8,12,14],well:8,went:[],when:[1,2,3,4,6,8,9,10,11,14,15,16],where:[2,8,10,14,19],which:[8,10,14,15],who:[1,10],wish:17,without:[6,8,11],word:8,work:[3,6,14],worker:[],worker_id:10,worri:8,would:[12,14,19],wrap:[],wrong:[],you:[3,8,10,11,12,14,17],your:[2,8,12,14],zcontext:[9,11],zero_index_cmp:16,zeromq:8,zmq:[7,8,9,10,11,14,15,17],zmqreceivemixin:14,zmqsendmixin:14,zmqstream:11,zsocket:[9,11]},titles:["API Documentation","<code class=\"docutils literal\"><span class=\"pre\">client</span></code> &#8211; Client Utilities","<code class=\"docutils literal\"><span class=\"pre\">messages</span></code> &#8211; Client Messaging","Contributing to EventMQ","<code class=\"docutils literal\"><span class=\"pre\">exceptions</span></code> &#8211; Exceptions","EventMQ Documentation","<code class=\"docutils literal\"><span class=\"pre\">jobmanager</span></code> &#8211; Job Manager","<code class=\"docutils literal\"><span class=\"pre\">poller</span></code> &#8211; Poller","EventMQ Protocol Specification","<code class=\"docutils literal\"><span class=\"pre\">receiver</span></code> &#8211; Receiver","<code class=\"docutils literal\"><span class=\"pre\">router</span></code> &#8211; Router","<code class=\"docutils literal\"><span class=\"pre\">sender</span></code> &#8211; Sender","Settings","Using EventMQ","<code class=\"docutils literal\"><span class=\"pre\">classes</span></code> &#8211; Utility Classes","<code class=\"docutils literal\"><span class=\"pre\">devices</span></code> &#8211; Device Utilities","<code class=\"docutils literal\"><span class=\"pre\">utils</span></code> &#8211; Utilities","<code class=\"docutils literal\"><span class=\"pre\">messages</span></code> &#8211; Message Utilities","<code class=\"docutils literal\"><span class=\"pre\">settings</span></code> &#8211; Settings Utilities","<code class=\"docutils literal\"><span class=\"pre\">timeutils</span></code> &#8211; Time Utilites"],titleterms:{"class":14,address:8,api:0,architectur:8,client:[1,2,8],concurrent_job:12,contribut:3,devic:15,disconnect:8,document:[0,5],emqp:8,eventmq:[3,5,8,13],except:4,frame:8,get:[],global:8,glossari:[],goal:8,guid:[],header:8,heartbeat:8,indic:5,job:[6,12],jobmanag:6,kbai:8,languag:8,licens:8,manag:[6,12],messag:[2,17],mod:[],poller:7,protocol:8,queue:12,receiv:9,request:[],router:[8,10,12],schedul:[8,12],sender:11,set:[12,18],specif:8,start:[],style:[],tabl:5,time:19,timeutil:19,topolog:8,util:[1,14,15,16,17,18],utilit:19,welcom:[],worker:8}}) \ No newline at end of file
diff --git a/sender.html b/sender.html
index 2c4f7a7..d5d3234 100644
--- a/sender.html
+++ b/sender.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/settings_file.html b/settings_file.html
index ba17599..290a57e 100644
--- a/settings_file.html
+++ b/settings_file.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/using.html b/using.html
index 56471af..41d264b 100644
--- a/using.html
+++ b/using.html
@@ -60,7 +60,7 @@
60 60
61 61
62 <div class="version"> 62 <div class="version">
63 0.2.1 63 0.2.6.2
64 </div> 64 </div>
65 65
66 66
diff --git a/utils/classes.html b/utils/classes.html
index a18e66e..e0ca5eb 100644
--- a/utils/classes.html
+++ b/utils/classes.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/utils/devices.html b/utils/devices.html
index ab3b6ce..89baede 100644
--- a/utils/devices.html
+++ b/utils/devices.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/utils/index.html b/utils/index.html
index 0a370e0..65c0c92 100644
--- a/utils/index.html
+++ b/utils/index.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/utils/messages.html b/utils/messages.html
index 6ecfa47..8f06b99 100644
--- a/utils/messages.html
+++ b/utils/messages.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/utils/settings.html b/utils/settings.html
index a209af0..57e912c 100644
--- a/utils/settings.html
+++ b/utils/settings.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67
diff --git a/utils/timeutils.html b/utils/timeutils.html
index 0815b80..8003f70 100644
--- a/utils/timeutils.html
+++ b/utils/timeutils.html
@@ -61,7 +61,7 @@
61 61
62 62
63 <div class="version"> 63 <div class="version">
64 0.2.1 64 0.2.6.2
65 </div> 65 </div>
66 66
67 67