SQL queries for messaging engine state assessment

View the state of the messaging engine directly from the database when troubleshooting potential object queue issues.

You can use the following SQL queries to assess the state of the messaging engine.

The following query shows the runtime configuration of object queues.

SELECT 
         A.ID, A.CLASSCODE, A.NAME, A.CAPTION, A.PRIORITY, A.CONCURRENCY, A.CUSTOMIZED, A.SYSTEM, A.THROTTLECOUNTERID,
         TIMEOUT, SENDENABLED, RECEIVEENABLED, ERRORCOUNT, C.NAME ERRORQUEUE, NODETYPE
FROM 
         OQQUEUE A 
         JOIN OQOBJECTQUEUE B ON B.ID = A.ID
         LEFT JOIN OQQUEUE C ON C.ID = B.ERRORQUEUEID
ORDER BY
         A.NAME
The following query shows the messages that are not in the error queue.
SELECT 
        A.*, B.NAME QUEUENAME, C.NAME ORIGINALQUEUE, D.NAME RESENDQUEUE 
FROM 
        OQMESSAGE A
        JOIN OQQUEUE B ON B.ID = A.QUEUEID
        JOIN OQQUEUE C ON C.ID = A.ORIGINALQUEUEID
        JOIN OQQUEUE D ON D.ID = A.RESENDQUEUEID
WHERE 
        B.ID NOT IN (SELECT DISTINCT (ERRORQUEUEID) FROM OQOBJECTQUEUE WHERE 
        ERRORQUEUEID IS NOT NULL)
        /*/*UNCOMMENT TO FILTER BY A STATE*/ AND A.STATECODE = /*/*blocked*/'B'*/  
        /*/*dispatched*/'D'*/  /*/*errored*/'E'*/ /*/*new*/'N'*/  /*/*currently 
        processing*/'P'*/  /*/*waiting on a resource*/'W'*/ */
ORDER BY 
        A.NAME, A.DELIVERYTIME ASC
The following query shows the messages that are in the error queue.
SELECT 
         A.*, B.NAME ERRORQUEUENAME 
FROM 
         OQMESSAGE A
         JOIN OQQUEUE B ON B.ID = A.QUEUEID
WHERE 
         A.QUEUEID IN (SELECT ERRORQUEUEID FROM OQOBJECTQUEUE)
ORDER BY 
         A.DELIVERYTIME ASC

The following query shows the messages that are ready for processing but are waiting for a node.

SELECT 
         A.*, B.NAME QUEUENAME, C.NAME ORIGINALQUEUE, D.NAME RESENDQUEUE 
FROM 
         OQMESSAGE A
         JOIN OQQUEUE B ON B.ID = A.QUEUEID  
         JOIN OQQUEUE C ON C.ID = A.ORIGINALQUEUEID
         JOIN OQQUEUE D ON D.ID = A.RESENDQUEUEID
         AND A.STATECODE = 'P' AND NODEID = 0X0
ORDER BY 
         A.NAME, A.DELIVERYTIME ASC
The following query shows the currently processing messages by node.
SELECT 
        E.NAME NODENAME, A.*, B.NAME QUEUENAME, C.NAME ORIGINALQUEUE, D.NAME RESENDQUEUE 
FROM 
        OQMESSAGE A
        JOIN OQQUEUE B ON B.ID = A.QUEUEID
        JOIN OQQUEUE C ON C.ID = A.ORIGINALQUEUEID
        JOIN OQQUEUE D ON D.ID = A.RESENDQUEUEID
        JOIN NJNODE E ON E.ID = A.NODEID
        AND A.STATECODE = 'P' AND NODEID <> 0X0
ORDER BY 
        A.NODEID, A.NAME, A.DELIVERYTIME ASC
The following query shows the queue depth count by queue, state, and message.
SELECT 
        A.NAME OBJECTQUEUE, B.STATECODE, B.NAME MESSAGE, COUNT(1) COUNT
FROM 
        OQQUEUE A
        JOIN OQMESSAGE B ON B.QUEUEID = A.ID
WHERE 
        A.ID NOT IN (SELECT DISTINCT (ERRORQUEUEID) FROM OQOBJECTQUEUE WHERE ERRORQUEUEID IS NOT NULL)
GROUP BY 
        A.NAME, B.STATECODE, B.NAME
ORDER BY 
        A.NAME, B.STATECODE, B.NAME
The following query shows the error queue depth count by queue, state, and message.
SELECT 
        A.NAME ERRORQUEUE, B.STATECODE, B.NAME MESSAGE, COUNT(1) COUNT
FROM 
        OQQUEUE A
        JOIN OQMESSAGE B ON B.QUEUEID = A.ID
WHERE 
        A.ID IN (SELECT DISTINCT (ERRORQUEUEID) FROM OQOBJECTQUEUE WHERE ERRORQUEUEID IS NOT NULL)
GROUP BY 
        A.NAME, B.STATECODE, B.NAME
ORDER BY 
        A.NAME, B.STATECODE, B.NAME
The following query identifes the dispatcher node.
SELECT
         A.*, B.* 
FROM 
         OQOBJECTQUEUEDISPATCHER A
         JOIN NJNODE B ON B.ID = A.NODEID
The following query triggers a dispatcher restart.
UPDATE OQOBJECTQUEUEDISPATCHER SET NODEID = NULL, ADDRESS = NULL;
The following query restricts object queue traffic to a specfic subnet.
UPDATE OQOBJECTQUEUEDISPATCHER SET NETWORK = '0/0' /*ACCEPTS CIDR ADDRESSES*/