The other day, someone on StackOverflow asked about creating an IBM MQ queue from JMS. I know it is possible to send PCF commands as a JMS message to the Command Server but it seems overly complex when you can simply do it from Java/PCF (non-JMS).
If you are used to creating an IBM MQ queue using runmqsc command then the following simple Java/PCF program will create a IBM MQ queue based on the following runmqsc command:
DEFINE QL('TEST.QUEUE') MAXMSGL(10485760) MAXDEPTH(12345)
You can download the source code from 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.MQConstants; import com.ibm.mq.headers.MQDataException; import com.ibm.mq.headers.pcf.PCFException; import com.ibm.mq.headers.pcf.PCFMessage; import com.ibm.mq.headers.pcf.PCFMessageAgent; /** * Program Name * MQCreateQueue01 * * Description * This java class issues a PCF "create queue" request message to create a local queue * specifying max message length & max queue depth on a remote queue manager. * * This PCF code is equivalent to issuing the runmqsc command of: * DEFINE QL('TEST.QUEUE') MAXMSGL(10485760) MAXDEPTH(12345) * * Sample Command Line Parameters * -m MQA1 -q Queue_Name -h 127.0.0.1 -p 1414 -c TEST.CHL -u UserID -x Password * * @author Roger Lacroix */ public class MQCreateQueue01 { 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; public MQCreateQueue01() { 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("-q") && 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()) { 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(); } } /** * Handle connecting to the queue manager, issuing PCF command then * disconnect from the queue manager. */ private void doPCF() { String qMgrName = (String) params.get("-m"); String qName = (String) params.get("-q"); MQQueueManager qMgr = null; PCFMessageAgent agent = null; PCFMessage request = null; try { qMgr = new MQQueueManager(qMgrName, mqht); logger("successfully connected to "+ qMgrName); agent = new PCFMessageAgent(qMgr); logger("successfully created agent"); // https://www.ibm.com/docs/en/ibm-mq/latest?topic=formats-change-copy-create-queue request = new PCFMessage(MQConstants.MQCMD_CREATE_Q); // Specify the queue name to be created. request.addParameter(MQConstants.MQCA_Q_NAME, qName); // Add parameter to set queue type to be a local queue request.addParameter(MQConstants.MQIA_Q_TYPE, MQConstants.MQQT_LOCAL); // Add parameter to set the max message length to be 10MB request.addParameter(MQConstants.MQIA_MAX_MSG_LENGTH, 10 * 1024 * 1024); // Add parameter to set the max queue depth to be 12,345 request.addParameter(MQConstants.MQIA_MAX_Q_DEPTH, 12345); agent.send(request); logger("successfully created queue: " + qName); } catch (PCFException pcfe) { if (pcfe.reasonCode == MQConstants.MQRCCF_OBJECT_ALREADY_EXISTS) logger("Error: The queue '" + qName+ "' already exists on the queue manager '" + qMgrName + "'."); else logger("CC=" +pcfe.completionCode + " [" + MQConstants.lookupCompCode(pcfe.completionCode) + "] : RC=" + pcfe.reasonCode + " ["+MQConstants.lookupReasonCode(pcfe.reasonCode)+"]"); } catch (MQException e) { logger("CC=" +e.completionCode + " [" + MQConstants.lookupCompCode(e.completionCode) + "] : RC=" + e.reasonCode + " ["+MQConstants.lookupReasonCode(e.reasonCode)+"]"); } catch (IOException e) { logger("IOException:" +e.getLocalizedMessage()); } catch (MQDataException e) { logger("MQDataException:" +e.getLocalizedMessage()); } catch (Exception e) { logger("Exception:" +e.getLocalizedMessage()); } finally { try { if (agent != null) { agent.disconnect(); logger("disconnected from agent"); } } catch (MQDataException e) { logger("CC=" +e.completionCode + " : RC=" + e.reasonCode); } try { if (qMgr != null) { qMgr.disconnect(); logger("disconnected from "+ qMgrName); } } catch (MQException e) { 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) { MQCreateQueue01 mqcq = new MQCreateQueue01(); try { mqcq.init(args); mqcq.doPCF(); } catch (IllegalArgumentException e) { logger("Usage: java MQCreateQueue01 -m QueueManagerName -q Queue_Name -h host -p port -c channel -u UserID -x Password"); System.exit(1); } System.exit(0); } }
Regards,
Roger Lacroix
Capitalware Inc.