Before running these samples, you must build the server environment.
It is assumed that you have a working TUXEDO environment.
$ export CFLAGS="-I /usr/mqm/inc -I /<APPDIR> -L /usr/mqm/lib" $ export LDOPTS="-lmqm -lmqmzse -lnet -insl -lsocket -lc -ldl" $ export FIELDTBLS=/usr/mqm/samp/amqstxvx.flds $ export VIEWFILES=/<APPDIR>/amqstxvx.V $ export LIBPATH=$TUXDIR/lib:/usr/mqm/lib:/lib
MQSeries_XA_RMI:MQRMIXASwitchDynamic: \ /usr/mqm/lib/libmqmxa.a /usr/mqm/lib/libmqm.a
$ mkfldhdr /usr/mqm/samp/amqstxvx.flds $ viewc /usr/mqm/samp/amqstxvx.v $ buildtms -o MQXA -r MQSeries_XA_RMI $ buildserver -o MQSERV1 -f /usr/mqm/samp/amqstxsx.c \ -f /usr/mqm/lib/libmqm.a \ -r MQSeries_XA_RMI -s MPUT1:MPUT \ -s MGET1:MGET \ -v -bshm $ buildserver -o MQSERV2 -f /usr/mqm/samp/amqstxsx.c \ -f /usr/mqm/lib/libmqm.a \ -r MQSeries_XA_RMI -s MPUT2:MPUT -s MGET2:MGET \ -v -bshm $ buildclient -o doputs -f /usr/mqm/samp/amqstxpx.c \ -f /usr/mqm/lib/libmqm.a $ buildclient -o dogets -f /usr/mqm/samp/amqstxgx.c \ -f /usr/mqm/lib/libmqm.a
$ tmloadcf -y /usr/mqm/samp/ubbstxcx.cfg
$tmadmin -cA prompt then appears. At this prompt, enter:
> crdl -z /<APPDIR>/TLOG1
$ strmqm
$ tmboot -y
You can now use the doputs and dogets programs to put messages to a queue and retrieve them from a queue.
$ export CFLAGS="-I /<APPDIR>" $ export FIELDTBLS=amqstxvx.flds $ export VIEWFILES=amqstxvx.V $ export SHLIB_PATH=$TUXDIR/lib:/opt/mqm/lib:/lib $ export LD_LIBRARY_PATH=$TUXDIR/lib:/opt/mqm/lib:/lib
MQSeries_XA_RMI:MQRMIXASwitchDynamic: \ /opt/mqm/lib/libmqmxa.a /opt/mqm/lib/libmqm.so \ /opt/tuxedo/lib/libtux.a /opt/mqm/lib/libmqmcs.so \ /opt/mqm/lib/libmqmzse.so
$ mkfldhdr amqstxvx.flds $ viewc amqstxvx.v $ buildtms -o MQXA -r MQSeries_XA_RMI $ buildserver -o MQSERV1 -f amqstxsx.c \ -f /opt/mqm/lib/libmqm.so \ -r MQSeries_XA_RMI -s MPUT1:MPUT \ -s MGET1:MGET \ -v -bshm -l -ldl $ buildserver -o MQSERV2 -f amqstxsx.c \ -f /opt/mqm/lib/libmqm.so \ -r MQSeries_XA_RMI -s MPUT2:MPUT \ -s MGET2:MGET \ -v -bshm -l -ldl $ buildclient -o doputs -f amqstxpx.c \ -f /opt/mqm/lib/libmqm.so \ -f /opt/mqm/lib/libmqmzse.co \ -f /opt/mqm/lib/libmqmcs.so $ buildclient -o dogets -f amqstxgx.c \ -f /opt/mqm/lib/libmqm.so -f /opt/mqm/lib/libmqmzse.co \ -f /opt/mqm/lib/libmqmcs.so
$ tmloadcf -y ubbstxcx.cfg
$tmadmin -cA prompt then appears. At this prompt, enter:
> crdl -z /<APPDIR>/TLOG1
$ strmqm
$ tmboot -y
You can now use the doputs and dogets programs to put messages to a queue and retrieve them from a queue.
$ export CFLAGS="-Aa -D_HPUX_SOURCE" $ export LDOPTS="-lmqm" $ export FIELDTBLS=/opt/mqm/samp/amqstxvx.flds $ export VIEWFILES=<APPDIR>/amqstxvx.V $ export SHLIB_PATH=$TUXDIR/lib:/opt/mqm/lib:/lib $ export LPATH=$TUXDIR/lib:/opt/mqm/lib:/lib
MQSeries_XA_RMI:MQRMIXASwitchDynamic: \ /opt/mqm/lib/libmqmxa.a /opt/mqm/lib/libmqm.sl \ /opt/tuxedo/lib/libtux.sl
$ mkfldhdr /opt/mqm/samp/amqstxvx.flds $ viewc /opt/mqm/samp/amqstxvx.v $ buildtms -o MQXA -r MQSeries_XA_RMI $ buildserver -o MQSERV1 -f /opt/mqm/samp/amqstxsx.c \ -f /opt/mqm/lib/libmqm.sl \ -r MQSeries_XA_RMI -s MPUT1:MPUT \ -s MGET1:MGET \ -v -bshm $ buildserver -o MQSERV2 -f /opt/mqm/samp/amqstxsx.c \ -f /opt/mqm/lib/libmqm.sl \ -r MQSeries_XA_RMI -s MPUT2:MPUT \ -s MGET2:MGET \ -v -bshm $ buildclient -o doputs -f /opt/mqm/samp/amqstxpx.c \ -f /opt/mqm/lib/libmqm.sl $ buildclient -o dogets -f /opt/mqm/samp/amqstxgx.c \ -f /opt/mqm/lib/libmqm.sl
$ tmloadcf -y /opt/mqm/samp/ubbstxcx.cfg
$tmadmin -cA prompt then appears. At this prompt, enter:
> crdl -z /<APPDIR>/TLOG1
$ strmqm
$ tmboot -y
You can now use the doputs and dogets programs to put messages to a queue and retrieve them from a queue.
$ export CFLAGS="-lmqm -lmqmcs -lmqmzse -lmqmxa \ -lnsl -lsocket -ldl -lmproc -lext"
$ export FIELDTBLS=amqstxvx.flds $ export VIEWFILES=amqstxvx.V $ export VIEWDIR=The path to the directory where the views are held $ export TUXDIR=The path to the directory where TUXEDO is installed (/opt/tuxedo). $ export CFLAGS="-lmqm -lmqmcs -lmqmzse -lmqmxa \ -lnsl -lsocket -ldl -lmproc -lext"
MQSeries_XA_RMI:MQRMIXASwitchDynamic: \ /opt/mqm/lib/libmqmxa.so /opt/mqm/lib/libmqm.so /opt/mqm/lib/libmqmcs.s
$ mkfldhdr amqstxvx.flds $ viewc amqstxvx.v
export CFLAGS="$CFLAGS -LDuMQRMIXASwitchDynamic -lmqmxa"
$ buildtms -o MQXA -r MQSeries_XA_RMI $ buildserver -o MQSERV1 -f amqstxsx.c \ -f /opt/mqm/lib/libmqm.so i \ -r MQSeries_XA_RMI -s MPUT1:MPUT \ -s MGET1:MGET \ -v -bshm $ buildserver -o MQSERV2 -f amqstxsx.c \ -f /opt/mqm/lib/libmqm.so \ -r MQSeries_XA_RMI -s MPUT2:MPUT \ -s MGET2:MGET \ -v -bshm $ buildclient -o doputs -f amqstxpx.c \ -f /opt/mqm/lib/libmqm.so $ buildclient -o dogets -f amqstxgx.c \ -f /opt/mqm/lib/libmqm.so
tmadmin -c
At the prompt (>), enter:
crdl -z filename
where filename is the path to the Tuxedo TLOG file.
$ tmloadcf -y ubbstxcx.cfg
$ strmqm
$ tmboot -y
You can now use the doputs and dogets programs to put messages to a queue and retrieve them from a queue.
For further information on building the TUXEDO server environment, see the README file in the WebSphere MQ sample directory, /opt/mqm/samp.
Figure 38. Example of ubbstxcx.cfg file for UNIX systems
*RESOURCES IPCKEY <IPCKey> #Example: #IPCKEY 123456 MASTER <MachineName> MAXACCESSERS 20 MAXSERVERS 20 MAXSERVICES 50 MODEL SHM LDBAL N *MACHINES DEFAULT: APPDIR="<WorkDirectory>" TUXCONFIG="<WorkDirectory>/tuxconfig" ROOTDIR="<RootDirectory>" <MachineName> LMID=<MachineName> TLOGDEVICE="<WorkDirectory>/TLOG1" TLOGNAME=TLOG *GROUPS GROUP1 LMID=<MachineName> GRPNO=1 TMSNAME=MQXA OPENINFO="MQSeries_XA_RMI:MYQUEUEMANAGER" *SERVERS DEFAULT: CLOPT="-A -- -m MYQUEUEMANAGER MQSERV1 SRVGRP=GROUP1 SRVID=1 MQSERV2 SRVGRP=GROUP1 SRVID=2 *SERVICES MPUT1 MGET1 MPUT2 MGET2 |
<MQMDIR> | the directory path specified when WebSphere MQ was installed, for example g:\Program Files\IBM\WebSphere MQ |
<TUXDIR> | the directory path specified when TUXEDO was installed, for example f:\tuxedo |
<APPDIR> | the directory path to be used for the sample application, for example f:\tuxedo\apps\mqapp |
To build the server environment and samples:
f:\tuxedo\apps\mqapp
amqstxmn.mak amqstxen.env ubbstxcn.cfg
MQSeries_XA_RMI;MQRMIXASwitchDynamic; <MQMDIR>\tools\lib\mqmtux.lib <MQMDIR>\tools\lib\mqm.lib
where <MQMDIR> is replaced as above. Although shown here as two lines, the new entry must be one line in the file.
TUXDIR=<TUXDIR> TUXCONFIG=<APPDIR>\tuxconfig FIELDTBLS=<MQMDIR>\tools\c\samples\amqstxvx.fld LANG=C
crdl -z <APPDIR>\TLOG
where <APPDIR> is replaced as above.
msvc amqstxmn.mak
Select build to build all the sample programs.
Figure 39. Example of ubbstxcn.cfg file for WebSphere MQ for Windows
*RESOURCES IPCKEY 99999 UID 0 GID 0 MAXACCESSERS 20 MAXSERVERS 20 MAXSERVICES 50 MASTER SITE1 MODEL SHM LDBAL N *MACHINES <MachineName> LMID=SITE1 TUXDIR="f:\tuxedo" APPDIR="f:\tuxedo\apps\mqapp;g:\Program Files\IBM\WebSphere MQ\bin" ENVFILE="f:\tuxedo\apps\mqapp\amqstxen.env" TUXCONFIG="f:\tuxedo\apps\mqapp\tuxconfig" ULOGPFX="f:\tuxedo\apps\mqapp\ULOG" TLOGDEVICE="f:\tuxedo\apps\mqapp\TLOG" TLOGNAME=TLOG TYPE="i386NT" UID=0 GID=0 *GROUPS GROUP1 LMID=SITE1 GRPNO=1 TMSNAME=MQXA OPENINFO="MQSeries_XA_RMI:MYQUEUEMANAGER" *SERVERS DEFAULT: CLOPT="-A -- -m MYQUEUEMANAGER" MQSERV1 SRVGRP=GROUP1 SRVID=1 MQSERV2 SRVGRP=GROUP1 SRVID=2 *SERVICES MPUT1 MGET1 MPUT2 MGET2 |
The sample ubbconfig file for WebSphere MQ for Windows is listed in Figure 39. It is supplied as ubbstxcn.cfg in the WebSphere MQ samples directory.
The sample makefile (see Figure 40) supplied for WebSphere MQ for Windows is called ubbstxmn.mak, and is held in the WebSphere MQ samples directory.
Figure 40. Sample TUXEDO makefile for WebSphere MQ for Windows
TUXDIR = f:\tuxedo MQMDIR = g:\Program Files\IBM\WebSphere MQ APPDIR = f:\tuxedo\apps\mqapp MQMLIB = $(MQMDIR)\tools\lib MQMINC = $(MQMDIR)\tools\c\include MQMSAMP = $(MQMDIR)\tools\c\samples INC = -f "-I$(MQMINC) -I$(APPDIR)" DBG = -f "/Zi" amqstx.exe: $(TUXDIR)\bin\mkfldhdr -d$(APPDIR) $(MQMSAMP)\amqstxvx.fld $(TUXDIR)\bin\viewc -d$(APPDIR) $(MQMSAMP)\amqstxvx.v $(TUXDIR)\bin\buildtms -o MQXA -r MQSeries_XA_RMI $(TUXDIR)\bin\buildserver -o MQSERV1 -f $(MQMSAMP)\amqstxsx.c \ -f $(MQMLIB)\mqm.lib -v $(INC) $(DBG) \ -r MQSeries_XA_RMI \ -s MPUT1:MPUT -s MGET1:MGET $(TUXDIR)\bin\buildserver -o MQSERV2 -f $(MQMSAMP)\amqstxsx.c \ -f $(MQMLIB)\mqm.lib -v $(INC) $(DBG) \ -r MQSeries_XA_RMI \ -s MPUT2:MPUT -s MGET2:MGET $(TUXDIR)\bin\buildclient -o doputs -f $(MQMSAMP)\amqstxpx.c \ -f $(MQMLIB)\mqm.lib -v $(INC) $(DBG) $(TUXDIR)\bin\buildclient -o dogets -f $(MQMSAMP)\amqstxgx.c \ -f $(MQMLIB)\mqm.lib $(INC) -v $(DBG) $(TUXDIR)\bin\tmloadcf -y $(APPDIR)\ubbstxcn.cfg |
The procedure is the same on Compaq Tru64 UNIX Version 4.0 and Version 5.0. It is assumed that you have a working TUXEDO environment.
$ TUXDIR=/TUXDIR; export TUXDIR $ PATH=$TUXDIR/bin:$PATH; export PATH $ COBCPY=:$TUXDIR/cobinclude; export COBCPY $ COBOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI \ -C OSEXT=cbl"; export COBOPT $ LD_LIBRARY_PATH=$TUXDIR/lib:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
MQSeries_XA_RMI:MQRMIXASwitchDynamic:-lmqm -lmqmzse \ -lmqmxa -lmqmcs -L/$TUXDIR/lib -ltux
$ mkfldhdr /opt/mqm/samp/amqstxvx.flds $ viewc /opt/mqm/samp/amqstxvx.v $ buildtms -o MQXA -r MQSeries_XA_RMI $ buildserver -o MQSERV1 -f /opt/mqm/samp/amqstxsx.c \ -f /opt/mqm/lib/libmqm.so -r MQSeries_XA_RMI \ -s MPUT1:MPUT -s MGET1:MGET -v -bshm $ buildserver -o MQSERV2 -f /opt/mqm/samp/amqstxsx.c \ -f /opt/mqm/lib/libmqm.so -r MQSeries_XA_RMI \ -s MPUT2:MPUT -s MGET2:MGET -v -bshm $ buildclient -o doputs -f /opt/mqm/samp/amqstxpx.c \ -f /opt/mqm/lib/libmqm.so -f /opt/mqm/lib/libmqmzse.so \ -f /opt/mqm/lib/libmqmcs.so $ buildclient -o dogets -f /opt/mqm/samp/amqstxgx.c \ -f /opt/mqm/lib/libmqm.so -f /opt/mqm/lib/libmqmzse.so \ -f /opt/mqm/lib/libmqmcs.so
$ tmloadcf -y ubbstxcx.cfg
$ tmadmin -c
A > prompt then appears. At this point, enter:
> crdl -z /<appdir>/TLOG1
$ strmqm MYQUEUEMANAGER
$ tmboot -y
You can now use the doputs and dogets programs to put messages to a queue and retrieve them from a queue.
This sample server program (amqstxsx) is designed to run with the Put (amqstxpx.c) and the Get (amqstxgx.c) sample programs. The program runs automatically when TUXEDO is started.
The sample server provides two TUXEDO services, MPUT1 and MGET1.
The MPUT1 service is driven by the PUT sample and uses MQPUT1 in syncpoint to put a message in a unit of work controlled by TUXEDO. It takes the parameters QName and Message Text, which are supplied by the PUT sample.
The MGET1 service opens and closes the queue each time it gets a message. It takes the parameters QName and Message Text, which are supplied by the GET sample.
Any error messages, reason codes, and status messages are written to the TUXEDO log file.
Figure 41. How TUXEDO samples work together
This sample allows you to put a message on a queue multiple times, in batches, demonstrating syncpointing using TUXEDO as the resource manager. The sample server program amqstxsx must be running for the put sample to succeed - the server sample program makes the connection to the queue manager and uses the XA interface. To run the sample enter:
For example:
This puts 30 messages on to the queue named myqueue, in 6 batches each with 5 messages in them. If there are any problems it will back a batch of messages out, otherwise it will commit them.
Any error messages are written to the TUXEDO log file and to stderr. Any reason codes are written to stderr.
This sample allows you to get messages from a queue in batches. The sample server program amqstxsx must be running for the put sample to succeed - the server sample program makes the connection to the queue manager and uses the XA interface. To run the sample enter:
For example:
This takes 24 messages off the queue named myqueue, in 6 batches each with 4 messages in them. If you ran this after the put example, which put 30 messages on myqueue, you would now have only 6 messages on myqueue. Note that the number of batches and the batch size can vary between the putting of messages and the getting of them.
Any error messages are written to the TUXEDO log file and to stderr. Any reason codes are written to stderr.