The PUT attribute controls whether applications may add messages to a queue. Production work queues almost always use PUT(ENABLED) so producers can MQPUT. PUT(DISABLED) creates a read-only queue for applications: consumers may still drain with GET(ENABLED), but new application puts are refused at open time. Operations use that pattern during producer migrations, incident isolation, and graceful drain. PUT does not replace security—OAM must still grant put authority—and it does not stop queue manager internal puts from channels on the receiving side. This tutorial explains ENABLED versus DISABLED, interaction with GET and MAXDEPTH, put-only versus get-only queue designs, reason codes, and safe ALTER procedures.
| Value | Application MQPUT | Existing messages |
|---|---|---|
| ENABLED | Allowed with authority | Can grow with puts |
| DISABLED | Blocked for apps | Can shrink via gets only |
Applications open with MQOO_OUTPUT or MQOO_INQUIRE as needed. If PUT is DISABLED, put-intent open fails. Syncpoint puts require connection and open success before MQPUT. Batch producers opening once and putting thousands of messages need stable handles—ALTER PUT(DISABLED) mid-run may fail subsequent puts on reopen. Plan changes between batch windows.
1234DEFINE QLOCAL('LEGACY.IN') REPLACE PUT(DISABLED) GET(ENABLED) + DESCR('Drain only - producers migrated to ORDERS.IN') ALTER QLOCAL('ORDERS.IN') PUT(ENABLED) GET(ENABLED) DISPLAY QLOCAL('LEGACY.IN') PUT GET CURDEPTH
If producers still run, depth stays flat or grows slowly—find stray jobs before declaring drain complete. Initiation queues and triggers on the old queue should be TRIGGER(DISABLED) to avoid starting consumers that expect new work.
Applications put to QREMOTE or QALIAS names; PUT attribute on the resolved queue matters after resolution. Authority is checked on the name used and target. A QALIAS to a PUT-disabled queue blocks producers using the alias. Remote puts store on XMITQ—the XMITQ must allow the queue manager to place messages (normal internal behavior).
PUT(ENABLED) with CURDEPTH at MAXDEPTH returns queue full on MQPUT—not a PUT attribute issue. Fix by consuming, raising MAXDEPTH after capacity review, or shedding load. PUT(DISABLED) fails earlier at open—producers should distinguish in logs for faster triage.
Rare patterns: audit archive fed only by replication may use GET(DISABLED) PUT(ENABLED) for the feeder and opposite on the reader queue. Initiation queues should not receive application PUT. DLQ needs both for handlers that requeue. Document asymmetric GET/PUT clearly in DESCR to prevent operators enabling wrong combination during incidents.
PUT is whether new letters can be dropped into the mailbox. ENABLED means yes (with permission). DISABLED means the slot is sealed for new mail—people can still take mail out if GET allows.
Write MQSC to drain LEGACY.IN while blocking new puts.
Producer open fails after ALTER. PUT disabled or 2035? How to tell?
Why does PUT(DISABLED) not stop remote channel delivery to QLOCAL?
1. PUT(DISABLED) means:
2. Read-only drain pattern uses:
3. PUT(ENABLED) still requires:
4. Producer 2053 with PUT enabled suggests: