CICS MQ triggering is how mainframe shops turn passive queues into live workers without operators typing START every morning. A producer—batch job, remote channel, or another CICS region—MQPUTs business data to an application queue. IBM MQ evaluates TRIGGER, TRIGTYPE, TRIGDPTH, and related attributes. When conditions match, the queue manager writes an internal trigger message to the initiation queue. CKTI, the CICS trigger monitor, MQGETs that trigger message and starts the CICS transaction named in the PROCESS object. That transaction MQGETs the real work from the application queue and runs COBOL or Java business logic. The pattern predates cloud autoscaling but solves the same problem: do not pay for idle CICS tasks when queues are empty, yet react within seconds when work arrives. This tutorial walks the full chain on z/OS, compares TRIGTYPE values for CICS workloads, explains PROCESS and INITQ wiring, covers scaling and failure modes, and ties triggering to the broader CICS-MQ bridge so beginners can configure and troubleshoot message-driven CICS.
| Object | Purpose | CICS note |
|---|---|---|
| QLOCAL (application) | Holds business messages | TRIGGER, TRIGTYPE, INITQ, PROCESS set here |
| QLOCAL (initiation) | Holds trigger messages | CKTI must be authorized to GET |
| PROCESS | Names how to start the app | APPLICID = CICS trans id |
| CKTI transaction | Trigger monitor | Often auto-started with MQ connection |
| Application trans | Runs user program | Must exist in CSD; program linkable |
TRIGTYPE controls when the queue manager generates trigger messages. Choosing the wrong type is the most common design mistake: either nothing starts, or CKTI floods CICS with duplicate transactions during peak load.
| TRIGTYPE | When it fires | Typical CICS use | Caution |
|---|---|---|---|
| FIRST | Queue transitions from empty to non-empty | Night batch idle queues; single worker wake | One starter per idle cycle; may need DEPTH for spikes |
| DEPTH | CURDEPTH reaches or crosses TRIGDPTH | Scale multiple CICS tasks under backlog | Set TRIGDPTH well below MAXDEPTH; cap concurrent tasks |
| EVERY | Per qualifying message | Rare in CICS; extreme rate sensitivity | Can exhaust CICS MXT; avoid high-volume queues |
| NONE | Never (with TRIGGER YES, no events) | Placeholder or disable events only | Use TRIGGER(NO) to fully disable |
TRIGDPTH works with TRIGTYPE(DEPTH). If TRIGDPTH is 500 and MAXDEPTH is 50000, each time depth crosses another 500-message band while work backs up, MQ can request another consumer—subject to trigger monitor behavior and whether an instance is already considered active. Document the maximum CICS tasks your PROCESS design allows; Db2 connection pools and thread limits often fail before MQ does.
123456789101112DEFINE QLOCAL('ORDERS.IN') REPLACE + TRIGGER + TRIGTYPE(FIRST) TRIGDPTH(1) + INITQ('SYSTEM.DEFAULT.INITIATION.QUEUE') + PROCESS('ORDPROC') MAXDEPTH(100000) DEFINE PROCESS('ORDPROC') REPLACE + APPLICID('ORD1') + USERDATA('Order intake from MQ trigger') /* CICS: transaction ORD1 -> program ORDPROG CICS: CKTI defined and active in region RACF: CKTI and ORD1 authorized for MQ queues */
INITQ must be a local queue the queue manager can write to. Many sites use SYSTEM.DEFAULT.INITIATION.QUEUE until naming standards require a dedicated INITQ per application family. PROCESS APPLICID must match a CICS transaction id that starts the correct program with correct COMMAREA or channel if used. USERDATA is opaque bytes some programs read from the trigger message context; keep it short and documented.
CKTI is not optional decoration—it is the CICS-side trigger monitor. If CICS is recycled but MQ keeps accepting puts, trigger messages accumulate on INITQ until CKTI runs again. Operators verify CKTI with CICS inquiry before blaming MQ depth. Multiple CICS regions attached to one queue manager each need a clear architecture: usually one region owns CKTI for a given INITQ, or initiation queues are partitioned per region. Sharing one INITQ across regions without design leads to duplicate starts or races.
CKTI should use short MQGET waits so it does not hold CICS tasks unnecessarily, but not so aggressive that CPU spins. Application transactions started by CKTI may use MQGET with wait intervals appropriate to business SLAs. Long waits in triggered tasks consume MXT slots—consider internal work queues and child transactions for heavy processing.
Some installations run a long-lived CICS transaction that loops MQGET with wait instead of triggering. That model is simpler mentally but consumes a task slot continuously. Triggering saves resources when traffic is bursty or overnight-idle. Hybrid designs trigger the first worker with TRIGTYPE(FIRST) and add workers with TRIGTYPE(DEPTH) when depth grows. Compare electricity bills: triggering is the motion sensor light; permanent listener is the bulb left on.
CKTI needs GET on the initiation queue and authority to start application transactions. Application programs need GET on the application queue and PUT if they reply. RACF profiles for the CICS region userid and transaction definitions must align with MQ object profiles—see the MQ RACF tutorials in this track. A 2035 NOT_AUTHORIZED on INITQ looks like “triggering broken” in operations dashboards.
Think of triggering as a night watchman who only calls the warehouse crew when the loading dock sensor shows cartons arrived. CKTI is the watchman reading the sensor ticket (trigger message). The crew (CICS transaction) unloads cartons (application messages). No cartons, no crew on payroll.
When letters appear in the big mailbox, a bell rings in the office. CKTI hears the bell and tells the right worker to collect the letters. No letters, no bell, worker stays home.
Design TRIGGER attributes for a queue that should wake one CICS task when the first overnight message arrives, then add DEPTH triggers when more than 1000 messages accumulate.
List five DISPLAY and CICS inquiry commands you would run if INITQ depth is 50 and application queue depth is 5000.
Draw a sequence diagram from MQPUT through CKTI to application MQGET.
1. In CICS MQ triggering, who reads the initiation queue?
2. TRIGTYPE(FIRST) is best when:
3. PROCESS APPLICID names:
4. Trigger messages are stored on: