The other day I answered a question on StackOverflow about subscribing to a topic using C# .NET code. I figured I should also post the code here for everyone to read & use.
You can download the source code from here.
using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Threading; using IBM.WMQ; /// <summary> Program Name /// MQTest82 /// /// Description /// This C# class will connect to a remote queue manager /// and get messages from a topic using a managed .NET environment. /// /// Sample Command Line Parameters /// -h 127.0.0.1 -p 1414 -c TEST.CHL -m MQA1 -t abc/xyz -u tester -x mypwd /// </summary> /// <author> Roger Lacroix /// </author> namespace MQTest82 { public class MQTest82 { private Hashtable inParms = null; private Hashtable qMgrProp = null; private System.String qManager; private System.String topicString; /* * The constructor */ public MQTest82() : base() { } /// <summary> Make sure the required parameters are present.</summary> /// <returns> true/false /// </returns> private bool allParamsPresent() { bool b = inParms.ContainsKey("-h") && inParms.ContainsKey("-p") && inParms.ContainsKey("-c") && inParms.ContainsKey("-m") && inParms.ContainsKey("-t"); if (b) { try { System.Int32.Parse((System.String)inParms["-p"]); } catch (System.FormatException e) { b = false; } } return b; } /// <summary> Extract the command-line parameters and initialize the MQ variables.</summary> /// <param name="args"> /// </param> /// <throws> IllegalArgumentException </throws> private void init(System.String[] args) { inParms = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable(14)); if (args.Length > 0 && (args.Length % 2) == 0) { for (int i = 0; i < args.Length; i += 2) { inParms[args[i]] = args[i + 1]; } } else { throw new System.ArgumentException(); } if (allParamsPresent()) { qManager = ((System.String)inParms["-m"]); topicString = ((System.String)inParms["-t"]); qMgrProp = new Hashtable(); qMgrProp.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED); qMgrProp.Add(MQC.HOST_NAME_PROPERTY, ((System.String)inParms["-h"])); qMgrProp.Add(MQC.CHANNEL_PROPERTY, ((System.String)inParms["-c"])); try { qMgrProp.Add(MQC.PORT_PROPERTY, System.Int32.Parse((System.String)inParms["-p"])); } catch (System.FormatException e) { qMgrProp.Add(MQC.PORT_PROPERTY, 1414); } if (inParms.ContainsKey("-u")) qMgrProp.Add(MQC.USER_ID_PROPERTY, ((System.String)inParms["-u"])); if (inParms.ContainsKey("-x")) qMgrProp.Add(MQC.PASSWORD_PROPERTY, ((System.String)inParms["-x"])); logger("Parameters:"); logger(" QMgrName ='" + qManager + "'"); logger(" Topic String ='" + topicString + "'"); logger("Connection values:"); foreach (DictionaryEntry de in qMgrProp) { logger(" " + de.Key + " = '" + de.Value + "'"); } } else { throw new System.ArgumentException(); } } /// <summary> Connect, open topic, get messages, close topic and disconnect. </summary> /// private void testReceive() { MQQueueManager qMgr = null; MQTopic inTopic = null; int openOptionsForGet = MQC.MQSO_CREATE | MQC.MQSO_FAIL_IF_QUIESCING | MQC.MQSO_MANAGED | MQC.MQSO_NON_DURABLE; try { qMgr = new MQQueueManager(qManager, qMgrProp); logger("successfully connected to " + qManager); inTopic = qMgr.AccessTopic(topicString, null, MQC.MQTOPIC_OPEN_AS_SUBSCRIPTION, openOptionsForGet); logger("successfully opened " + topicString); testLoop(inTopic); } catch (MQException mqex) { logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); } catch (System.IO.IOException ioex) { logger("ioex=" + ioex); } finally { try { if (inTopic != null) inTopic.Close(); logger("closed: " + topicString); } catch (MQException mqex) { logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); } try { if (qMgr != null) qMgr.Disconnect(); logger("disconnected from " + qManager); } catch (MQException mqex) { logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); } } } private void testLoop(MQTopic inTopic) { bool flag = true; MQGetMessageOptions gmo = new MQGetMessageOptions(); gmo.Options |= MQC.MQGMO_NO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING; MQMessage msg = null; while (flag) { try { msg = new MQMessage(); inTopic.Get(msg, gmo); if (msg.Feedback == MQC.MQFB_QUIT) { flag = false; logger("received quit message - exiting loop"); } else logger("Message Data: " + msg.ReadString(msg.MessageLength)); } catch (MQException mqex) { logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode); if (mqex.Reason == MQC.MQRC_NO_MSG_AVAILABLE) { // no meesage - life is good - loop again logger("sleeping"); Thread.Sleep(60*1000); // sleep for 60 seconds } else { flag = false; // severe error - time to exit } } catch (System.IO.IOException ioex) { logger("ioex=" + ioex); } } } private void logger(String data) { DateTime myDateTime = DateTime.Now; System.Console.Out.WriteLine(myDateTime.ToString("yyyy/MM/dd HH:mm:ss.fff") + " " + this.GetType().Name + ": " + data); } /// <summary> main line</summary> /// <param name="args"> /// </param> // [STAThread] public static void Main(System.String[] args) { MQTest82 write = new MQTest82(); try { write.init(args); write.testReceive(); } catch (System.ArgumentException e) { System.Console.Out.WriteLine("Usage: MQTest82 -h host -p port -c channel -m QueueManagerName -t topicString [-u userID] [-x passwd]"); System.Environment.Exit(1); } catch (MQException e) { System.Console.Out.WriteLine(e); System.Environment.Exit(1); } System.Environment.Exit(0); } } }
Regards,
Roger Lacroix
Capitalware Inc.