MIRTH-2806: Fixed the IllegalStateException occurring in JavaScript contexts when another channel is deployed manually. It's actually incorrect to get the current context and only enter if we're creating it for the first time. Instead, we should be entering every single time, because calls to enter/exit need to be balanced.
Updated channel statistics tracking in Donkey so that stats are tracked by server id. Different servers accessing the same database will now only see their own statistics on the dashboard.
Issue: MIRTH-2792
MIRTH-2767: Added a server.userutil Attachment class. This works differently than the other userutil classes; instead of simply wrapping a server class, Attachment is a standalone object. JavaScriptAttachmentHandler actually creates a list of userutil Attachments and converts them to Donkey Attachments in nextAttachment(). The attachment methods in JavaScriptBuilder have also been updated to call AttachmentUtil rather than the message controllers directly, and a few methods have been added to AttachmentUtil to facilitate this.
MIRTH-2727: Added a ChannelUtil userutil class to handle manual channel operations such as start/stop/deploy/undeploy/etc., as well as to get information like channel/connector states and statistics.
Destination connectors can now utilize multiple queue threads at once. Using more than one queue thread does not guarantee message order, but allows multiple messages to be sent at once. Each dispatcher must individually be thread safe in order to use multiple queue threads correctly. Donkey is agnostic to whether the dispatcher is thread safe and will allow multiple queue threads to be set regardless. Therefore as a separate task we will need to update each dispatcher.

Removed the PersistedBlockingQueue and PersistedBlockingQueueDataSource classes. ConnectorMessageQueue and ConnectorMessageQueueDataSource now contain full implementations without relying on parent classes/interfaces.

ConnectorMessageQueue now has acquire() and release() methods which allow the queue to be used by multiple consumers. When acquire() is used, release() MUST be called when the consumer moves on to another message.

ConnectorMessageQueue now uses a LinkedHashMap as its internal buffer rather than a LinkedBlockingQueue, because the LinkedBlockingQueue features were not required. LinkedHashMap allows us to update the buffer when queue items are released.

Added a queue thread count option to the queue settings panel and queue connector properties
Issue: MIRTH-2791
MIRTH-2792
Added server_id column to the connector message table (d_mm) and made the server_id column in d_m and d_mm not null since they should never be null.

Modified JdbcDao.updateStatus() so that it will throw a runtime exception if it detects that the message no longer exists for the current server. This is done in case multiple servers are using a single database and server #1 either deletes or reprocesses a message that is currently being processed by server #2. When this happens, we want server #2 to halt processing that particular message and continue processing any additional messages.

Fixed potential problems with message recovery when multiple servers are sharing a database.

In the source queue thread, we now catch any RuntimeExceptions that occur while processing a message, log the exception and continue to the next message in the queue. Before this change the queue thread would halt.

MIRTH-2807
Added Original Server Id column to the message browser.