data _null_;
length hconn hobj cc reason 8;
length rc hod hpmo hmd hmap hdata 8;
length parms $ 200 options $ 200 action $ 3 msg $ 200;
hconn=0;
hobj=0;
hod=0;
hpmo=0;
hmd=0;
hmap=0;
hdata=0;
put '---------------- Connect to QMgr --------------';
qmgr="TEST";
call mqconn(qmgr, hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr ' qmgr;
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available...
needs to be started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
else put 'MQCONN: successfully connected to QMgr ' qmgr;
put '---------- Generate object descriptor ---------';
action="GEN";
parms="OBJECTNAME";
objname="TEST";
call mqod(hod, action, rc, parms, objname);
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQOD: successfully generated
object descriptor';
put '-------- Open queue object for output ---------';
options="OUTPUT";
call mqopen(hconn, hod, options, hobj, cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
else put 'MQOPEN: successfully opened queue for output';
put '--------- Generate put message options --------';
call mqpmo(hpmo, action, rc);
if rc ^= 0 then do;
put 'MQPMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQPMO: successfully generated put
message options';
put '--------- Generate message descriptor ---------';
parms="PERSISTENCE";
persist="PERSISTENT"; /* persistent message */
call mqmd(hmd, action, rc, parms, persist);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQMD: successfully generated
message descriptor';
put '----------- Generate map descriptor -----------';
/* data will not be aligned */
desc1="SHORT";
desc2="LONG";
desc3="DOUBLE";
desc4="CHAR,,50"; /* blank pad to 50 bytes */
call mqmap(hmap, rc, desc1, desc2, desc3, desc4);
if rc ^= 0 then do;
put 'MQMAP: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQMAP: successfully generated map descriptor';
put '--- Generate data descriptor - actual data ----';
parm1=100;
parm2=9999;
parm3=9999.9999;
parm4="This is a test.";
call mqsetparms(hdata, hmap, rc, parm1,
parm2, parm3, parm4);
if rc ^= 0 then do;
put 'MQSETPARMS: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQSETPARMS: successfully generated
data descriptor';
put '------------- Put message on queue ------------';
call mqput(hconn, hobj, hmd, hpmo, hdata, cc, reason);
if cc ^= 0 then do;
put 'MQPUT: failed with reason= ' reason;
goto exit;
end;
else do;
put 'MQPUT: successfully put message on queue';
/* inquire about message descriptor
output parameters */
action="INQ";
parms="MSGID,PUTAPPLTYPE,PUTAPPLNAME,
PUTDATE,PUTTIME";
length msgid $ 48 applname $ 28 date $ 8 time $ 8;
call mqmd(hmd, action, rc, parms, msgid, appltype,
applname, date, time);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
end;
else do;
put 'Message descriptor output parameters are:';
put 'MSGID= ' msgid;
put 'PUTAPPLTYPE= ' appltype;
put 'PUTAPPLNAME= ' applname;
put 'PUTDATE= ' date;
put 'PUTTIME= ' time;
end;
end;
exit:
if hobj ^= 0 then do;
put '----------------- Close queue ---------------';
options="NONE";
call mqclose(hconn, hobj, options, cc, reason);
if cc ^= 0 then do;
put 'MQCLOSE: failed with reason= ' reason;
end;
else put 'MQCLOSE: successfully closed queue';
end;
if hconn ^= 0 then do;
put '------------ Disconnect from QMgr -----------';
call mqdisc(hconn, cc, reason);
if cc ^= 0 then do;
put 'MQDISC: failed with reason= ' reason;
end;
else put 'MQDISC: successfully disconnected
from QMgr';
end;
if hod ^= 0 then do;
call mqfree(hod);
put 'Object descriptor handle freed';
end;
if hpmo ^= 0 then do;
call mqfree(hpmo);
put 'Put message options handle freed';
end;
if hmd ^= 0 then do;
call mqfree(hmd);
put 'Message descriptor handle freed';
end;
if hmap ^= 0 then do;
call mqfree(hmap);
put 'Map descriptor handle freed';
end;
if hdata ^= 0 then do;
call mqfree(hdata);
put 'Data descriptor handle freed';
end;
run; data _null_;
length hconn hobj cc reason 8;
length rc hod hgmo hmd hmap msglen 8;
length parms $ 200 options $ 200 action $ 3 msg $ 200;
hconn=0;
hobj=0;
hod=0;
hgmo=0;
hmd=0;
hmap=0;
put '---------------- Connect to QMgr --------------';
qmgr="TEST";
call mqconn(qmgr, hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr ' qmgr;
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available...
needs to be started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
else put 'MQCONN: successfully connected to QMgr ' qmgr;
put '---------- Generate object descriptor ---------';
action="GEN";
parms="OBJECTNAME";
objname="TEST";
call mqod(hod, action, rc, parms, objname);
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQOD: successfully generated
object descriptor';
put '--------- Open queue object for input ---------';
options="INPUT_SHARED";
call mqopen(hconn, hod, options, hobj, cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
else put 'MQOPEN: successfully opened queue for output';
put '--------- Generate get message options --------';
call mqgmo(hgmo, action, rc);
if rc ^= 0 then do;
put 'MQGMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQGMO: successfully generated get
message options';
put '--------- Generate message descriptor ---------';
call mqmd(hmd, action, rc);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQMD: successfully generated
message descriptor';
put '----------- Generate map descriptor -----------';
desc1="SHORT";
desc2="LONG";
desc3="DOUBLE";
desc4="CHAR,,50";
call mqmap(hmap, rc, desc1, desc2, desc3, desc4);
if rc ^= 0 then do;
put 'MQMAP: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
else put 'MQMAP: successfully generated map descriptor';
put '------------ Get message from queue -----------';
call mqget(hconn, hobj, hmd, hgmo, msglen, cc, reason);
if cc ^= 0 then do;
if reason = 2033 then put 'No message available';
else put 'MQGET: failed with reason= ' reason;
goto exit;
end;
else do;
put 'MQGET: successfully retrieved message
from queue';
put 'message length= ' msglen;
/* inquire about message descriptor
output parameters */
action="INQ";
parms="REPORT,MSGTYPE,FEEDBACK,MSGID,
CORRELID,USERIDENTIFIER,PUTAPPLTYPE,
PUTAPPLNAME,PUTDATE,PUTTIME";
length report $ 30 msgtype 8 feedback 8 msgid $ 48
correlid $ 48 userid $ 12 appltype 8
applname $ 28 date $ 8 time $8;
call mqmd(hmd, action, rc, parms, report,
msgtype, feedback, msgid, correlid, userid,
appltype, applname, date, time);
if rc ^= 0 then do;
put 'MQMD: failed with rc ' rc;
msg = sysmsg();
put msg;
end;
else do;
put 'Message descriptor output parameters are:';
put 'REPORT= ' report;
put 'MSGTYPE= ' msgtype;
put 'FEEDBACK= ' feedback;
put 'MSGID= ' msgid;
put 'CORRELID= ' correlid;
put 'USERIDENTIFIER= ' userid;
put 'PUTAPPLTYPE= ' appltype;
put 'PUTAPPLNAME= ' applname;
put 'PUTDATE= ' date;
put 'PUTTIME= ' time;
end;
end;
if msglen > 0 then do;
/* retrieve SAS variables from GET buffer */
length parm1 parm2 parm3 8 parm4 $ 50;
call mqgetparms(hmap, rc, parm1,
parm2, parm3, parm4);
put 'Display SAS variables:';
put 'parm1= ' parm1;
put 'parm2= ' parm2;
put 'parm3= ' parm3;
put 'parm4= ' parm4;
if rc ^= 0 then do;
put 'MQGETPARMS: failed with rc= ' rc;
msg = sysmsg();
put msg;
end;
end;
else put 'No data associated with message';
exit:
if hobj ^= 0 then do;
put '----------------- Close queue ---------------';
options="NONE";
call mqclose(hconn, hobj, options, cc, reason);
if cc ^= 0 then do;
put 'MQCLOSE: failed with reason= ' reason;
end;
else put 'MQCLOSE: successfully closed queue';
end;
if hconn ^= 0 then do;
put '------------ Disconnect from QMgr -----------';
call mqdisc(hconn, cc, reason);
if cc ^= 0 then do;
put 'MQDISC: failed with reason= ' reason;
end;
else put 'MQDISC: successfully disconnected
from QMgr';
end;
if hod ^= 0 then do;
call mqfree(hod);
put 'Object descriptor handle freed';
end;
if hgmo ^= 0 then do;
call mqfree(hgmo);
put 'Get message options handle freed';
end;
if hmd ^= 0 then do;
call mqfree(hmd);
put 'Message descriptor handle freed';
end;
if hmap ^= 0 then do;
call mqfree(hmap);
put 'Map descriptor handle freed';
end;
run; /** bits
within md.msgflags **/
%let segment_allow=1;
%let segment=2;
%let last_segment=4;
%let group=8;
%let last_group=16;
data _null_;
length rc 8;
length msg $ 200;
length hconn hod hpmo hobj hmd hmap hdata 8;
length cc reason 8;
length record $ 256;
length msgflags 8;
/* send this file to the queue */
infile 'd:\test.txt' length=reclen end=eof;
call mqconn("TESTQMGR", hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr';
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available...
needs to be started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
put '---------- Generate object descriptor ---------';
call mqod(hod, "GEN", rc, "OBJECTNAME", "TESTQ");
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '-------- Open queue object for output ---------';
call mqopen(hconn, hod, "OUTPUT", hobj, cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
put '--------- Generate put message options --------';
/** QMgr will generate a unique msgid on every put as **/
/** well as generate a groupid for all of the msgs **/
/** and incrementally keep up with the sequencing... **/
call mqpmo(hpmo, "GEN", rc, "OPTIONS",
"NEW_MSGID,LOGICAL_ORDER");
if rc ^= 0 then do;
put 'MQPMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Generate message descriptor ---------';
/** specify the message belongs to a group **/
msgflags=group;
call mqmd(hmd, "GEN", rc, "PERSISTENCE,MSGTYPE,MSGFLAGS",
"PERSISTENT", 100000, msgflags);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '----------- Generate map descriptor -----------';
/* longest record in file is 255 bytes+1 length byte... */
/* therefore all messages on the queue pertaining to */
/* this file will be blank-padded for 256 bytes... */
call mqmap(hmap, rc, "char,,256");
if rc ^= 0 then do;
put 'MQMAP: failed';
msg = sysmsg();
put msg;
goto exit;
end;
do until(eof);
input @;
input record $varying256. reclen;
call mqsetparms(hdata, hmap, rc, record);
if( rc ) then do;
put 'MQSETPARMS: failed';
msg = sysmsg();
put msg;
goto exit;
end;
/** set last in group if eof **/
if( eof ) then do;
msgflags + last;_group;
call mqmd(hmd, "SET", rc, "MSGFLAGS", msgflags);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
end;
put '--- Put msg on queue ----';
call mqput(hconn, hobj, hmd, hpmo, hdata,
cc, reason);
if cc ^= 0 then do;
put 'MQPUT: failed with reason= ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
/* free data */
call mqfree(hdata);
end;
exit:
if( hobj ) then do;
call mqclose(hconn, hobj, "NONE", cc, reason);
if( cc ) then do;
put 'MQCLOSE: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if( hconn ) then do;
call mqdisc(hconn, cc, reason);
if( cc ) then do;
put 'MQDISC: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if hod ^= 0 then do;
call mqfree(hod);
put 'Object descriptor handle freed';
end;
if hpmo ^= 0 then do;
call mqfree(hpmo);
put 'Put message options handle freed';
end;
if hmd ^= 0 then do;
call mqfree(hmd);
put 'Message descriptor handle freed';
end;
if hmap ^= 0 then do;
call mqfree(hmap);
put 'Map descriptor handle freed';
end;
stop;
run; /* Get
first text file on a queue... ie. msgtype=100000 */
/* This example opens queue with a browse cursor and */
/* browses the first msg in every group looking for */
/* a msg with msgtype=100000... once it is found, */
/* open a fetch instance to remove all msgs in that */
/* particular group... */
/* if you knew upfront the groupid that you wanted, you */
/* could just open a single instance of the queue and */
/* remove the group in logical order without having to */
/* do any initial browsing... */
/* bit test macros */
%let segment_allow_mask='.......1'b;
%let segment_mask='......1.'b;
%let last_segment_mask='.....1..'b;
%let group_mask='....1...'b;
%let last_group_mask='...1....'b;
filename output 'd:\testdup.txt';
data _null_;
length rc 8;
length msg $ 200;
length cc reason 8;
length hconn hod hgmo hobj hmap 8;
length record $ 256;
length msgtype seqno msgflags 8;
length groupid $ 48;
fileid = fopen('output', 'o', 256, 'v');
if( fileid = 0 ) then do;
put 'Error opening output file...';
goto exit;
end;
put '---------------- Connect to QMgr --------------';
call mqconn("TESTQMGR", hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr';
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available... needs to
be started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
put '---------- Generate object descriptor ---------';
call mqod(hod, "GEN", rc, "OBJECTNAME", "TESTQ");
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Open queue object for input ---------';
call mqopen(hconn, hod, "INPUT_SHARED,BROWSE", hobj,
cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
put '--------- Generate get message options --------';
call mqgmo(hgmo, "GEN", rc, "options, matchoptions",
"browse_next", "seqnumber");
if rc ^= 0 then do;
put 'MQGMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Generate message descriptor ---------';
/** browse first msg in group only **/
call mqmd(hmd, "GEN", rc, "msgseqnumber", 1);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
recv:
call mqget(hconn, hobj, hmd, hgmo, msglen, cc, reason);
if( cc ) then do;
if( reason = 2033 ) then do;
put 'reached end of queue';
goto exit;
end;
else do;
put 'MQGET: failed with reason = ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
end;
/* inquire about msg properties */
call mqmd(hmd, "INQ", rc,
"MSGTYPE,GROUPID,MSGSEQNUMBER,MSGFLAGS",
msgtype, groupid, seqno, msgflags);
if( rc ) then do;
put 'MQMD failed';
msg = sysmsg();
put msg;
goto exit;
end;
put msgtype=;
put groupid=;
put seqno=;
put msgflags=;
if( msgtype = 100000 ) then do;
/* file processing... */
put '---------- Generate map descriptor ----------';
/* all file messages were sent to the queue as
256 bytes blank-padded */
call mqmap(hmap, rc, "char,,256");
if( rc ) then do;
put 'MQMAP: failed';
msg = sysmsg();
put msg;
goto exit;
end;
/* close browse instance */
call mqclose(hconn, hobj, "NONE", cc, reason);
if( cc ) then do;
put 'MQCLOSE: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
/* open queue in fetch mode */
hobj=0;
call mqopen(hconn, hod, "INPUT_SHARED", hobj,
cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
call mqgmo(hgmo, "SET", rc, "options, matchoptions",
"logical_order,complete_msg,all_msgs_available",
"groupid");
if rc ^= 0 then do;
put 'MQGMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
call mqmd(hmd, "SET", rc, "groupid", groupid);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
next:
call mqget(hconn, hobj, hmd, hgmo, msglen,
cc, reason);
if( cc ) then do;
put 'MQGET: failed with reason = ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
/* inquire about msg properties */
call mqmd(hmd, "INQ", rc,
"MSGTYPE,GROUPID,MSGSEQNUMBER,MSGFLAGS",
msgtype, groupid, seqno, msgflags);
if( rc ) then do;
put 'MQMD failed';
msg = sysmsg();
put msg;
goto exit;
end;
put msgtype=;
put groupid=;
put seqno=;
put msgflags=;
/* retrieve record from internal buffer */
call mqgetparms(hmap, rc, record);
if( rc ) then do;
put 'MQGETPARMS: failed';
msg = sysmsg();
put msg;
goto exit;
end;
put 'write record to file';
rc = fput(fileid, record);
if( rc ) then do;
put 'Error writing to output file buffer...';
goto exit;
end;
/* flush it to disk */
rc = fwrite(fileid);
if( rc ) then do;
put 'Error writing to output file...';
goto exit;
end;
/** receive until last in group **/
if( (msgflags=group;_mask) AND
(NOT(msgflags=last;_group_mask)) )
then goto next;
else goto exit;
end;
else goto recv;
exit:
if( hobj ) then do;
call mqclose(hconn, hobj, "NONE", cc, reason);
if( cc ) then do;
put 'MQCLOSE: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if( hconn ) then do;
call mqdisc(hconn, cc, reason);
if( cc ) then do;
put 'MQDISC: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if( hod ) then
call mqfree(hod);
if( hgmo ) then
call mqfree(hgmo);
if( hmd ) then
call mqfree(hmd);
if( hmap ) then
call mqfree(hmap);
/* close file */
rc = fclose(fileid);
if( rc ) then put 'Error closing output file';
run; data
_null_;
length rc 8;
length msg $ 200;
length hconn hod hpmo hobj hmd hmap hdata 8;
length cc reason 8;
length corrid $ 48;
length msgbuf $ 256;
length seqno 8 seqstr $ 4;
/* send this file to the queue */
infile 'd:\test.exe' recfm=f lrecl=1 end=eof;
call mqconn("TESTQMGR", hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr';
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available... needs to
be started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
put '---------- Generate object descriptor ---------';
call mqod(hod, "GEN", rc, "OBJECTNAME", "TESTQ");
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '-------- Open queue object for output ---------';
call mqopen(hconn, hod, "OUTPUT", hobj, cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
put '--------- Generate put message options --------';
call mqpmo(hpmo, "GEN", rc);
if rc ^= 0 then do;
put 'MQPMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Generate message descriptor ---------';
call mqmd(hmd, "GEN", rc, "PERSISTENCE,MSGTYPE",
"PERSISTENT", 100001);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '----------- Generate map descriptor -----------';
/* send 256 byte messages to the queue */
call mqmap(hmap, rc, "char,,256");
if rc ^= 0 then do;
put 'MQMAP: failed';
msg = sysmsg();
put msg;
goto exit;
end;
/* all of these messages will have the same
correlationid+seqno */
corrid="42696e46696c65212121"; /* BinFile!!! */
seqno = 0;
i=1;
do until(eof);
/* read a byte at a time */
input x $char1.;
i+1;
substr(msgbuf,i,1) = x;
if( i = 256 or eof ) then do;
/* set length of this record embedded
as first byte of message */
substr(msgbuf,1,1) = put(i-1,pib1.);
call mqsetparms(hdata, hmap, rc, msgbuf);
if( rc ) then do;
put 'MQSETPARMS: failed';
msg = sysmsg();
put msg;
goto exit;
end;
/* add sequence # to correlationid */
seqstr = put(seqno, hex4.);
substr(corrid,21,4) = seqstr;
seqno+1;
/* set correlation id and let MQ generate
msgid for this message */
call mqmd(hmd, "SET", rc, "CORRELID,MSGID",
corrid, "");
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--- Put msg on queue ----';
call mqput(hconn, hobj, hmd, hpmo, hdata,
cc, reason);
if cc ^= 0 then do;
put 'MQPUT: failed with reason= ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
/* free data */
call mqfree(hdata);
/* reset message buffer entities */
i=1;
msgbuf="";
end;
end;
exit:
if( hobj ) then do;
call mqclose(hconn, hobj, "NONE", cc, reason);
if( cc ) then do;
put 'MQCLOSE: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if( hconn ) then do;
call mqdisc(hconn, cc, reason);
if( cc ) then do;
put 'MQDISC: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if hod ^= 0 then do;
call mqfree(hod);
put 'Object descriptor handle freed';
end;
if hpmo ^= 0 then do;
call mqfree(hpmo);
put 'Put message options handle freed';
end;
if hmd ^= 0 then do;
call mqfree(hmd);
put 'Message descriptor handle freed';
end;
if hmap ^= 0 then do;
call mqfree(hmap);
put 'Map descriptor handle freed';
end;
stop;
run;
filename output 'd:\testdup.exe';
data _null_;
length rc 8;
length msg $ 200;
length cc reason 8;
length hconn hod hgmo hobj hobj2 hmap 8;
length corrid filecorrid $ 48;
length msgbuf stream $ 256;
length len 8;
length seqno 8;
fileid = fopen('output', 'o', 0, 'b');
if( fileid = 0 ) then do;
put 'Error opening output file...';
goto exit;
end;
put '---------------- Connect to QMgr --------------';
call mqconn("TESTQMGR", hconn, cc, reason);
if cc ^= 0 then do;
if reason = 2002 then do;
put 'Already connected to QMgr';
end;
else do;
if reason = 2059 then
put 'MQCONN: QMgr not available... needs to be
started';
else
put 'MQCONN: failed with reason= ' reason;
goto exit;
end;
end;
put '---------- Generate object descriptor ---------';
call mqod(hod, "GEN", rc, "OBJECTNAME", "TESTQ");
if rc ^= 0 then do;
put 'MQOD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Open queue object for input ---------';
call mqopen(hconn, hod, "INPUT_SHARED,BROWSE", hobj, cc,
reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
put '--------- Generate get message options --------';
call mqgmo(hgmo, "GEN", rc, "options", "browse_next");
if rc ^= 0 then do;
put 'MQGMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
put '--------- Generate message descriptor ---------';
call mqmd(hmd, "GEN", rc);
if rc ^= 0 then do;
put 'MQMD: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
seqno=0;
recv:
call mqget(hconn, hobj, hmd, hgmo, msglen, cc, reason);
if( cc ) then do;
if( reason = 2033 ) then do;
put 'reached end of queue';
goto exit;
end;
else do;
put 'MQGET: failed with reason = ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
end;
/* inquire about msg properties */
call mqmd(hmd, "INQ", rc, "CORRELID,MSGTYPE",
corrid, msgtype);
if( rc ) then do;
put 'MQMD failed';
msg = sysmsg();
put msg;
goto exit;
end;
/* default for getting next msg on queue */
call mqgmo(hgmo, "SET", rc, "options", "browse_next");
if rc ^= 0 then do;
put 'MQGMO: failed with rc= ' rc;
msg = sysmsg();
put msg;
goto exit;
end;
if( msgtype = 100001 ) then do;
/* file processing... */
outofseq=0;
if( filecorrid = "" ) then do;
/* file begins at this message */
/* write all correlating messages to this file */
filecorrid = substr(corrid,1,20);
put '--------- Generate map descriptor ---------';
/* all file messages were sent to the queue as 256
bytes blank-padded */
call mqmap(hmap, rc, "char,,256");
if( rc ) then do;
put 'MQMAP: failed';
msg = sysmsg();
put msg;
goto exit;
end;
end;
/* make sure message belongs to this file */
if( substr(corrid,1,20) = filecorrid ) then do;
if( seqno ^= input(substr(corrid,21,4), hex4.) )
then do;
/* this message is out of sequence so
search for it */
outofseq=1;
/* open another instance to search for
out-of-seq message */
call mqopen(hconn, hod, "INPUT_SHARED,BROWSE",
hobj2, cc, reason);
if cc ^= 0 then do;
put 'MQOPEN: failed with reason= ' reason;
goto exit;
end;
corrid = filecorrid;
substr(corrid,21,4) = put(seqno, hex4.);
call mqmd(hmd, "SET", rc, "MSGID,CORRELID",
"", corrid);
if( rc ) then do;
put 'MQMD: failed';
msg = sysmsg();
put msg;
end;
call mqgmo(hgmo, "SET", rc, "OPTIONS",
"BROWSE_FIRST");
if( rc ) then do;
put 'MQGMO: failed';
msg = sysmsg();
put msg;
goto exit;
end;
call mqget(hconn, hobj2, hmd, hgmo, msglen,
cc, reason);
if( cc ) then do;
if( reason = 2033 ) then do;
put 'Error: reached end of queue while
searching for out-of-sequence msg';
goto exit;
end;
else do;
put 'MQGET: failed with reason = ' reason;
msg = sysmsg();
put msg;
goto exit;
end;
end;
end;
/* increment sequence number for
next expected message */
seqno+1;
/* retrieve record from internal buffer */
call mqgetparms(hmap, rc, msgbuf);
if( rc ) then do;
put 'MQGETPARMS: failed';
msg = sysmsg();
put msg;
goto exit;
end;
/* length of this stream is embedded
as 1st byte in msg */
len = input(substr(msgbuf,1,1), pib1.);
stream = substr(msgbuf,2);
put 'write stream to file';
rc = fput(fileid, substr(stream,1,len));
if( rc ) then do;
put 'Error writing to output file buffer...';
goto exit;
end;
/* flush it to disk */
rc = fwrite(fileid);
if( rc ) then do;
put 'Error writing to output file...';
goto exit;
end;
/* now remove it from the queue... */
call mqgmo(hgmo, "SET", rc, "OPTIONS",
"MSG_UNDER_CURSOR");
if( rc ) then do;
put 'MQGMO: failed';
msg = sysmsg();
put msg;
goto exit;
end;
if( outofseq ) then do;
call mqget(hconn, hobj2, hmd, hgmo, msglen,
cc, reason);
if( cc ) then do;
put 'problems removing message from queue';
msg = sysmsg();
put msg;
goto exit;
end;
/* close queue */
call mqclose(hconn, hobj2, "NONE", cc, reason);
/* re-read previous message */
call mqgmo(hgmo, "SET", rc, "OPTIONS",
"BROWSE_MSG_UNDER_CURSOR");
if( rc ) then do;
put 'MQGMO: failed';
msg = sysmsg();
put msg;
goto exit;
end;
end;
else do;
call mqget(hconn, hobj, hmd, hgmo, msglen,
cc, reason);
if( cc ) then do;
put 'problems removing message from queue';
msg = sysmsg();
put msg;
goto exit;
end;
/* browse next message */
call mqgmo(hgmo, "SET", rc, "OPTIONS",
"BROWSE_NEXT");
if( rc ) then do;
put 'MQGMO: failed';
msg = sysmsg();
put msg;
goto exit;
end;
end;
end;
end;
/* finish retrieving all messages belonging
to this file */
/* reset message descriptor */
call mqmd(hmd, "SET", rc, "MSGID,CORRELID", "", "");
if( rc ) then do;
put 'MQMD: failed';
msg = sysmsg();
put msg;
goto exit;
end;
goto recv;
exit:
if( hobj ) then do;
call mqclose(hconn, hobj, "NONE", cc, reason);
if( cc ) then do;
put 'MQCLOSE: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
if( hconn ) then do;
call mqdisc(hconn, cc, reason);
if( cc ) then do;
put 'MQDISC: failed with reason = ' reason;
msg = sysmsg();
put msg;
end;
end;
%macro
putmsg;
%let hconn=0;
%let hobj=0;
%let hod=0;
%let hpmo=0;
%let hmd=0;
%let hmap=0;
%let hdata=0;
%put ---------------- Connect to QMgr --------------;
%let qmgr=TEST;
%let cc=0;
%let reason=0;
%syscall mqconn(qmgr, hconn, cc, reason);
%if cc; ^= 0 %then %do;
%if reason; = 2002 %then %do;
%put Already connected to QMgr qmgr;
%end;
%else %do;
%if reason; = 2059 %then
%put MQCONN: QMgr not available...
needs to be started;
%else
%put MQCONN: failed with reason= reason;
%goto exit;
%end;
%end;
%put ---------- Generate object descriptor ---------;
%let action=GEN;
%let rc=0;
%let parms=OBJECTNAME;
%let objname=TEST;
%syscall mqod(hod, action, rc, parms, objname);
%if rc; ^= 0 %then %do;
%put MQOD: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQOD: successfully generated
object descriptor;
%put -------- Open queue object for output ---------;
%let options=OUTPUT;
%syscall mqopen(hconn, hod, options, hobj, cc, reason);
%if cc; ^= 0 %then %do;
%put MQOPEN: failed with Reason= reason;
%goto exit;
%end;
%else %put MQOPEN: successfully opened queue for output;
%put --------- Generate put message options --------;
%syscall mqpmo(hpmo, action, rc);
%if rc; ^= 0 %then %do;
%put MQPMO: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQPMO: successfully generated put
message options;
%put --------- Generate message descriptor ---------;
%let parms=PERSISTENCE;
%let persist=PERSISTENT;
%syscall mqmd(hmd, action, rc, parms, persist);
%if rc; ^= 0 %then %do;
%put MQMD: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQMD: successfully generated
message descriptor;
%put ----------- Generate map descriptor -----------;
/* data will not be aligned */
%let desc1=SHORT;
%let desc2=LONG;
%let desc3=DOUBLE;
%let desc4=CHAR,,50;
%syscall mqmap(hmap, rc, desc1, desc2, desc3, desc4);
%if rc; ^= 0 %then %do;
%put MQMAP: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQMAP: successfully generated map descriptor;
%put --- Generate data descriptor - actual data ----;
%let parm1=100;
%let parm2=9999;
%let parm3=9999.999;
%let parm4=This is a test.;
%syscall mqsetparms(hdata, hmap, rc, parm1,
parm2, parm3, parm4);
%if rc; ^= 0 %then %do;
%put MQSETPARMS: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQSETPARMS: successfully generated
data descriptor;
%put ------------- Put message on queue ------------;
%syscall mqput(hconn, hobj, hmd, hpmo,
hdata, cc, reason);
%if cc; ^= 0 %then %do;
%put MQPUT: failed with reason= reason;
%goto exit;
%end;
%else %do;
%put MQPUT: successfully put message on queue;
/* inquire about message descriptor
output parameters */
%let action=INQ;
%let parms=MSGID,PUTAPPLTYPE,PUTAPPLNAME,
PUTDATE,PUTTIME;
/* initialize msgid for return length of 48 */
%let msgid=" ";
%let appltype=0;
/* initialize applname for return length of 28 */
%let applname=" ";
/* initialize data, time for return length of 8 */
%let date=" ";
%let time=" ";
%syscall mqmd(hmd, action, rc, parms, msgid,
appltype, applname, date, time);
%if rc; ^= 0 %then %do;
%put MQMD: failed with rc= rc;
%put %sysfunc(sysmsg());
%end;
%else %do;
%put Message descriptor output parameters are:;
%put MSGID= msgid;
%put PUTAPPLTYPE= appltype;
%put PUTAPPLNAME= applname;
%put PUTDATE= date;
%put PUTTIME= time;
%end;
%end;
%exit:
%if hobj; ^= 0 %then %do;
%put ------------------ Close queue ----------------;
%let options=NONE;
%syscall mqclose(hconn, hobj, options, cc, reason);
%if cc; ^= 0 %then %do;
%put MQCLOSE: failed with reason= reason;
%end;
%else %put MQCLOSE: successfully closed queue;
%end;
%if hconn; ^= 0 %then %do;
%put ------------- Disconnect from QMgr ------------;
%syscall mqdisc(hconn, cc, reason);
%if cc; ^= 0 %then %do;
%put MQDISC: failed with reason= reason;
%end;
%else %put MQDISC: successfully disconnected
from QMgr;
%end;
%if hod; ^= 0 %then %do;
%syscall mqfree(hod);
%put Object descriptor handle freed;
%end;
%if hpmo; ^= 0 %then %do;
%syscall mqfree(hpmo);
%put Put message options handle freed;
%end;
%if hmd; ^= 0 %then %do;
%syscall mqfree(hmd);
%put Message descriptor handle freed;
%end;
%if hmap; ^= 0 %then %do;
%syscall mqfree(hmap);
%put Map descriptor handle freed;
%end;
%if hdata; ^= 0 %then %do;
%syscall mqfree(hdata);
%put Data descriptor handle freed;
%end;
%mend putmsg;
/** invoke macro to Put a message on a queue **/
%putmsg;
%macro getmsg;
%let hconn=0;
%let hobj=0;
%let hod=0;
%let hgmo=0;
%let hmd=0;
%let hmap=0;
%put ---------------- Connect to QMgr --------------;
%let qmgr=TEST;
%let cc=0;
%let reason=0;
%syscall mqconn(qmgr, hconn, cc, reason);
%if cc; ^= 0 %then %do;
%if reason; = 2002 %then %do;
%put Already connected to QMgr qmgr;
%end;
%else %do;
%if reason; = 2059 %then
%put MQCONN: QMgr not available...
needs to be started;
%else
%put MQCONN: failed with reason= reason;
%goto exit;
%end;
%end;
%else %put MQCONN: successfully connected
to QMgr qmgr;
%put ---------- Generate object descriptor ---------;
%let rc=0;
%let action=GEN;
%let parms=OBJECTNAME;
%let objname=TEST;
%syscall mqod(hod, action, rc, parms, objname);
%if rc; ^= 0 %then %do;
%put MQOD: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQOD: successfully generated
object descriptor;
%put --------- Open queue object for input ---------;
%let options=INPUT_SHARED;
%syscall mqopen(hconn, hod, options, hobj, cc, reason);
%if cc; ^= 0 %then %do;
%put MQOPEN: failed with reason= reason;
%goto exit;
%end;
%else %put MQOPEN: successfully opened queue for output;
%put --------- Generate get message options --------;
%syscall mqgmo(hgmo, action, rc);
%if rc; ^= 0 %then %do;
%put MQGMO: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQGMO: successfully generated get
message options;
%put --------- Generate message descriptor ---------;
%syscall mqmd(hmd, action, rc);
%if rc; ^= 0 %then %do;
%put MQMD: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQMD: successfully generated
message descriptor;
%put ----------- Generate map descriptor -----------;
%let desc1=SHORT;
%let desc2=LONG;
%let desc3=DOUBLE;
%let desc4=CHAR,,50;
%syscall mqmap(hmap, rc, desc1, desc2, desc3, desc4);
%if rc; ^= 0 %then %do;
%put MQMAP: failed with rc= rc;
%put %sysfunc(sysmsg());
%goto exit;
%end;
%else %put MQMAP: successfully generated map descriptor;
%put ------------ Get message from queue -----------;
%let msglen=0;
%syscall mqget(hconn, hobj, hmd, hgmo, msglen, cc,
reason);
%if cc; ^= 0 %then %do;
%if reason; = 2033 %then %put No message
available;
%else %put MQGET: failed with reason= reason;
%goto exit;
%end;
%else %do;
%put MQGET: successfully retrieved message from queue;
%put message length= msglen;
/* inquire about message descriptor
output parameters */
%let action=INQ;
%let parms=REPORT,MSGTYPE,FEEDBACK,MSGID,CORRELID,
USERIDENTIFIER,PUTAPPLTYPE,PUTAPPLNAME,PUTDATE,
PUTTIME;
/* initialize report for return length of 30 */
%let report=" ";
%let msgtype=0;
%let feedback=0;
/* initialize msgid, correlid for
return length of 48 */
%let msgid=" ";
%let correlid=" ";
/* initialize userid for return length of 12 */
%let userid=" ";
%let appltype=0;
/* initialize applname for return length of 28 */
%let applname=" ";
/* initiailze data, time for return length of 8 */
%let date=" ";
%let time=" ";
%syscall mqmd(hmd, action, rc, parms, report,
msgtype, feedback, msgid, correlid, userid,
appltype, applname, date, time);
%if rc; ^= 0 %then %do;
%put MQMD: failed with rc rc;
%put %sysfunc(sysmsg());
%end;
%else %do;
%put Message descriptor output parameters are:;
%put REPORT= report;
%put MSGTYPE= msgtype;
%put FEEDBACK= feedback;
%put MSGID= msgid;
%put CORRELID= correlid;
%put USERIDENTIFIER= userid;
%put PUTAPPLTYPE= appltype;
%put PUTAPPLNAME= applname;
%put PUTDATE= date;
%put PUTTIME= time;
%end;
%end;
%if msglen; > 0 %then %do;
/* retrieve SAS variables from GET buffer */
%let parm1=0;
%let parm2=0;
%let parm3=0;
/* initialize character return value length of 50 */
%let parm4=" ";
%syscall mqgetparms(hmap, rc, parm1,
parm2, parm3, parm4);
%put Display SAS macro variables:;
%put parm1= parm1;
%put parm2= parm2;
%put parm3= parm3;
%put parm4= parm4;
%if rc; ^= 0 %then %do;
%put MQGETPARMS: failed with rc= rc;
%put %sysfunc(sysmsg());
%end;
%end;
%else %put No data associated with message;
%exit:
%if hobj; ^= 0 %then %do;
%put ------------------ Close queue ----------------;
%let options=NONE;
%syscall mqclose(hconn, hobj, options, cc, reason);
%if cc; ^= 0 %then %do;
%put MQCLOSE: failed with reason= reason;
%end;
%else %put MQCLOSE: successfully closed queue;
%end;
%if hconn; ^= 0 %then %do;
%put ------------- Disconnect from QMgr ------------;
%syscall mqdisc(hconn, cc, reason);
%if cc; ^= 0 %then %do;
%put MQDISC: failed with reason= reason;
%end;
%else %put MQDISC: successfully
disconnected from QMgr;
%end;
%if hod; ^= 0 %then %do;
%syscall mqfree(hod);
%put Object descriptor handle freed;
%end;
%if hgmo; ^= 0 %then %do;
%syscall mqfree(hgmo);
%put Get message options handle freed;
%end;
%if hmd; ^= 0 %then %do;
%syscall mqfree(hmd);
%put Message descriptor handle freed;
%end;
%if hmap; ^= 0 %then %do;
%syscall mqfree(hmap);
%put Map descriptor handle freed;
%end;
%mend getmsg;
/** invoke macro to Get a message from a queue **/
%getmsg;