From 41b2025fe4e22689599ae1c2d7feb91b2e978d7e Mon Sep 17 00:00:00 2001
From: jason
Date: Wed, 21 Sep 2016 12:58:12 -0600
Subject: docs updates
---
_sources/protocol.txt | 118 +++++++++++++---------
_static/pygments.css | 2 +
api.html | 2 +-
client.html | 2 +-
client/messages.html | 27 +----
contributing.html | 2 +-
exceptions.html | 8 +-
genindex.html | 39 +++++--
index.html | 2 +-
jobmanager.html | 30 +++++-
objects.inv | Bin 1369 -> 1419 bytes
poller.html | 2 +-
protocol.html | 275 +++++++++++++++++++++++++++++++-------------------
py-modindex.html | 2 +-
receiver.html | 2 +-
router.html | 37 ++++++-
search.html | 2 +-
searchindex.js | 2 +-
sender.html | 2 +-
settings_file.html | 2 +-
using.html | 2 +-
utils/classes.html | 2 +-
utils/devices.html | 2 +-
utils/index.html | 2 +-
utils/messages.html | 2 +-
utils/settings.html | 2 +-
utils/timeutils.html | 2 +-
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
Goals
=====
-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
+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.
The goals are to:
* Specify a protocol to follow when implementing a component to EventMQ.
- * Allow requests to be routed to workers by an abstracted service name.
+ * Allow requests to be routed to workers by an abstracted service name (named queues).
* Detect disconnected peers through heartbeating.
* Allow for message tracing and debugging.
@@ -60,6 +60,52 @@ FRAME Value Description
4 _MSGID_ The message id of the message this ACK is acknowledging
====== ============== ===========
+A **REPLY** frame consists of a 5-frame multipart message, formatted as follows.
+
+====== ============== ===========
+FRAME Value Description
+====== ============== ===========
+0 _EMPTY_ leave empty
+1 eMQP/1.0 Protocol version
+2 REPLY command
+3 _MSGID_ A unique id for the msg
+4 _MSG_ The reply to respond with
+====== ============== ===========
+
+A **HEARTBEAT** frame consists of a
+
+====== ============== ===========
+FRAME Value Description
+====== ============== ===========
+0 _EMPTY_ leave empty
+1 eMQP/1.0 Protocol version
+2 HEARTBEAT command
+3 _MSGID_ A unique id for the msg
+4 _UNIX_TS_ A unix timestamp
+====== ============== ===========
+
+A **DISCONNECT** frame consists of
+
+====== ============== ===========
+FRAME Value Description
+====== ============== ===========
+0 _EMPTY_ leave empty
+1 eMQP/1.0 Protocol version
+2 DISCONNECT command
+3 _MSGID_ A unique id for the msg
+====== ============== ===========
+
+A **KBAI** frame consists of
+
+====== ============== ===========
+FRAME Value Description
+====== ============== ===========
+0 _EMPTY_ leave empty
+1 eMQP/1.0 Protocol version
+2 KBAI command
+3 _MSGID_ A unique id for the msg
+====== ============== ===========
+
eMQP / Client
-------------
A **REQUEST** command consists of a 7-frame multipart message, formatted as follows.
@@ -159,44 +205,9 @@ FRAME Value Description
3 _MSGID_ A unique id for the msg
====== ============== ===========
-A **REPLY** frame consists of a 5-frame multipart message, formatted as follows.
-
-====== ============== ===========
-FRAME Value Description
-====== ============== ===========
-0 _EMPTY_ leave empty
-1 eMQP/1.0 Protocol version
-2 REPLY command
-3 _MSGID_ A unique id for the msg
-4 _MSG_ The reply to respond with
-====== ============== ===========
-
-A **HEARTBEAT** frame consists of a
-
-====== ============== ===========
-FRAME Value Description
-====== ============== ===========
-0 _EMPTY_ leave empty
-1 eMQP/1.0 Protocol version
-2 HEARTBEAT command
-3 _MSGID_ A unique id for the msg
-4 _UNIX_TS_ A unix timestamp
-====== ============== ===========
-
-A **DISCONNECT** frame consists of
-
-====== ============== ===========
-FRAME Value Description
-====== ============== ===========
-0 _EMPTY_ leave empty
-1 eMQP/1.0 Protocol version
-2 DISCONNECT command
-3 _MSGID_ A unique id for the msg
-====== ============== ===========
-
Heartbeating
------------
- * HEARTBEAT commands are valid at any time after an INFORM command
+ * HEARTBEAT commands are valid at any time after an INFORM command.
* Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands.
* Worker and broker MUST send heartbeats at regular and agreed-upon intervals.
* Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals.
@@ -204,16 +215,29 @@ Heartbeating
* If the broker detects that a worker has disconnected it should stop sending it a message of any type.
* If the scheduler detects that the broker disconnects it SHOULD restart the conversation.
-REQUEST Headers
+Headers
---------------
-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.
+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.
Below is a table which defines and describes the headers.
-=============== ======= ======= ======= ===========
-Header REQUEST PUBLISH Default Description
-=============== ======= ======= ======= ===========
-reply-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.
-retry-count:# X 0 Retry a failed job this many times before accepting defeat.
-guarantee X False Ensure the job completes by letting someone else worry about a success reply.
-=============== ======= ======= ======= ===========
+
+================= ======= ======= ======== ======= ===========
+Header REQUEST PUBLISH SCHEDULE Default Description
+================= ======= ======= ======== ======= ===========
+reply-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.
+retry-count:# X 0 Retry a failed job this many times before accepting defeat.
+guarantee X False Ensure the job completes by letting someone else worry about a success reply.
+nohaste 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.
+================= ======= ======= ======== ======= ===========
+
+DISCONNECT and KBAI
+===================
+When a component receives a DISCONNECT command it:
+ * MUST send a KBAI command to all connected components.
+ * MUST stop sending and receiving any messages
+ * MUST allow any pending messages or jobs to complete.
+
+When a component receives a KBAI command it:
+ * MUST stop sending any messages to the disconnecting component.
+ * 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 @@
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.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 @@
- 0.2.1
+ 0.2.6.2
diff --git a/client.html b/client.html
index 86c2456..dab0af9 100644
--- a/client.html
+++ b/client.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
@@ -149,28 +149,9 @@
messages – Client Messaging
-
--
-
eventmq.client.messages.build_module_path(func)
-Builds the module path in string format for a callable.
-
-
-
-
-| Parameters: | func (callable) – The function or method to build the path for |
-
-| Returns: | (import path (w/ class seperated by a ‘:’), callable name) or
-(None, None) on error |
-
-| Return type: | list |
-
-
-
-
-
-
-
eventmq.client.messages.defer_job(socket, func, args=(), kwargs=None, class_args=(), class_kwargs=None, reply_requested=False, guarantee=False, retry_count=0, queue='default')
+eventmq.client.messages.defer_job(socket, func, args=(), kwargs=None, class_args=(), class_kwargs=None, reply_requested=False, guarantee=False, retry_count=0, debounce_secs=False, queue='default')
Used to send a job to a worker to execute via socket.
This tries not to raise any exceptions so use some of the message flags to
guarentee things.
@@ -188,11 +169,11 @@ initializing (if applicable).
- class_kwargs (dict) – dict of **kwargs to pass to the class when
initializing (if applicable).
- reply_requested (bool) – request the return value of func as a reply
-- guarantee (bool) – (Give your best effort) to guarantee that func is
-executed. Exceptions and things will be logged.
- retry_count (int) – How many times should be retried when encountering
an Exception or some other failure before giving up. (default: 0
or immediately fail)
+- debounce_secs (secs) – Number of seconds to debounce the job. See
+debounce_deferred_job for more information.
- queue (str) – Name of queue to use when executing the job. If this value
evaluates to False, the default is used. Default: is configured
default queue name
diff --git a/contributing.html b/contributing.html
index 205bd46..45ee99e 100644
--- a/contributing.html
+++ b/contributing.html
@@ -60,7 +60,7 @@
- 0.2.1
+ 0.2.6.2
diff --git a/exceptions.html b/exceptions.html
index 4f94f7f..b3a9914 100644
--- a/exceptions.html
+++ b/exceptions.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
@@ -146,6 +146,12 @@
These are the exceptions that are raised by EventMQ. All exceptions should
be subclasses of EventMQError
+
+-
+exception
eventmq.exceptions.CallableFromPathError
+Raised when construction of a callable from a path and callable_name fails.
+
+
-
exception
eventmq.exceptions.EventMQError
diff --git a/genindex.html b/genindex.html
index dbfbf25..6bd3f7f 100644
--- a/genindex.html
+++ b/genindex.html
@@ -59,7 +59,7 @@
- 0.2.1
+ 0.2.6.2
@@ -132,7 +132,6 @@
_
|
A
- |
B
|
C
|
D
|
E
@@ -243,19 +242,13 @@
-
B
+
C
-
-
C
-
@@ -457,6 +454,10 @@
+ - job_latencies (eventmq.router.Router attribute)
+
+
+
- JobManager (class in eventmq.jobmanager)
@@ -492,10 +493,14 @@
- MessageError
+
+ - monotonic() (in module eventmq.utils.timeutils)
+
+
|
- - monotonic() (in module eventmq.utils.timeutils)
+
- mp_init() (in module eventmq.jobmanager)
|
@@ -535,6 +540,10 @@
+ - on_disconnect() (eventmq.router.Router method)
+
+
+
- on_heartbeat() (eventmq.jobmanager.JobManager method)
@@ -555,6 +564,10 @@
+ - on_reply() (eventmq.router.Router method)
+
+
+
- on_request() (eventmq.jobmanager.JobManager method)
@@ -775,6 +788,10 @@
+ - send_reply() (eventmq.jobmanager.JobManager method)
+
+
+
- send_request() (in module eventmq.client.messages)
diff --git a/index.html b/index.html
index 738c479..f401403 100644
--- a/index.html
+++ b/index.html
@@ -59,7 +59,7 @@
- 0.2.1
+ 0.2.6.2
diff --git a/jobmanager.html b/jobmanager.html
index aa262fa..7712021 100644
--- a/jobmanager.html
+++ b/jobmanager.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
@@ -263,6 +263,34 @@ of work.
for another REQUEST message.
+
+-
+
send_reply(res)
+Sends an REPLY response
+
+
+
+
+| Parameters: |
+- socket (socket) – The socket to use for this ack
+- recipient (str) – The recipient id for the ack
+- msgid – The unique id that we are acknowledging
+
+ |
+
+
+
+
+
+
+
+
+-
+
eventmq.jobmanager.mp_init()
+The instance of Context is copied when python multiprocessing fork()s the
+worker processes, so we need to terminate that Context so a new one can be
+rebuilt. Without doing this, messages sent from functions in those child
+processes will never be delivered.
diff --git a/objects.inv b/objects.inv
index ac41242..79ff0a4 100644
Binary files a/objects.inv and b/objects.inv differ
diff --git a/poller.html b/poller.html
index 60e660e..4d406ae 100644
--- a/poller.html
+++ b/poller.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
diff --git a/protocol.html b/protocol.html
index 274f8d1..828731e 100644
--- a/protocol.html
+++ b/protocol.html
@@ -60,7 +60,7 @@
- 0.2.1
+ 0.2.6.2
@@ -97,9 +97,10 @@
- eMQP / Scheduler
- eMQP / Worker
- Heartbeating
-- REQUEST Headers
+- Headers
+- DISCONNECT and KBAI
- Source Code
@@ -157,12 +158,12 @@
The status of this document is alpha and subject to heavy change
Goals
-
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
+
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.
The goals are to:
- Specify a protocol to follow when implementing a component to EventMQ.
-- Allow requests to be routed to workers by an abstracted service name.
+- Allow requests to be routed to workers by an abstracted service name (named queues).
- Detect disconnected peers through heartbeating.
- Allow for message tracing and debugging.
@@ -231,15 +232,12 @@
-
-
-
eMQP / Client
-
A REQUEST command consists of a 7-frame multipart message, formatted as follows.
+
A REPLY frame consists of a 5-frame multipart message, formatted as follows.
-
-
-
+
+
+
| FRAME |
@@ -257,7 +255,7 @@
Protocol version |
| 2 |
-REQUEST |
+REPLY |
command |
| 3 |
@@ -265,25 +263,17 @@
A unique id for the msg |
| 4 |
-_QUEUE_NAME_ |
-the name of the queue the request should be sent to |
-
-| 5 |
-_HEADERS_ |
-dictionary of headers. can be an empty set |
-
-| 6 |
_MSG_ |
-The message to send |
+The reply to respond with |
-
A PUBLISH command consists of a 7-frame multipart messag, formatted as follows.
+
A HEARTBEAT frame consists of a
-
-
-
+
+
+
| FRAME |
@@ -301,7 +291,7 @@
Protocol version |
| 2 |
-PUBLISH |
+HEARTBEAT |
command |
| 3 |
@@ -309,25 +299,17 @@
A unique id for the msg |
| 4 |
-_TOPIC_NAME_ |
-the name of the topic this message should be published across |
-
-| 5 |
-_HEADERS_ |
-csv list of headers |
-
-| 6 |
-_MSG_ |
-The message to send |
+_UNIX_TS_ |
+A unix timestamp |
-
A SCHEDULE command consists of a 7-frame multipart message, formatted as follows.
+
A DISCONNECT frame consists of
-
-
-
+
+
+
| FRAME |
@@ -345,28 +327,51 @@
Protocol version |
| 2 |
-SCHEDULE |
+DISCONNECT |
command |
| 3 |
_MSGID_ |
A unique id for the msg |
-| 4 |
-_QUEUE_NAME_ |
-name of queue that the job should run in |
+
+
+
A KBAI frame consists of
+
+
+
+
+
+
+
+| FRAME |
+Value |
+Description |
-| 5 |
-_HEADERS_ |
-csv list of headers for this message |
+
+
+| 0 |
+_EMPTY_ |
+leave empty |
-| 6 |
-_MSG_ |
-The message to send |
+
| 1 |
+eMQP/1.0 |
+Protocol version |
+
+| 2 |
+KBAI |
+command |
+
+| 3 |
+_MSGID_ |
+A unique id for the msg |
-
An UNSCHEDULE command consists of a 7-frame multipart message, formatted as follows.
+
+
+
eMQP / Client
+
A REQUEST command consists of a 7-frame multipart message, formatted as follows.
@@ -389,7 +394,7 @@
| Protocol version |
| 2 |
-UNSCHEDULE |
+REQUEST |
command |
| 3 |
@@ -398,11 +403,11 @@
| 4 |
_QUEUE_NAME_ |
-ignored for this command, broadcasted to all queues |
+the name of the queue the request should be sent to |
| 5 |
_HEADERS_ |
-csv list of headers for this message |
+dictionary of headers. can be an empty set |
| 6 |
_MSG_ |
@@ -410,15 +415,12 @@
-
-
-
eMQP / Scheduler
-
An INFORM command consists of a 6-frame multipart message, formatted as follows.
+
A PUBLISH command consists of a 7-frame multipart messag, formatted as follows.
-
-
-
+
+
+
| FRAME |
@@ -436,7 +438,7 @@
Protocol version |
| 2 |
-INFORM |
+PUBLISH |
command |
| 3 |
@@ -444,24 +446,25 @@
A unique id for the msg |
| 4 |
- |
-Queues. Unused for scheduler |
+_TOPIC_NAME_ |
+the name of the topic this message should be published across |
| 5 |
-scheduler |
-type of peer connecting |
+_HEADERS_ |
+csv list of headers |
+
+| 6 |
+_MSG_ |
+The message to send |
-
-
-
eMQP / Worker
-
An INFORM command consists of a 5-frame multipart message, formatted as follows.
+
A SCHEDULE command consists of a 7-frame multipart message, formatted as follows.
-
-
-
+
+
+
| FRAME |
@@ -479,7 +482,7 @@
Protocol version |
| 2 |
-INFORM |
+SCHEDULE |
command |
| 3 |
@@ -487,21 +490,25 @@
A unique id for the msg |
| 4 |
-_QUEUES_ |
-csv seperated arrays containing an int and a string for weight and name. e.g. [40, ‘email’] |
+_QUEUE_NAME_ |
+name of queue that the job should run in |
| 5 |
-worker |
-type of peer connecting |
+_HEADERS_ |
+csv list of headers for this message |
+
+| 6 |
+_MSG_ |
+The message to send |
-
A READY frame consists of a 4-frame multipart message, formatted as follows.
+
An UNSCHEDULE command consists of a 7-frame multipart message, formatted as follows.
-
-
-
+
+
+
| FRAME |
@@ -519,21 +526,36 @@
Protocol version |
| 2 |
-READY |
+UNSCHEDULE |
command |
| 3 |
_MSGID_ |
A unique id for the msg |
+| 4 |
+_QUEUE_NAME_ |
+ignored for this command, broadcasted to all queues |
+
+| 5 |
+_HEADERS_ |
+csv list of headers for this message |
+
+| 6 |
+_MSG_ |
+The message to send |
+
-
A REPLY frame consists of a 5-frame multipart message, formatted as follows.
+
+
+
eMQP / Scheduler
+
An INFORM command consists of a 6-frame multipart message, formatted as follows.
-
-
+
+
| FRAME |
@@ -551,7 +573,7 @@
Protocol version |
| 2 |
-REPLY |
+INFORM |
command |
| 3 |
@@ -559,17 +581,24 @@
A unique id for the msg |
| 4 |
-_MSG_ |
-The reply to respond with |
+ |
+Queues. Unused for scheduler |
+
+| 5 |
+scheduler |
+type of peer connecting |
-
A HEARTBEAT frame consists of a
+
+
+
eMQP / Worker
+
An INFORM command consists of a 5-frame multipart message, formatted as follows.
-
-
-
+
+
+
| FRAME |
@@ -587,7 +616,7 @@
Protocol version |
| 2 |
-HEARTBEAT |
+INFORM |
command |
| 3 |
@@ -595,12 +624,16 @@
A unique id for the msg |
| 4 |
-_UNIX_TS_ |
-A unix timestamp |
+_QUEUES_ |
+csv seperated arrays containing an int and a string for weight and name. e.g. [40, ‘email’] |
+
+| 5 |
+worker |
+type of peer connecting |
-
A DISCONNECT frame consists of
+
A READY frame consists of a 4-frame multipart message, formatted as follows.
@@ -623,7 +656,7 @@
| Protocol version |
| 2 |
-DISCONNECT |
+READY |
command |
| 3 |
@@ -637,7 +670,7 @@
Heartbeating
-- HEARTBEAT commands are valid at any time after an INFORM command
+- HEARTBEAT commands are valid at any time after an INFORM command.
- Any command except DISCONNECT act as a heartbeat. Peers SHOULD NOT send HEARTBEAT commands while sending other commands.
- Worker and broker MUST send heartbeats at regular and agreed-upon intervals.
- Scheduler and broker MUST send heartbeats at regular and agreed-upon intervals.
@@ -647,22 +680,24 @@
-
+
+
DISCONNECT and KBAI
+
+- When a component receives a DISCONNECT command it:
+
+- MUST send a KBAI command to all connected components.
+- MUST stop sending and receiving any messages
+- MUST allow any pending messages or jobs to complete.
+
+
+- When a component receives a KBAI command it:
+
+- MUST stop sending any messages to the disconnecting component.
+- SHOULD Clean up references to the disconnecting component.
+
+
+
+
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 @@
- 0.2.1
+ 0.2.6.2
diff --git a/receiver.html b/receiver.html
index ccce6d3..664c268 100644
--- a/receiver.html
+++ b/receiver.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
diff --git a/router.html b/router.html
index 86fe30d..ca90e13 100644
--- a/router.html
+++ b/router.html
@@ -61,7 +61,7 @@
- 0.2.1
+ 0.2.6.2
@@ -225,6 +225,30 @@ self.queues
+
+-
+
get_status()
+
+- Return
+- (str) Serialized information about the current state of the router.
+
+
+
+
+-
+
job_latencies = None
+Latency tracking dictionary
+Key: msgid of message each REQUEST received and forwarded to a worker
+Value: (timestamp, queue_name)
+
+
+
+-
+
on_disconnect(msgid, msg)
+Prepare router for disconnecting by removing schedulers, clearing
+worker queue (if needed), and removing workers.
+
+
-
on_heartbeat(sender, msgid, msg)
@@ -259,6 +283,13 @@ and announces itself.
+
+-
+
on_reply(sender, msgid, msg)
+Handles an REPLY message. Replies are sent by the worker for latanecy
+measurements
+
+
-
on_request(sender, msgid, msg, depth=1)
@@ -465,7 +496,7 @@ process receives a SIGHUP from the system.
-
-
start(frontend_addr='tcp://127.0.0.1:47291', backend_addr='tcp://127.0.0.1:47290')
+start(frontend_addr='tcp://127.0.0.1:47291', backend_addr='tcp://127.0.0.1:47290', administrative_addr='tcp://127.0.0.1:47293')
Begin listening for connections on the provided connection strings
@@ -474,6 +505,8 @@ process receives a SIGHUP from the system.
| Parameters: |
- frontend_addr (str) – connection string to listen for requests
- backend_addr (str) – connection string to listen for workers
+- administrative_addr (str) – connection string to listen for emq-cli
+commands on.
|
diff --git a/search.html b/search.html
index c280580..ad81164 100644
--- a/search.html
+++ b/search.html
@@ -58,7 +58,7 @@
- 0.2.1
+ 0.2.6.2
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","client – Client Utilities","messages – Client Messaging","Contributing to EventMQ","exceptions – Exceptions","EventMQ Documentation","jobmanager – Job Manager","poller – Poller","EventMQ Protocol Specification","receiver – Receiver","router – Router","sender – Sender","Settings","Using EventMQ","classes – Utility Classes","devices – Device Utilities","utils – Utilities","messages – Message Utilities","settings – Settings Utilities","timeutils – 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","client – Client Utilities","messages – Client Messaging","Contributing to EventMQ","exceptions – Exceptions","EventMQ Documentation","jobmanager – Job Manager","poller – Poller","EventMQ Protocol Specification","receiver – Receiver","router – Router","sender – Sender","Settings","Using EventMQ","classes – Utility Classes","devices – Device Utilities","utils – Utilities","messages – Message Utilities","settings – Settings Utilities","timeutils – 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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
diff --git a/using.html b/using.html
index 56471af..41d264b 100644
--- a/using.html
+++ b/using.html
@@ -60,7 +60,7 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
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 @@
- 0.2.1
+ 0.2.6.2
--
cgit v1.2.1