Outbound data on an IBM MQ channel does not always leave the queue manager exactly as the application formatted it. When SENDEXIT is set, the Message Channel Agent invokes your send exit program for each buffer (or according to exit rules) so the organization can wrap, compress, stamp, or log traffic before it hits TCP. That power comes with coupling: the remote queue manager almost always needs RCVEXIT logic that understands your wrapper format. Beginners troubleshooting stuck transmission queues sometimes find SENDEXIT on the SDR while the partner RCVR was rebuilt without RCVEXIT during a migration—messages never commit correctly and channels cycle through RETRYING. This page covers SENDEXIT definition syntax, symmetric design with RCVEXIT, interaction with batching attributes, differences from TLS and SCYEXIT, client-channel considerations, and operational discipline for exit upgrades.
Applications MQPUT to local or remote queues. For remote destinations, messages land on a transmission queue; the sender channel reads them, segments into protocol buffers, optionally passes each buffer through SENDEXIT, then writes to the socket. On the far side RCVEXIT reverses the transform before messages become local puts. Exits see binary data, not COBOL copybooks or JSON—translation between business format and wire format stays in applications unless your exit explicitly parses payloads (discouraged for performance and fragility).
| Mechanism | When it runs | Industry standard? |
|---|---|---|
| SENDEXIT | MCA outbound buffer | Custom site or vendor |
| TLS (SSLCIPH) | TCP connect handshake | Yes (TLS) |
| SCYEXIT | Security checkpoints | Custom |
| Application encrypt | Before MQPUT | Application choice |
12345678DEFINE CHANNEL('HUB.TO.SPOKE') CHLTYPE(SDR) TRPTYPE(TCP) + CONNAME('spoke.corp.com(1414)') XMITQ('SPOKE.XMIT') + SENDEXIT('corpSnd(WRAP=v2)') BATCHSZ(50) DEFINE CHANNEL('HUB.TO.SPOKE') CHLTYPE(RCVR) TRPTYPE(TCP) + RCVEXIT('corpRcv(WRAP=v2)') DISPLAY CHANNEL('HUB.TO.SPOKE') SENDEXIT RCVEXIT BATCHSZ STOP CHANNEL('HUB.TO.SPOKE') START CHANNEL('HUB.TO.SPOKE')
corpSnd and corpRcv stand in for real module names from your exits directory. WRAP=v2 is user data both exits must interpret identically. BATCHSZ(50) batches up to fifty messages per buffer where supported—exit authors must handle batched buffers correctly or restrict BATCHSZ when using fragile transforms.
Cluster sender channels (CLUSSDR) can carry SENDEXIT when hub-to-spoke transforms are required. Reply traffic on requester-server pairs may need SENDEXIT on the side that originates responses if responses are wrapped. Map both directions on paper: A to B and B to A may need different exit attributes. Fire-and-forget one-way feeds are simpler than request-reply with exits on both legs.
SENDEXIT is the packing station that tapes and labels every box before it goes on the truck. The receiver must have instructions (RCVEXIT) to cut the tape and read the label. If you change the tape machine model without telling the receiver, the dock rejects every box.
SENDEXIT is a robot that changes every outgoing package before the mail truck picks it up, so the friend receiving it needs their own robot to change it back.
Given SDR with SENDEXIT only, predict symptoms on RCVR with blank RCVEXIT.
List attributes to DISPLAY before and after removing legacy SENDEXIT during TLS migration.
Explain why BATCHSZ might be lowered when debugging a new send exit.
1. SENDEXIT runs on:
2. Compression SENDEXIT on SDR requires on RCVR:
3. SENDEXIT blank on both sides means:
4. SENDEXIT impact on performance: