Java Program to Send an MQSC Command to a z/OS Queue Manager

The other day I created a C program to send an MQSC command to a z/OS Manager and since I have done the same thing in Java, I thought I would publish a Java program to send an MQSC command to a z/OS queue manager.

You can download it as a zip file from here or you can copy from below:

/**
 * Program Name
 *  SendCmdTozOS.java
 *
 * Description
 * SendCmdTozOS is a simple MQ program that will send an MQSC command
 * to a z/OS queue manager's command queue and then wait for a response.
 *
 * Input Parameters:
 *    QMgrName ChlName hostname port "MQSC command"
 *
 * Where
 *    QMgrName is the queue manager name
 *    ChlName is the name of the channel to be used
 *    hostname is the hostname
 *    port is the port number
 *    "MQSC command" is the MQSC command you want to send to the z/OS queue manager
 * i.e.
 *    SendCmdTozOS MQT1 TEST.CHL 10.10.10.10 1415 "DIS QL(*)"
 *
 * @author Roger Lacroix, Capitalware Inc.
 * @return 0 for ok or 1 for failed.
 * @version 1.0.0
 * @license Apache 2 License
 */

import com.ibm.mq.*;

import java.io.IOException;
import java.util.Hashtable;

/**
 * ==================================================================
 *
 * Description
 *  This class will:
 *  - Connect to a remote z/OS queue manager
 *  - Open a temporary dynamic queue
 *  - Put a message on the queue manager's command queue
 *  - Get a reply message from the temporary dynamic queue
 *  - Close the temporary dynamic queue
 *  - Disconnect from the queue manager
 *
 * ------------------------------------------------------------------
 */
public class SendCmdTozOS
{
   private final static String VERSION = "1.0.0";

   private final static String SYSTEM_COMMAND_INPUT       = "SYSTEM.COMMAND.INPUT";
   private final static String SYSTEM_MODEL_REPLY_QUEUE   = "SYSTEM.COMMAND.REPLY.MODEL";
   private final static String TEMP_DYNAMIC_QUEUE_PREFIX  = "CSQ.*";

   /**
    * main entry point for this class. 
    *
    * Input parameters
    * @param args - pointer to a string array of input parameters
    */
   public static void main(String[] args)
   {
      if (args.length != 5)
      {
         System.out.println("Usage: java SendCmdTozOS QMgrName ChlName hostname port \"MQSC command\"");
         System.exit(1);
      }
      
      SendCmdTozOS sctz = new SendCmdTozOS(args[0],  /* z/OS queue manager name */
                                           args[1],  /* z/OS channel name */
                                           args[2],  /* z/OS hostname */
                                           args[3],  /* z/OS port # */
                                           args[4]); /* MQSC command for z/OS queue manager */
   }

   /**
    * The constructor
    * 
    * This routine will will send an MQSC command to a z/OS queue manager's 
    *  command queue and then wait for a response.
    * 
    * @param QMgrName   - Queue Manager name
    * @param chlName    - channel name to qeue manager
    * @param hostname   - hostname/IP address
    * @param port       - port #
    * @param MQSCCommand- MQSC command to be sent to the z/OS queue manager
    */
   public SendCmdTozOS(String qMgrName, String chlName, String hostname, String port, String MQSCCommand)
   {
      super();

      MQQueueManager  qMgr = null;
      MQQueue inQ = null;
      MQQueue cmdQ = null;
      int openInputOptions  = MQC.MQOO_INQUIRE + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INPUT_SHARED;
      int openOutputOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;

      System.out.println("SendCmdTozOS v"+VERSION + " starting");
      
      try
      {
         qMgr = doConnect(qMgrName, chlName, hostname, port);     
         System.out.println("Connected to '" + qMgrName + "'");

         inQ = qMgr.accessQueue( SYSTEM_MODEL_REPLY_QUEUE,
                                 openInputOptions,
                                 null,         
                                 TEMP_DYNAMIC_QUEUE_PREFIX,
                                 null );      
         System.out.println("Opened temporary dynamic queue '" + inQ.name + "'");

         cmdQ = qMgr.accessQueue( SYSTEM_COMMAND_INPUT,
                                  openOutputOptions,
                                  null,
                                  null,
                                  null );
         System.out.println("Opened command queue '" + SYSTEM_COMMAND_INPUT + "'");

         sendMessage(qMgr, cmdQ, qMgrName, inQ.name, MQSCCommand);

         getCmdMessages(inQ);
      }
      catch (MQException e)
      {
         System.err.println("MQException: CC=" + e.completionCode + " : RC=" + e.reasonCode);
      }
      catch (IOException e)
      {
         System.err.println("IOException: " + e.getLocalizedMessage());
      }
      finally
      {
         handleClosingQ(inQ);
         handleClosingQ(cmdQ);
         handleDisconnecting(qMgr);
      }
      
      System.out.println("SendCmdTozOS ending");
   }
   
   /**
    *  This routine will establish a connection between this application 
    *  and a remote queue manager.
    *
    * @param QMgrName - Queue Manager name
    * @param chlName  - channel name to qeue manager
    * @param hostname - hostname/IP address
    * @param port     - port #
    *
    * @exception MQException
    *
    * @return qMgr - MQQueueManager object
    */
   private MQQueueManager doConnect(String qMgrName, String chlName, String hostname, String port) throws MQException
   {
      Hashtable mqht = new Hashtable();

      mqht.put(MQC.CHANNEL_PROPERTY, chlName);
      mqht.put(MQC.HOST_NAME_PROPERTY, hostname);
      mqht.put(MQC.PORT_PROPERTY, new Integer(port));

      return new MQQueueManager(qMgrName, mqht);
   }
   
   /**
    *  This routine will close the queue.
    *
    * @param q - queue object
    */
   private void handleClosingQ(MQQueue q)
   {
      String qName = null;
      try
      {
         if (q != null)
         {
            qName = q.name.trim();
            q.close();
            System.out.println("Closed queue '" + qName + "'");
         }
      }
      catch (MQException e)
      {
         System.err.println("MQException: close() '"+qName+"' CC=" + e.completionCode + " : RC=" + e.reasonCode);
      }
   }
   
   /**
    *  This routine will disconnect from the queue manager.
    *
    * @param qMgr - queue manager object
    */
   private void handleDisconnecting(MQQueueManager qMgr)
   {
      String qMgrName = null;
      try
      {
         if (qMgr != null)
         {
            qMgrName = qMgr.name;
            qMgr.disconnect();
            System.out.println("Disconnected from '" + qMgrName + "'");
         }
      }
      catch (MQException e)
      {
         System.err.println("MQException: qMgr.disconnect() CC=" + e.completionCode + " : RC=" + e.reasonCode);
      }
   }
   
   /**
    *  This routine will put the MQSC command on the queue manager's command queue.
    *
    * @param qMgr       - connection object
    * @param cmdQ       - Object command Q
    * @param qMgrName   - Q Manager Name
    * @param replyQName - Reply Q name
    * @param MQSCCommand- MQSC Command
    * 
    * @exception MQException
    * @exception IOException
    */
   private void sendMessage(MQQueueManager qMgr, MQQueue cmdQ, String qMgrName, String replyQName, String MQSCCommand) throws MQException, IOException
   {
      MQPutMessageOptions pmo = new MQPutMessageOptions();
      pmo.options = MQC.MQPMO_FAIL_IF_QUIESCING | MQC.MQPMO_NO_SYNCPOINT;

      MQMessage sendmsg                = new MQMessage();
      sendmsg.format                   = MQC.MQFMT_STRING;
      sendmsg.feedback                 = MQC.MQFB_NONE;
      sendmsg.messageType              = MQC.MQMT_REQUEST;
      sendmsg.replyToQueueName         = replyQName;
      sendmsg.replyToQueueManagerName  = qMgrName;
      sendmsg.messageId                = MQC.MQMI_NONE;
      sendmsg.correlationId            = MQC.MQCI_NONE;
      sendmsg.writeString(MQSCCommand);

      // put the message on the command queue
      cmdQ.put(sendmsg, pmo);
      System.out.println("Cmd Sent: " + MQSCCommand);
   }

   /**
    *  This routine will get all reply messages from our temporary dynamic queue.
    *
    * Input parameters
    * @param inQ - Object handle for reply Q
    *
    * Output
    *  Response messages will be written to stdout
    */
   private void getCmdMessages(MQQueue inQ)
   {
      MQMessage getMsg = null;
      MQGetMessageOptions getOptions = new MQGetMessageOptions();
      getOptions.options = MQC.MQGMO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING + MQC.MQGMO_CONVERT + MQC.MQGMO_NO_SYNCPOINT;
      getOptions.waitInterval = 5 * 1000; /* wait up to 5 seconds */ 
      boolean more = true;

      while (more)
      {
         getMsg = new MQMessage();
         try
         {
            inQ.get(getMsg, getOptions);
            byte[] b = new byte[getMsg.getMessageLength()];
            getMsg.readFully(b);
            String replyMsg = new String(b);
            System.out.println("Response: " + replyMsg);
            
            if (replyMsg.indexOf("CSQ9022I") != -1)
            {
               more = false; /* no more messages to follow */
            }
         }
         catch (IOException e)
         {
            System.err.println("IOException: " + e.getMessage());
            more = false;
         }
         catch (MQException e)
         {
            if ( (e.completionCode == MQException.MQCC_FAILED) && 
                 (e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE) )
            {
               // System.out.println("All messages read.");
            }
            else
            {
               System.err.println("MQException: CC=" + e.completionCode + " : RC=" + e.reasonCode);
            }
            more = false;
         }
      }
   }
}

Regards,
Roger Lacroix
Capitalware Inc.

This entry was posted in IBM i (OS/400), IBM MQ, Java, Linux, macOS (Mac OS X), Open Source, Programming, Unix, Windows.

Comments are closed.