I wrote a program which could be used with local bindings on Linux, or as a client. Doing what I have done for 25 years, and following the IBM documentation I had a makefile with a create for each type.
gcc -m64 -o mer me.o -L/opt/mqm/lib64 -Wl,-rpath=/opt/mqm/lib64 -Wl,-rpath=/usr/lib64 -lmqm
gcc -m64 -o merc me.o -L/opt/mqm/lib64 -Wl,-rpath=/opt/mqm/lib64 -Wl,-rpath=/usr/lib64 -lmqic
Where -lmqm was for local bindings, and -lmqic was for client bindings.
For about the last 10 years, you have only needed one executable, not two!
Thanks to Morag Hughson of MQGem who pointed this out and said You can make a client connection using something linked with mqm.lib. Just set MQ_CONNECT_TYPE to CLIENT. See here.
I only need one program mer, and do not need the client version merc. I used
export MQ_CONNECT_TYPE=CLIENT
export MQCCDTURL=/home/colinpaice/c/ccdt.json
./mer CSQ9 CP0000
and it worked! (First time)
This support has been there since MQ 7.1, so as long as you have compiled your programs with MQ 7.1 or later you can use this support.
I’ll drop an email to Hursley because the documentation for generating a program says, for example
C client application, 64-bit, non-threaded
gcc -m64 -o amqsputC_64 amqsput0.c -I MQ_INSTALLATION_PATH/inc -L MQ_INSTALLATION_PATH/lib64 -Wl,-rpath=MQ_INSTALLATION_PATH/lib64 -Wl,-rpath=/usr/lib64 -lmqic
C server application, 64-bit, non-threaded
gcc -m64 -o amqsput_64 amqsput0.c -I MQ_INSTALLATION_PATH/inc -L MQ_INSTALLATION_PATH/lib64 -Wl,-rpath=MQ_INSTALLATION_PATH/lib64 -Wl,-rpath=/usr/lib64 -lmqm
It would be good if they told you about this great facility, and not only have it hidden away.
You could just build it once, and set the environment variable.
Using it
The documentation for MQ_CONNECT_TYPE says this is for MQCONNX.
If your application uses MQCONNX, then it will try local, then try as a client (using MQCCDTURL environment variable), and you do not even need to specify MQ_CONNECT_TYPE. You can force it to use local or client by speciying MQ_CONNECT_TYPE.
My application was using the old style of MQCONN. For this to work I had to specify MQ_CONNECT_TYPE=CLIENT (and the MQCCDTURL).
You also might consider upgrading your application so you use MQCONNX instead of the MQCONN. All you need is
- MQCNO cno = {MQCNO_DEFAULT}; /* Connect Options*/
- cno.Options = … ;
- change MQCONN to MQCONNX and add the &cno.
plus testing it(for several weeks) of course.
Convert MQCONN to MQCONNX and you get connection to the local machine or to a client automatically – you do not need the MQ_CONNECT_TYPE.
See, you can get an old application to do new tricks.