SAS 9.1.3 Integration Technologies » Developer's Guide


Common Messaging Interface
Writing Applications Using the Common Interface
Using TIB/Rendezvous with the Common Interface
TIB/Rendezvous Coding Example
TIB/Rendezvous Certified Messaging Coding Examples
Using a Repository with Application Messaging
CALL Routines for the Common Messaging Interface
SETALIAS
SETMAP
SETMODEL
GETALIAS
GETMAP
GETMODEL
GETQUEUEPROPS
DELETEALIAS
DELETEMAP
DELETEMODEL
INIT
TERM
OPENQUEUE
CLOSEQUEUE
SENDMESSAGE
RECEIVEMESSAGE
PARSEMESSAGE
GETATTACHMENT
ACCEPTATTACHMENT
BEGINTRANSACTION
COMMIT
ABORT
FREETRANSACTION
Attachment Layout for Websphere MQ and MSMQ Through Common Messaging Interface
Attachment Layout for TIB/Rendezvous
Attachment Error Handling for Common Messaging Interface
Application Messaging

TIB/Rendezvous Certified Messaging Coding Examples

The following examples of SAS DATA steps show how to use the SAS Common Messaging Interface with the TIB/Rendezvous Certified Messaging transport to send and receive messages.

Example 1

In the first example, the sender and listener use the same DATA step.

   data _null_;

   %let ldap_host=mynode.alphalite.com;
   %let ldap_port=8001; 
   %let ldap_base=o=Alphalite Airways,c=US;  

      length msg $ 200;
      length qid qid2 tid rc 8;
      length map $80;
      length recv1 recv2 recv3 8; 
      length recv4 $50;
      length event $10;

      tid=0;
      rc=0;
      put '----';
      put 'Call INIT';
      CALL INIT(tid, 'RENDEZVOUS-CM', rc);
      if rc ^= 0 then do;
         put 'INIT: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'INIT: succeeded';

      call setmodel("RENDEZVOUS-CM", "RENDCMSENDER", 
         "LDAP", rc, "CMNAME, LEDGER",
         "cmsender", "c:\cmsendledger.txt"); 
      if rc ^= 0 then do;
         put 'SETMODEL: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMODEL: succeeded';

      call setmodel("RENDEZVOUS-CM", "RENDCMRECEIVE", 
         "LDAP", rc, "CMNAME, LEDGER, REQUESTOLD, 
         SYNCLEDGER", "cmreceive", "c:\cmrcvledger.txt", 
         "YES", "NO"); 
      if rc ^= 0 then do;
         put 'SETMODEL: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMODEL: succeeded';

      rc=0;
      put '----';
      put 'Call SETMAP';
      CALL SETMAP('rendmap', 'LDAP', rc, 
         'SHORT;LONG;DOUBLE;CHAR,,50'); 
      if rc ^= 0 then do;
         put 'SETMAP: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMAP: succeeded';

      rc=0;
      qid2=0;
      put '----';
      put 'Call OPENQUEUE';
      CALL OPENQUEUE(qid2, tid, 'testcm.subject', 
         'DELIVERY', rc, "DYNAMIC(Model=rendcmsender)");
      if rc ^= 0 then do;
         put 'OPENQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'OPENQUEUE: succeeded';
      put "qid2= " qid2;

      rc=0;
      qid=0;
      put '----';
      put 'Call OPENQUEUE';
      CALL OPENQUEUE(qid, tid, 'testcm.subject', 'FETCH', rc, 
         "DYNAMIC(Model=rendcmreceive)", "POLL(Timeout=15)");
      if rc ^= 0 then do;
         put 'OPENQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'OPENQUEUE: succeeded';
      put "qid= " qid;

      /* send a message */
      parm1=100;
      parm2=9999;
      parm3=9999.1234;
      parm4="Demonstrating the rendezvous message api.";

      put '----';
      put 'Call SENDMESSAGE';
      call sendmessage(qid2,rc,"map","rendmap" ,
         parm1,parm2,parm3,parm4); 
      if rc ^= 0 then do;
         put 'send message failed: ';
         msg=sysmsg();
         put msg;
      end;
      else put 'send message succeeded';
   
      rc = 0;
      put '----';
      put 'Call RECEIVEMESSAGE';

      map = "rendmap";
      call receivemessage(qid, rc, event, 
         attchflg,"map",map,recv1,recv2,recv3,recv4); 
      put 'qid =' qid;
      put 'event = ' event;
      put 'attchflg =' attchflg;
      if rc ^= 0 then do;
         put 'receive message failed: ';
         msg=sysmsg();
         put msg;
      end;
      else do;
         put 'receive message succeeded';
         put map;
      end;
      if event eq 'DELIVERY' then
      do;
         put 'Message has been delivered';
         if attchflg eq 1 then do;
            put 'Attachment(s) are associated 
               with this message';
            /* process attachments...*/
         end;
         put 'recv1 = ' recv1;
         put 'recv2 = ' recv2;
         put 'recv3 = ' recv3; 
         put 'recv4 = ' recv4;
      end; 


      rc=0;
      put '----';
      put 'Call CLOSEQUEUE for sender';
      put "qid2= " qid2;
      CALL CLOSEQUEUE(qid2, rc, "DELETE_PURGE");
      if rc ^= 0 then do;
         put 'CLOSEQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'CLOSEQUEUE: succeeded';

      rc=0;
      put '----';
      put 'Call CLOSEQUEUE for receiver';
      put "qid= " qid;
      CALL CLOSEQUEUE(qid, rc, "DELETE_PURGE");
      if rc ^= 0 then do;
         put 'CLOSEQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'CLOSEQUEUE: succeeded';

      rc=0;
      put '----';
      put 'Call TERM';
      CALL TERM(tid, rc);
      if rc ^= 0 then do;
         put 'TERM: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'TERM: succeeded';

   run;

Example 2

In the second example, the sender and listener use separate DATA steps. Each DATA step is run in a separate SAS session. The receiving DATA step needs to start running before the sending DATA step ends.

Sending DATA Step

   /* SAS DATA step to send a certified message */

   %let ldap_host=mynode.alphalite.com;
   %let ldap_port=389; 
   %let ldap_base=o=Alphalite Airways,c=US;  

   
   data _null_;
 
      length msg $ 200;
      length qid2 tid rc 8;
      length map $80;
      length recv4 $50;
      length event $10;
      length queue $ 80;

 
      tid=0;
      rc=0;
      call setmodel("RENDEZVOUS-CM", "RENDCMSENDER", 
         "LDAP", rc, "CMNAME, LEDGER", "cmsender", 
         "c:\sendledger.txt"); 
      if rc ^= 0 then do;
         put 'SETMODEL: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMODEL: succeeded';

      rc=0;
      put '----';
      put 'Call SETMAP';
      CALL SETMAP('rendmap', 'LDAP', rc, 
         'SHORT;LONG;DOUBLE;CHAR,,50'); 
      if rc ^= 0 then do;
         put 'SETMAP: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMAP: succeeded';

	  
      call setalias("queue", "tibcmalias", "LDAP", 
         rc, "RENDEZVOUS-CM", "send.cmmsg");
      if rc ^= 0 then do;
         put 'set_alias failed: ';
         msg=sysmsg();
         put msg;
      end;
      else put 'set_alias succeeded';
      put ' this should be next';

      rc=0;
      qname = "tibcmalias";
      qid2=0;
      put '----';
      put 'Call OPENQUEUE for queue2';
      CALL OPENQUEUE(qid2, tid, qname, 'DELIVERY', 
         rc, "DYNAMIC(Model=rendcmsender)");
      if rc ^= 0 then do;
         put 'OPENQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'OPENQUEUE: succeeded';

      /* send a message */
      parm1=100;
      parm2=9999;
      parm3=9999.1234;
      parm4="Demonstrating the rendezvous message api.";

      put '----';
      put 'Call SENDMESSAGE';
      call sendmessage(qid2,rc,"map, addlistener","rendmap",
         "cmreceive",parm1,parm2,parm3,parm4); 
      if rc ^= 0 then do;
         put 'send message failed: ';
         msg=sysmsg();
         put msg;
      end;
      else put 'send message succeeded';
 
      /* 
      * This or another instance of the certified transport 
      * named cmsender must be active to deliver certified 
      * messages to the listener. 
      */
      slept = sleep(15);

      rc=0;
      put '----';
      put 'Call CLOSEQUEUE for queue2';
      CALL CLOSEQUEUE(qid2, rc);
      if rc ^= 0 then do;
         put 'CLOSEQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'CLOSEQUEUE: succeeded';
 
 
   run;

Receiving DATA Step

   /* SAS DATA step to receive certified messages */
 
   %let ldap_host=mynode.alphalite.com;
   %let ldap_port=389; 
   %let ldap_base=o=Alphalite Airways,c=US;  

   data _null_;

      length msg $ 200;
      length qid tid rc 8;
      length map $80;
      length event $10;
      length queue $ 80;
      length token $300;
      length attach $10;
      length recv1 recv2 recv3 8; 
      length recv4 $50;
      length certified $8;
      length sendername $50;
   
      rc=0;
      call setmodel("RENDEZVOUS-CM", "RENDCMRECEIVE", 
         "LDAP", rc, "CMNAME, LEDGER, REQUESTOLD",
         "cmreceive", "c:\recvledger.txt", "YES"); 

      if rc ^= 0 then do;
         put 'SETMODEL: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'SETMODEL: succeeded';

      call setalias("queue", "tibcmalias", "LDAP", 
         rc, "RENDEZVOUS-CM", "send.cmmsg");
      if rc ^= 0 then do;
         put 'set_alias failed: ';
         msg=sysmsg();
         put msg;
      end;
      else put 'set_alias succeeded';

      rc=0;
      qid=0;
      tid = 0;
      qname = "tibcmalias";
      put '----';
      put 'Call OPENQUEUE';
      CALL OPENQUEUE(qid, tid, qname, 'FETCH', rc, 
         "DYNAMIC(Model=rendcmreceive)", "POLL(TIMEOUT=30)");
      if rc ^= 0 then do;
         put 'OPENQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'OPENQUEUE: succeeded';
      put "qid= " qid;

      put "CALL receivemessage";
      map = "rendmap";
      call receivemessage(qid, rc, event, 
         attchflg,"map,certified,sendername",map, certified, 
         sendername, recv1,recv2,recv3,recv4); 
      put 'qid =' qid;
      put 'event = ' event;
      put 'attchflg =' attchflg;
      put 'certified = ' certified;
      put 'sendername = ' sendername;
      if rc ^= 0 then do;
         put 'receive message failed: ';
         msg=sysmsg();
         put msg;
      end;
      else do;
         put 'receive message succeeded';
         put map;
      end;
      if event eq 'DELIVERY' then
      do;
         put 'Message has been delivered';
         if attchflg eq 1 then do;
            put 'Attachment(s) are associated 
               with this message';
            /* process attachments...*/
         end;
         put 'recv1 = ' recv1;
         put 'recv2 = ' recv2;
         put 'recv3 = ' recv3; 
         put 'recv4 = ' recv4;
      end; 

   rc=0;
      put '----';
      put 'Call CLOSEQUEUE for queue1';
      CALL CLOSEQUEUE(qid, rc);
      if rc ^= 0 then do;
         put 'CLOSEQUEUE: failed';
         msg = sysmsg();
         put msg;
      end;
      else put 'CLOSEQUEUE: succeeded';

      rc=0;
      put '----';


   run;