Comandos esenciales para administrar IBM MQ Queue Managers

IBM MQ continúa siendo una tecnología fundamental en muchas arquitecturas empresariales donde las aplicaciones necesitan intercambiar mensajes de manera segura, confiable y asíncrona.

Si trabajas como administrador de middleware, Production Support, DevOps o SRE, conocer los principales comandos de IBM MQ puede ayudarte a identificar y resolver rápidamente problemas relacionados con Queue Managers, queues, channels, listeners y mensajes.

En esta guía veremos algunos de los comandos que considero más útiles en la administración diaria de IBM MQ sobre Linux/Unix.

1. Mostrar los Queue Managers

Uno de los primeros comandos que debemos conocer es:

dspmq

Ejemplo:

QMNAME(QM_PROD)     STATUS(Running)
QMNAME(QM_TEST)     STATUS(Ended normally)

También podemos consultar información de un Queue Manager específico:

dspmq -m QM_PROD

Este comando nos permite comprobar rápidamente si el Queue Manager se encuentra ejecutándose.


2. Iniciar un Queue Manager

strmqm QM_PROD

Después podemos comprobar su estado:

dspmq -m QM_PROD

Resultado esperado:

QMNAME(QM_PROD) STATUS(Running)

3. Detener un Queue Manager

Una parada controlada puede realizarse con:

endmqm QM_PROD

Una opción habitual es:

endmqm -w QM_PROD

-w espera a que el Queue Manager termine antes de devolver el control al shell.

IBM MQ también dispone de modos de terminación más agresivos, pero en producción no deberían utilizarse automáticamente sin entender el impacto sobre aplicaciones, transacciones y mensajes.


4. Entrar a MQSC

Una de las herramientas más importantes para un administrador IBM MQ es runmqsc.

runmqsc QM_PROD

Después veremos:

Starting MQSC for queue manager QM_PROD.

Ahora podemos ejecutar comandos MQSC como:

DISPLAY QMGR

Para salir:

END

También podemos utilizar:

QUIT

5. Mostrar información del Queue Manager

Dentro de runmqsc:

DISPLAY QMGR

Para mostrar todos los atributos:

DISPLAY QMGR ALL

Esto proporciona información importante sobre la configuración del Queue Manager.


6. Mostrar todas las queues

DISPLAY QUEUE(*)

Forma abreviada:

DIS Q(*)

Sin embargo, en ambientes grandes puede generar mucha información.

Para consultar una queue específica:

DISPLAY QLOCAL(APP.REQUEST.Q)

Forma abreviada:

DIS QL(APP.REQUEST.Q)

7. Revisar la profundidad de una queue

Uno de los comandos más importantes para Production Support:

DISPLAY QLOCAL(APP.REQUEST.Q) CURDEPTH

Por ejemplo:

AMQ8409I: Display Queue details.
   QUEUE(APP.REQUEST.Q)
   TYPE(QLOCAL)
   CURDEPTH(1250)

CURDEPTH indica cuántos mensajes existen actualmente en la queue.

También resulta útil revisar:

DISPLAY QLOCAL(APP.REQUEST.Q) CURDEPTH MAXDEPTH

Por ejemplo:

CURDEPTH(1250)
MAXDEPTH(5000)

Esto permite determinar qué tan cerca se encuentra la queue de su capacidad máxima.


8. Revisar procesos conectados a una queue

Cuando una queue comienza a crecer, queremos saber si existen productores y consumidores.

DISPLAY QSTATUS(APP.REQUEST.Q) IPPROCS OPPROCS CURDEPTH

Los atributos principales son:

IPPROCS

Número de aplicaciones que tienen la queue abierta para input.

OPPROCS

Número de aplicaciones que tienen la queue abierta para output.

Ejemplo:

CURDEPTH(5000)
IPPROCS(0)
OPPROCS(3)

Esto es una pista muy importante.

Tenemos productores enviando mensajes, pero aparentemente ningún consumidor procesándolos.


9. Mostrar todas las local queues

DISPLAY QLOCAL(*)

Forma abreviada:

DIS QL(*)

Queues remotas:

DISPLAY QREMOTE(*)

Alias:

DISPLAY QALIAS(*)

10. Revisar una Transmission Queue

En arquitecturas distribuidas IBM MQ, las transmission queues son fundamentales.

DISPLAY QLOCAL(QM_REMOTE.XMITQ) CURDEPTH

Si la CURDEPTH comienza a crecer, puede existir un problema con el sender channel o con la conectividad hacia el Queue Manager remoto.

Un flujo conceptual sería:

Application
     ↓
Remote Queue
     ↓
Transmission Queue
     ↓
Sender Channel
     ↓
Network
     ↓
Receiver Channel
     ↓
Remote Queue Manager
     ↓
Local Queue

11. Mostrar channels

DISPLAY CHANNEL(*)

Forma abreviada:

DIS CHL(*)

Consultar un channel:

DISPLAY CHANNEL(TO.QM_REMOTE)

Para conocer el estado de channels activos:

DISPLAY CHSTATUS(*)

o:

DIS CHS(*)

12. Consultar un channel específico

DISPLAY CHSTATUS(TO.QM_REMOTE)

Podemos encontrar estados como:

RUNNING
RETRYING
STOPPED
INACTIVE
BINDING
INITIALIZING

Para troubleshooting, RETRYING es especialmente importante.

Si encontramos:

STATUS(RETRYING)

debemos investigar por qué el sender channel no logra establecer o mantener la comunicación.


13. Iniciar un channel

START CHANNEL(TO.QM_REMOTE)

Después:

DISPLAY CHSTATUS(TO.QM_REMOTE)

14. Detener un channel

STOP CHANNEL(TO.QM_REMOTE)

En producción debemos entender primero el impacto, ya que detener un channel puede interrumpir el flujo de mensajes entre Queue Managers.


15. Revisar la conexión del channel

Un comando muy útil:

DISPLAY CHSTATUS(TO.QM_REMOTE) ALL

También podemos enfocarnos en determinados atributos:

DISPLAY CHSTATUS(TO.QM_REMOTE) STATUS CONNAME XMITQ

Esto nos ayuda a relacionar:

Channel
   ↓
Connection
   ↓
Transmission Queue

16. Listeners

Mostrar listeners:

DISPLAY LISTENER(*)

Consultar su estado:

DISPLAY LSSTATUS(*)

Listener específico:

DISPLAY LSSTATUS(LISTENER.TCP)

17. Iniciar un listener

START LISTENER(LISTENER.TCP)

Detenerlo:

STOP LISTENER(LISTENER.TCP)

18. Revisar conexiones al Queue Manager

DISPLAY CONN(*)

Este comando puede generar bastante información en sistemas grandes.

También podemos utilizar:

DISPLAY CONN(*) TYPE(CONN)

Para troubleshooting, las conexiones permiten investigar qué aplicaciones o procesos están conectados al Queue Manager.


19. Revisar el estado de una queue

Uno de mis comandos favoritos para troubleshooting:

DISPLAY QSTATUS(APP.REQUEST.Q) ALL

O solamente los atributos que necesitamos:

DISPLAY QSTATUS(APP.REQUEST.Q) CURDEPTH IPPROCS OPPROCS

Esto proporciona rápidamente una imagen de:

Mensajes
+
Productores
+
Consumidores

20. Consultar mensajes sin desarrollar una aplicación

IBM MQ proporciona amqsbcg, una utilidad de ejemplo muy conocida para examinar mensajes.

amqsbcg APP.REQUEST.Q QM_PROD

Puede ser útil para troubleshooting porque permite navegar mensajes sin consumirlos como lo haría una aplicación normal.

En producción debemos tener cuidado al mostrar mensajes porque pueden contener información sensible.


21. Colocar un mensaje de prueba

Otra utilidad de ejemplo:

amqsput APP.REQUEST.Q QM_PROD

Escribimos:

Test message from Folken IT

Presionamos Enter y posteriormente una línea vacía para terminar.


22. Leer mensajes

amqsget APP.REQUEST.Q QM_PROD

Atención: a diferencia de browsing, amqsget puede consumir/eliminar mensajes de la queue.

Por esa razón:

amqsbcg

y:

amqsget

no deben confundirse durante troubleshooting en producción.


23. Revisar Dead Letter Queue

Primero podemos identificar la DLQ configurada:

DISPLAY QMGR DEADQ

Por ejemplo:

DEADQ(SYSTEM.DEAD.LETTER.QUEUE)

Después:

DISPLAY QLOCAL(SYSTEM.DEAD.LETTER.QUEUE) CURDEPTH

Si CURDEPTH es mayor que cero, debemos investigar por qué existen mensajes que MQ no pudo entregar correctamente.


24. Error logs del Queue Manager

En Linux/Unix, una ubicación habitual de los errores del Queue Manager es:

/var/mqm/qmgrs/<QMGR>/errors/

Archivos típicos:

AMQERR01.LOG
AMQERR02.LOG
AMQERR03.LOG

Por ejemplo:

tail -100 /var/mqm/qmgrs/QM_PROD/errors/AMQERR01.LOG

Seguirlo:

tail -f /var/mqm/qmgrs/QM_PROD/errors/AMQERR01.LOG

Estos logs son fundamentales para investigar errores de channels, seguridad, recursos, networking y otros componentes de MQ.


25. Crear una local queue

Dentro de runmqsc:

DEFINE QLOCAL(APP.REQUEST.Q)

Con atributos:

DEFINE QLOCAL(APP.REQUEST.Q) MAXDEPTH(10000) DEFPSIST(YES)

26. Modificar una queue

ALTER QLOCAL(APP.REQUEST.Q) MAXDEPTH(20000)

Verificar:

DISPLAY QLOCAL(APP.REQUEST.Q) MAXDEPTH

27. Limpiar una queue

IBM MQ permite eliminar todos los mensajes de una local queue:

CLEAR QLOCAL(APP.REQUEST.Q)

Este es un comando que debes tratar con muchísimo cuidado.

En producción:

CLEAR QLOCAL(...)

puede provocar pérdida irreversible de mensajes.

Nunca debería utilizarse simplemente porque una queue tiene muchos mensajes.

Primero debemos entender por qué está creciendo.


28. Comandos que deberías memorizar

Si estás comenzando con IBM MQ, recomiendo dominar primero estos:

dspmq

strmqm QM_PROD

endmqm -w QM_PROD

runmqsc QM_PROD

Dentro de MQSC:

DISPLAY QMGR

DISPLAY QLOCAL(*)

DISPLAY QLOCAL(APP.Q) CURDEPTH MAXDEPTH

DISPLAY QSTATUS(APP.Q) CURDEPTH IPPROCS OPPROCS

DISPLAY CHANNEL(*)

DISPLAY CHSTATUS(*)

DISPLAY CHSTATUS(CHANNEL.NAME) ALL

DISPLAY LISTENER(*)

DISPLAY LSSTATUS(*)

DISPLAY CONN(*)

DISPLAY QMGR DEADQ

Y desde Linux:

tail -f /var/mqm/qmgrs/QM_PROD/errors/AMQERR01.LOG

Metodología para troubleshooting

Conocer comandos es importante, pero conocer el orden en que debemos investigar es todavía más importante.

Supongamos que una aplicación reporta:

“Los mensajes no están llegando al sistema remoto.”

Podemos investigar de esta manera:

¿Queue Manager está RUNNING?
        ↓
dspmq
        ↓
¿Está creciendo la application queue?
        ↓
CURDEPTH
        ↓
¿Existen consumidores?
        ↓
IPPROCS / OPPROCS
        ↓
¿Está creciendo la XMITQ?
        ↓
Transmission Queue
        ↓
¿Sender Channel está RUNNING?
        ↓
CHSTATUS
        ↓
¿Listener remoto está disponible?
        ↓
Listener / Network
        ↓
¿Existen errores?
        ↓
AMQERR01.LOG
        ↓
¿Hay mensajes en la DLQ?
        ↓
DEADQ
        ↓
Root Cause Analysis

Por ejemplo, si encontramos:

XMITQ CURDEPTH(15000)

CHANNEL STATUS(RETRYING)

ya tenemos una pista muy importante.

El problema probablemente no se encuentra en la aplicación productora.

Los mensajes están llegando al Queue Manager, pero MQ tiene dificultades para enviarlos al sistema remoto.

Ahora debemos investigar el channel, networking, DNS, listener, TLS, autenticación o disponibilidad del Queue Manager remoto.

La regla más importante

Cuando una queue comienza a crecer, no debemos asumir inmediatamente que:

“MQ está fallando.”

La profundidad de la queue es un síntoma.

La causa podría encontrarse en:

  • la aplicación consumidora;
  • un channel;
  • networking;
  • TLS;
  • autenticación/autorización;
  • el Queue Manager remoto;
  • una base de datos utilizada por el consumidor;
  • un sistema downstream;
  • mensajes problemáticos;
  • capacidad o rendimiento.

El trabajo de un administrador de IBM MQ no consiste únicamente en iniciar Queue Managers y limpiar queues.

Consiste en comprender el flujo completo del mensaje, identificar dónde se interrumpió y resolver el problema sin poner en riesgo los mensajes que todavía están en tránsito.

¿Cuantos queu managers te ha tocado administrar y que versiones?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *