MQ Batch Toolkit v3.1.0 Released

Capitalware Inc. would like to announce the official release of MQ Batch Toolkit v3.1.0. This is a FREE upgrade for ALL licensed users of MQ Batch Toolkit. MQ Batch Toolkit allows users to manipulate, monitor and manage messages in a queue of an IBM MQ (formally WebSphere MQ & MQSeries) queue manager from a command-line or shell scripting environment.

For more information about MQ Batch Toolkit go to:
https://www.capitalware.com/mqbt_overview.html

    Changes for MQ Batch Toolkit v3.1.0:

  • Updated Backup and BackupTopic functions to support writing the messages to an SQLite database.
  • Updated Restore and RestoreTopic functions to support reading the messages from an SQLite database.
  • Updated PutServer, SIMClient, SIMServer and PublishServer functions to support reading the messages from an SQLite database.
  • Changed the web call to capitalware.com server for license registration from http to https.
  • Updated AddProfile and AlterProfile to support UserId compatibility mode to send the UserId and Password as done in releases prior to IBM MQ V8.
  • Updated docs (English only)

Regards,
Roger Lacroix
Capitalware Inc.

Capitalware, IBM MQ, IBM MQ Appliance, Linux, macOS (Mac OS X), MQ Batch Toolkit, Windows Comments Off on MQ Batch Toolkit v3.1.0 Released

WebSphere MQ Fix Pack 5.3.1.15 for HP NonStop Server Released

IBM has just released Fix Pack 5.3.1.15 for WebSphere MQ for HP NonStop Server:
https://www.ibm.com/support/docview.wss?uid=ibm10719657

Regards,
Roger Lacroix
Capitalware Inc.

Fix Packs for MQ, HPE NonStop, IBM MQ Comments Off on WebSphere MQ Fix Pack 5.3.1.15 for HP NonStop Server Released

MQTC v2.0.1.8 Platinum Sponsor: Nastel Technologies

Capitalware would like to announce that Nastel Technologies is a Platinum Sponsor of MQ Technical Conference v2.0.1.8 (MQTC).

For more information, please go to: https://www.mqtechconference.com

Regards,
Roger Lacroix
Capitalware Inc.

Education, IBM MQ, MQ Technical Conference Comments Off on MQTC v2.0.1.8 Platinum Sponsor: Nastel Technologies

Java MQ Code to List Queue Status

The other day I answered a question on StackOverflow about getting the LGETIME and LPUTIME attributes of queue status command. I figured I should also post the code here for everyone to read & use.

If you have done the runmqsc command for Queue Status of Type ‘Queue’ for all queues of a queue manager as follows:

DIS QSTATUS(*) TYPE(QUEUE)

And you wanted to do the same thing via a program, here is a fully functioning Java MQ example that will connect to a remote queue manager, issue a PCF “Inquire Queue Status” command, get the PCF response messages, loop through the PCF responses and output the information. You can download the source code from here.

For more information about the PCF “Inquire Queue Status” command, go to MQ KnowLedge Center here.

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;

import com.ibm.mq.MQException;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.CMQC;
import com.ibm.mq.constants.CMQCFC;
import com.ibm.mq.headers.MQDataException;
import com.ibm.mq.headers.pcf.PCFMessage;
import com.ibm.mq.headers.pcf.PCFMessageAgent;

/**
 * Program Name
 *  MQListQueueStatus01
 *
 * Description
 *  This java class issues a PCF "inquire queue status" request message for all ("*") queues 
 *  of a remote queue manager. 
 *
 * Sample Command Line Parameters
 *  -m MQA1 -h 127.0.0.1 -p 1414 -c TEST.CHL -q TEST.Q1 -u UserID -x Password
 *
 * @author Roger Lacroix
 */
public class MQListQueueStatus01
{
   private static final SimpleDateFormat  LOGGER_TIMESTAMP = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");

   private Hashtable<String,String> params;
   private Hashtable<String,Object> mqht;
   private String qMgrName;

   public MQListQueueStatus01()
   {
      super();
      params = new Hashtable<String,String>();
      mqht = new Hashtable<String,Object>();
   }

   /**
    * Make sure the required parameters are present.
    * @return true/false
    */
   private boolean allParamsPresent()
   {
      boolean b = params.containsKey("-h") && params.containsKey("-p") &&
                  params.containsKey("-c") && params.containsKey("-m") &&
                  params.containsKey("-u") && params.containsKey("-x");
      if (b)
      {
         try
         {
            Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            b = false;
         }
      }

      return b;
   }

   /**
    * Extract the command-line parameters and initialize the MQ HashTable.
    * @param args
    * @throws IllegalArgumentException
    */
   private void init(String[] args) throws IllegalArgumentException
   {
      int port = 1414;
      if (args.length > 0 && (args.length % 2) == 0)
      {
         for (int i = 0; i < args.length; i += 2)
         {
            params.put(args[i], args[i + 1]);
         }
      }
      else
      {
         throw new IllegalArgumentException();
      }

      if (allParamsPresent())
      {
         qMgrName = (String) params.get("-m");
         
         try
         {
            port = Integer.parseInt((String) params.get("-p"));
         }
         catch (NumberFormatException e)
         {
            port = 1414;
         }
         
         mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c"));
         mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h"));
         mqht.put(CMQC.PORT_PROPERTY, new Integer(port));
         mqht.put(CMQC.USER_ID_PROPERTY, params.get("-u"));
         mqht.put(CMQC.PASSWORD_PROPERTY, params.get("-x"));

         // I don't want to see MQ exceptions at the console.
         MQException.log = null;
      }
      else
      {
         throw new IllegalArgumentException();
      }
   }
   
   private void doPCF()
   {
      MQQueueManager qMgr = null;
      PCFMessageAgent agent = null;
      PCFMessage   request = null;
      PCFMessage[] responses = null;
      
      try
      {
         qMgr = new MQQueueManager(qMgrName, mqht);
         MQListQueueStatus01.logger("successfully connected to "+ qMgrName);

         agent = new PCFMessageAgent(qMgr);
         MQListQueueStatus01.logger("successfully created agent");
      
         // https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.1.0/com.ibm.mq.ref.adm.doc/q087880_.htm
         request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_Q_STATUS);
         
         /**
          * You can explicitly set a queue name like "TEST.Q1" or
          * use a wild card like "TEST.*"
          */
         request.addParameter(CMQC.MQCA_Q_NAME, "*");
         
         // Add a parameter to select TYPE of QUEUE (rather than HANDLE i.e. MQIACF_Q_HANDLE)
         request.addParameter(CMQCFC.MQIACF_Q_STATUS_TYPE, CMQCFC.MQIACF_Q_STATUS);

         // Add a parameter that selects all of the attributes we want
         request.addParameter(CMQCFC.MQIACF_Q_STATUS_ATTRS,
                              new int [] { CMQC.MQCA_Q_NAME,
                                           CMQC.MQIA_CURRENT_Q_DEPTH,
                                           CMQC.MQIA_OPEN_INPUT_COUNT,
                                           CMQC.MQIA_OPEN_OUTPUT_COUNT,
                                           CMQCFC.MQCACF_LAST_PUT_DATE,
                                           CMQCFC.MQCACF_LAST_PUT_TIME,
                                           CMQCFC.MQCACF_LAST_GET_DATE,
                                           CMQCFC.MQCACF_LAST_GET_TIME,
                                         });
         /**
          * Other attributes that can be used for TYPE(QUEUE)
          * - MQIA_MONITORING_Q
          * - MQCACF_MEDIA_LOG_EXTENT_NAME
          * - MQIACF_OLDEST_MSG_AGE
          * - MQIACF_Q_TIME_INDICATOR
          * - MQIACF_UNCOMMITTED_MSGS
          */

         responses = agent.send(request);
         
         for (int i = 0; i < responses.length; i++)
         {
            if ( ((responses[i]).getCompCode() == CMQC.MQCC_OK) &&
                 ((responses[i]).getParameterValue(CMQC.MQCA_Q_NAME) != null) )
            {
               String name = responses[i].getStringParameterValue(CMQC.MQCA_Q_NAME);
               if (name != null)
                  name = name.trim();

               int depth = responses[i].getIntParameterValue(CMQC.MQIA_CURRENT_Q_DEPTH);
               int iprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_INPUT_COUNT);
               int oprocs = responses[i].getIntParameterValue(CMQC.MQIA_OPEN_OUTPUT_COUNT);
               
               String lastPutDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_DATE);
               if (lastPutDate != null)
                  lastPutDate = lastPutDate.trim();

               String lastPutTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_PUT_TIME);
               if (lastPutTime != null)
                  lastPutTime = lastPutTime.trim();

               String lastGetDate = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_DATE);
               if (lastGetDate != null)
                  lastGetDate = lastGetDate.trim();

               String lastGetTime = responses[i].getStringParameterValue(CMQCFC.MQCACF_LAST_GET_TIME);
               if (lastGetTime != null)
                  lastGetTime = lastGetTime.trim();

               MQListQueueStatus01.logger("Name="+name + " : depth="+depth + " : iprocs="+iprocs+" : oprocs="+oprocs+" : lastPutDate='"+lastPutDate+"' : lastPutTime='"+lastPutTime+"' : lastGetDate='"+lastGetDate+"' : lastGetTime='"+lastGetTime+"'");
            }
         }
      }
      catch (MQException e)
      {
         MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
      }
      catch (IOException e)
      {
         MQListQueueStatus01.logger("IOException:" +e.getLocalizedMessage());
      }
      catch (MQDataException e)
      {
         MQListQueueStatus01.logger("MQDataException:" +e.getLocalizedMessage());
      }
      finally
      {
         try
         {
            if (agent != null)
            {
               agent.disconnect();
               MQListQueueStatus01.logger("disconnected from agent");
            }
         }
         catch (MQDataException e)
         {
            MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }

         try
         {
            if (qMgr != null)
            {
               qMgr.disconnect();
               MQListQueueStatus01.logger("disconnected from "+ qMgrName);
            }
         }
         catch (MQException e)
         {
            MQListQueueStatus01.logger("CC=" +e.completionCode + " : RC=" + e.reasonCode);
         }
      }
   }

   /**
    * A simple logger method
    * @param data
    */
   public static void logger(String data)
   {
      String className = Thread.currentThread().getStackTrace()[2].getClassName();

      // Remove the package info.
      if ( (className != null) && (className.lastIndexOf('.') != -1) )
         className = className.substring(className.lastIndexOf('.')+1);

      System.out.println(LOGGER_TIMESTAMP.format(new Date())+" "+className+": "+Thread.currentThread().getStackTrace()[2].getMethodName()+": "+data);
   }

   public static void main(String[] args)
   {
      MQListQueueStatus01 mqlqs = new MQListQueueStatus01();
      
      try
      {
         mqlqs.init(args);
         mqlqs.doPCF();
      }
      catch (IllegalArgumentException e)
      {
         MQListQueueStatus01.logger("Usage: java MQListQueueStatus01 -m QueueManagerName -h host -p port -c channel -u UserID -x Password");
         System.exit(1);
      }

      System.exit(0);
   }
}

Regards,
Roger Lacroix
Capitalware Inc.

Capitalware, HPE NonStop, IBM i (OS/400), IBM MQ, IBM MQ Appliance, Java, Linux, macOS (Mac OS X), Open Source, PCF, Programming, Unix, Windows Comments Off on Java MQ Code to List Queue Status

MQTC v2.0.1.8 Gold Sponsor: OpenLogix

Capitalware would like to announce that OpenLogix is a Gold Sponsor of MQ Technical Conference v2.0.1.8 (MQTC).

For more information, please go to: https://www.mqtechconference.com

Regards,
Roger Lacroix
Capitalware Inc.

Education, IBM MQ, MQ Technical Conference Comments Off on MQTC v2.0.1.8 Gold Sponsor: OpenLogix

NetBSD v8.0 Released

NetBSD Project has just released NetBSD v8.0.
https://www.netbsd.org/releases/formal-8/NetBSD-8.0.html

NetBSD is a free, fast, secure, and highly portable Unix-like Open Source operating system. It is available for a wide range of platforms, from large-scale servers and powerful desktop systems to handheld and embedded devices.

Regards,
Roger Lacroix
Capitalware Inc.

Open Source, Operating Systems Comments Off on NetBSD v8.0 Released

MQTC v2.0.1.8 Silver Sponsor: NetFlexity

Capitalware would like to announce that NetFlexity is a Silver Sponsor of MQ Technical Conference v2.0.1.8 (MQTC).

For more information, please go to: https://www.mqtechconference.com

Regards,
Roger Lacroix
Capitalware Inc.

Education, IBM MQ, MQ Technical Conference Comments Off on MQTC v2.0.1.8 Silver Sponsor: NetFlexity

Chris Frank’s Sessions for MQTC v2.0.1.8

Chris Frank of IBM will be speaking at MQ Technical Conference v2.0.1.8 (MQTC). Chris Frank will be presenting the following sessions at MQTC:

  • Getting the most out of IIB and ACE!
  • What’s new with Logging in IBM MQ

For more information about MQTC, please go to:
https://www.mqtechconference.com

Regards,
Roger Lacroix
Capitalware Inc.

Capitalware, IBM MQ, MQ Technical Conference Comments Off on Chris Frank’s Sessions for MQTC v2.0.1.8

Capitalware & MQTC web sites and SSL

I use HostGator for hosting of Capitalware’s and MQ Technical Conference’s (MQTC) web sites.

HostGator has implemented SSL for my sites, so you should be able to access the web sites using “https” rather than “http”.

If you have either site bookmarked then update your bookmark, so that you go to the https://www.capitalware.com or https://www.mqtechconference.com

If you have any issues, please let me know.

Regards,
Roger Lacroix
Capitalware Inc.

Capitalware, MQ Technical Conference, Security Comments Off on Capitalware & MQTC web sites and SSL

MQTC v2.0.1.8 Gold Sponsor: Avada Software

Capitalware would like to announce that Avada Software is a Gold Sponsor of MQ Technical Conference v2.0.1.8 (MQTC).

For more information, please go to: https://www.mqtechconference.com

Regards,
Roger Lacroix
Capitalware Inc.

Education, IBM MQ, MQ Technical Conference Comments Off on MQTC v2.0.1.8 Gold Sponsor: Avada Software