putting and getting, putting a datagram, sample program, getting a datagram, HELLO WORLD (imqwrld.cpp), sample programs, examples" /> Sample program HELLO WORLD (imqwrld.cpp)

 

Sample program HELLO WORLD (imqwrld.cpp)

This program shows how to put and get a regular datagram (C structure) using the ImqMessage class. This sample uses few method invocations, taking advantage of implicit method invocations such as open, close, and disconnect.

 

On all platforms except z/OS

If you are using a server connection to WebSphere MQ:

  1. Run imqwrlds to use the existing default queue SYSTEM.DEFAULT.LOCAL.QUEUE.

  2. Run imqwrlds SYSTEM.DEFAULT.MODEL.QUEUE to use a temporary dynamically assigned queue.

For details of executing C++ programs, see Appendix A. Compiling and linking.

Notes:

  1. If you are using a client connection to WebSphere MQ, either:

    1. Set up the MQSERVER environment variable (see WebSphere MQ Clients for more information) and run imqwrldc, or

    2. Run imqwrldc queue-name queue-manager-name channel-definition where a typical channel-definition might be SYSTEM.DEF.SVRCONN/TCP/hostname (1414)

 

On z/OS

Construct and run a batch job, using the sample JCL imqwrldr. See Running sample programs on z/OS for more information.

 

Sample code

Here is the code for the HELLO WORLD sample program.

extern "C" {
#include <stdio.h>
}
 
#include <imqi.hpp> // WebSphere MQ C++
 
#define EXISTING_QUEUE "SYSTEM.DEFAULT.LOCAL.QUEUE"
 
#define BUFFER_SIZE 12
 
static char gpszHello[ BUFFER_SIZE ] = "Hello world" ;
int main ( int argc, char * * argv ) {
  ImqQueueManager manager ;
  int iReturnCode = 0 ;
 
  // Connect to the queue manager.
  if ( argc > 2 ) {
    manager.setName( argv[ 2 ] );
  }
  if ( manager.connect( ) ) {
    ImqQueue * pqueue = new ImqQueue ;
    ImqMessage * pmsg = new ImqMessage ;
 
    // Identify the queue which will hold the message.
    pqueue -> setConnectionReference( manager );
    if ( argc > 1 ) {
      pqueue -> setName( argv[ 1 ] );

 
      // The named queue can be a model queue, which will result in
      // the creation of a temporary dynamic queue, which will be
      // destroyed as soon as it is closed. Therefore we must ensure
      // that such a queue is not automatically closed and reopened.
      // We do this by setting open options which will avoid the need
      // for closure and reopening.
      pqueue -> setOpenOptions( MQOO_OUTPUT | MQOO_INPUT_SHARED |
                                MQOO_INQUIRE );
    } else {
      pqueue -> setName( EXISTING_QUEUE );
 
      // The existing queue is not a model queue, and will not be
      // destroyed by automatic closure and reopening. Therefore we
      // will let the open options be selected on an as-needed basis.
      // The queue will be opened implicitly with an output option
      // during the "put", and then implicitly closed and reopened
      // with the addition of an input option during the "get".
    }
 
    // Prepare a message containing the text "Hello world".
    pmsg -> useFullBuffer( gpszHello , BUFFER_SIZE );
    pmsg -> setFormat( MQFMT_STRING );
 
    // Place the message on the queue, using default put message
    // Options.
    // The queue will be automatically opened with an output option.
    if ( pqueue -> put( * pmsg ) ) {
      ImqString strQueue( pqueue -> name( ) );
 
      // Discover the name of the queue manager.
      ImqString strQueueManagerName( manager.name( ) );
      printf( "The queue manager name is %s.\n",
              (char *)strQueueManagerName );
 
      // Show the name of the queue.
      printf( "Message sent to %s.\n", (char *)strQueue );
 
      // Retrieve the data message just sent ("Hello world" expected)
      // from the queue, using default get message options. The queue
      // is automatically closed and reopened with an input option
      // if it is not already open with an input option. We get the
      // message just sent, rather than any other message on the
      // queue, because the "put" will have set the ID of the message
      // so, as we are using the same message object, the message ID
      // acts as in the message object, a filter which says that we
      // are interested in a message only if it has this
      // particular ID.

      if ( pqueue -> get( * pmsg ) ) {
        int iDataLength = pmsg -> dataLength( );
 
        // Show the text of the received message.
        printf( "Message of length %d received, ", iDataLength );
 
        if ( pmsg -> formatIs( MQFMT_STRING ) ) {
          char * pszText = pmsg -> bufferPointer( );
 
          // If the last character of data is a null, then we can
          // assume that the data can be interpreted as a text
          // string.
          if ( ! pszText[ iDataLength - 1 ] ) {
            printf( "text is \"%s\".\n", pszText );
          } else {
            printf( "no text.\n" );
          }
 
        } else {
          printf( "non-text message.\n" );
        }
      } else {
        printf( "ImqQueue::get failed with reason code %ld\n",
                pqueue -> reasonCode( ) );
        iReturnCode = (int)pqueue -> reasonCode( );
      }
 
    } else {
      printf( "ImqQueue::open/put failed with reason code %ld\n",
              pqueue -> reasonCode( ) );
      iReturnCode = (int)pqueue -> reasonCode( );
    }
 
    // Deletion of the queue will ensure that it is closed.
    // If the queue is dynamic then it will also be destroyed.
    delete pqueue ;
    delete pmsg ;
 
  } else {
    printf( "ImqQueueManager::connect failed with reason code %ld\n"
            manager.reasonCode( ) );
    iReturnCode = (int)manager.reasonCode( );
  }
 
  // Destruction of the queue manager ensures that it is
  // disconnected.  If the queue object were still available
  // and open (which it is not), the queue would be closed
  // prior to disconnection.
 
  return iReturnCode ;
}