IBM has just released Fix Pack 9.2.0.4 for IBM MQ V9.2 LTS:
https://www.ibm.com/support/pages/node/6514427
Regards,
Roger Lacroix
Capitalware Inc.
IBM has just released Fix Pack 9.2.0.4 for IBM MQ V9.2 LTS:
https://www.ibm.com/support/pages/node/6514427
Regards,
Roger Lacroix
Capitalware Inc.
I love that line from Monty Python which is from the film of the same name.
Last week, someone emailed me about running MQ Visual Edit on Microsoft Surface Pro X. For those who don’t know, the Surface Pro X comes with a Microsoft SQ1 or SQ2 ARM processor. Yes, ARM CPU and not an Intel CPU.

After some internet searches and a bunch of reading, I discovered that besides Microsoft, there are other manufacturers making laptops with Windows on ARM.
I noticed that Best Buy was having a sale (25% off) on Samsung Galaxy Book Go. So, I bought one. Always like a good deal. 🙂
Here’s screen-shots (click on the image to see a larger picture):
![]() |
![]() |
![]() |
![]() |
Windows 10 on ARM will run native applications very well and will provide emulation for 32-bit Intel x86 applications. It does not provide support for 64-bit Intel x64 applications. Note: Microsoft says that Windows 11 on ARM will add support for emulation of 64-bit Intel x64 applications.
I’m not a big fan of emulation but I did run several 32-bit x86 applications on my new Samsung laptop and everything worked.
Here’s a screenshot of a 32-bit x86 release of MQ Visual Edit running on Windows on ARM (running in emulation):

I installed the Microsoft build of OpenJDK for Windows 10 ARM64 and ran some test Java applications and everything worked fine. Next, I ran MQ Visual Edit in the OpenJDK for Windows 10 ARM64. And here’s a screenshot:

So, I’m going to continue testing (aka playing around with my new laptop) and see what interesting things I can discover.
Therefore, for those customers that want to run MQ Visual Edit, MQ Visual Browse, MQ Batch Toolkit and/or MQTT Message Editing Suite on Windows on ARM then let me know and I will provide you with either:
To go one step further, maybe IBM would like to join the party and provide a native release of IBM MQ for Windows on ARM. 🙂 IBM has already released developer versions of IBM MQ for macOS (client only) and Raspberry Pi (client & server), so why not provide a developer release for Windows on ARM!
The future: Microsoft has taken a lot of flack over Windows on ARM, especially that first generation called Microsoft Surface RT which had a special build of Windows for it. Now this time around, Microsoft has learned its lesson and now provides the regular release of Windows 10 for ARM. It could be that since Apple has been successfully migrating from Intel CPUs to Apple ARM CPUs for their hardware, Microsoft probably figures it is time to get their shit together before they loose out on that market too.
Its definitely interesting times. 🙂
Regards,
Roger Lacroix
Capitalware Inc.
Capitalware Inc. would like to announce the official release of MQ Visual Edit v3.2.0. This is a FREE upgrade for ALL licensed users of MQ Visual Edit V2/V3. MQ Visual Edit allows users to view, manipulate and manage messages in a queue and/or topic of an IBM MQ queue manager and presents the data in a simplified format similar to a database utility or spreadsheet program.

For more information about MQ Visual Edit go to:
https://www.capitalware.com/mqve_overview.html
Regards,
Roger Lacroix
Capitalware Inc.
Capitalware Inc. would like to announce the official release of MQ Visual Browse v3.2.0. This is a FREE upgrade for ALL licensed users of MQ Visual Browse V2/V3. MQ Visual Browse allows users to view messages in a queue and/or topic of an IBM MQ queue manager and presents the data in a simplified format similar to a database utility or spreadsheet program.
For more information about MQ Visual Browse go to:
https://www.capitalware.com/mqvb_overview.html

Regards,
Roger Lacroix
Capitalware Inc.
Capitalware Inc. would like to announce the official release of MQ Batch Toolkit v3.2.2. 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.
MQ Batch Toolkit can run on the following platforms: Linux x86 64-bit, macOS (Mac OS X), Windows 7/8/8.1/10 and Raspberry Pi (ARM).
For more information about MQ Batch Toolkit go to:
https://www.capitalware.com/mqbt_overview.html
Regards,
Roger Lacroix
Capitalware Inc.
Capitalware Inc. would like to announce the official release of MQTT Message Editing Suite V1.1.0.
MQTT Message Editing Suite (MMES) application allows users to subscribe, publish, edit, copy, delete, forward, backup, restore, import and export messages of a topic of an MQTT Broker.
The messages of a topic are presented in a table format similar to a spreadsheet program. MMES is an MQTT (MQ Telemetry Transport) client that connects to an MQTT Broker. MQTT is a machine-to-machine (M2M)/Internet of Things (IoT) connectivity protocol.
MMES supports MQTT protocol versions 3.1, 3.1.1 and 5.0.
MMES is a great tool for IoT (Internet of Things) application programmers, developers, quality assurance testers, and production support personnel. The tool allows for quick problem solving because the data is presented in a very logical and insightful manner.
MMES is able to connect to any remote MQTT Broker. The remote MQTT Broker can be on any platform. The following is a sample of the MQTT Brokers that MMES can connect to: 2lemetry, Apache ActiveMQ, Apache Apollo, EMQ, GnatMQ, HBMQTT, HiveMQ, IBM MessageSight, IBM MQ, JoramMQ, Moquette, Mosquitto, MQTT.js, RabbitMQ, RSMB, Software AG Universal Messaging, Solace, ThingMQ and VerneMQ.
MMES has full language support for the following 55 languages: Amharic, Arabic, Azerbaijani, Bengali, Cebuano, Chinese (Mandarin China), Chinese (Mandarin Taiwan), Czech, Danish, Dutch, English, Finnish, French, German, Greek, Gujarati, Hausa, Hebrew, Hindi, Hungarian, Igbo, Indonesian, Italian, Japanese, Javanese, Kannada, Korean, Malay, Malayalam, Marathi, Norwegian, Panjabi, Pashto, Persian, Polish, Portuguese, Romanian, Russian, Shona, Sindhi, Spanish, Sundanese, Swahili, Swedish, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Uzbek, Vietnamese, Xhosa, Yoruba and Zulu.
MMES is designed to run on a desktop platform that supports Java SE 8 (or higher). This includes: Linux x86, macOS (Mac OS X), Windows 7/8/8.1/10 and Raspberry Pi (ARM)..

Here’s screen-shots (click on the image to see a larger picture):
Message Edit![]() |
XML Viewer![]() |
JSON Viewer![]() |
Fixed Width Viewer![]() |
CSV Viewer![]() |
FIX Viewer![]() |
HEX Viewer![]() |
Visual Message Data![]() |
Message Moving Average![]() |
Ping Broker![]() |
Broker Status Monitor![]() |
For more information about MQTT Message Editing Suite, please go to:
https://www.capitalware.com/mmes_overview.html
Regards,
Roger Lacroix
Capitalware Inc.
Yup, as the subject line says, Oracle has flip flopped on how Oracle is licensing Java for commercial use.
This FAQ pertains to Oracle Java SE releases starting April 16, 2019 and has been updated to reflect the new Oracle No-Fee Terms and Conditions License available for Oracle Java 17 and later starting September 14, 2021.
Oracle JDK 17 and later is available under the Oracle No-Fee Terms and Conditions License which permits free use for all users.
Clearly, back in 2018, someone at Oracle thought they could make a boat load of cash off Java users. All it did was back fire on Oracle and make companies hate Oracle more than they already did.
Why would anyone care about Oracle and their JDK/JRE releases when many companies have stepped up and offered free licenses for JDK/JRE releases?
So, it took 30 months for Oracle to realize that they had screwed up. It was probably when customers starting leaving Oracle and it hit them in the pocket book!!! Since, we all know that Oracle is a greedy money-grubbing company!
I’m particularly pissed off because when Oracle made the licensing switch back in April of 2019, they caused Excelsior to close and sell their business to Huawei. Excelsior was put in a no-win situation regarding the collection of licensing fees. Excelsior Jet is a great tool for compiling and linking Java code into native binary executables. The current/last release of Excelsior Jet can compile Java 8 code, so I will continue to use it and sometime in the future, I’ll switch to GraalVM.
Regards,
Roger Lacroix
Capitalware Inc.
IBM has just released Fix Pack 9.0.0.12 for IBM MQ V9.0 LTS
https://www.ibm.com/support/pages/downloading-ibm-mq-90012
Regards,
Roger Lacroix
Capitalware Inc.
A couple of years ago, I posted a blog item called: C# .NET MQ Code to Subscribe to a Topic about subscribing to a topic using C# .NET code. I just realized that I never posted a C# .NET sample code to publish to a topic. So, here go – enjoy.
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
/// MQTest81
///
/// Description
/// This C# class will connect to a remote queue manager
/// and publish a message to 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 MQTest81
{
public class MQTest81
{
private Hashtable inParms = null;
private Hashtable qMgrProp = null;
private System.String qManager;
private System.String topicString;
/*
* The constructor
*/
public MQTest81()
: 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, publish a message, close topic and disconnect. </summary>
///
private void testPublish()
{
MQQueueManager qMgr = null;
MQTopic publisher = null;
int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
MQPutMessageOptions pmo = new MQPutMessageOptions();
System.String line = "This is a test message embedded in the MQTest81 program.";
try
{
qMgr = new MQQueueManager(qManager, qMgrProp);
logger("Successfully connected to " + qManager);
publisher = qMgr.AccessTopic(topicString, null, MQC.MQTOPIC_OPEN_AS_PUBLICATION, openOptions);
logger("Successfully opened " + topicString);
// Define a simple MQ message, and write some text
MQMessage sendmsg = new MQMessage();
sendmsg.Format = MQC.MQFMT_STRING;
sendmsg.MessageType = MQC.MQMT_DATAGRAM;
sendmsg.MessageId = MQC.MQMI_NONE;
sendmsg.CorrelationId = MQC.MQCI_NONE;
// .NET defaults to 1200 which is Windows double byte
// So, use 819 to get single byte character set.
sendmsg.CharacterSet = 819;
sendmsg.WriteString(line);
// put the message on the outQ
publisher.Put(sendmsg, pmo);
logger("Message Data:> " + line);
}
catch (MQException mqex)
{
logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
}
catch (System.IO.IOException ioex)
{
logger("Error: ioex=" + ioex);
}
finally
{
try
{
if (publisher != null)
{
publisher.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 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)
{
MQTest81 write = new MQTest81();
try
{
write.init(args);
write.testPublish();
}
catch (System.ArgumentException e)
{
System.Console.Out.WriteLine("Usage: MQTest81 -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.
The other day, a colleague emailed me asking if I had a sample C# .Net/MQ program that adds message properties to a message. So. I thought I would post it for everyone to use.
You can download the source code from here.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using IBM.WMQ;
/// <summary> Program Name
/// MQTest01P
///
/// Description
/// This C# class will connect to a remote queue manager
/// and put a message to a queue with a message property using a managed .NET environment.
///
/// Sample Command Line Parameters
/// -h 127.0.0.1 -p 1414 -c TEST.CHL -m MQA1 -q TEST.Q1 -u tester -x mypwd
/// </summary>
/// <author> Roger Lacroix
/// </author>
namespace MQTest01P
{
class MQTest01P
{
private Hashtable inParms = null;
private Hashtable qMgrProp = null;
private System.String qManager;
private System.String outputQName;
/*
* The constructor
*/
public MQTest01P()
: 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("-q");
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 = Hashtable.Synchronized(new Hashtable());
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"]);
outputQName = ((System.String)inParms["-q"]);
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("MQ Parms:");
logger(" QMgrName ='" + qManager + "'");
logger(" Output QName ='" + outputQName+"'");
logger("Connection values:");
foreach (DictionaryEntry de in qMgrProp)
{
logger(" " + de.Key + " = '" + de.Value + "'");
}
}
else
{
throw new System.ArgumentException();
}
}
/// <summary> Connect, open queue, write a message, close queue and disconnect.
///
/// </summary>
/// <throws> MQException </throws>
private void testSend()
{
MQQueueManager qMgr = null;
MQQueue outQ = null;
System.String line = "This is a test message embedded in the MQTest01P program.";
int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING;
MQPutMessageOptions pmo = new MQPutMessageOptions();
try
{
qMgr = new MQQueueManager(qManager, qMgrProp);
logger("successfully connected to " + qManager);
outQ = qMgr.AccessQueue(outputQName, openOptions);
logger("successfully opened " + outputQName);
// Define a simple MQ message, and write some text in UTF format..
MQMessage sendmsg = new MQMessage();
sendmsg.Format = MQC.MQFMT_STRING;
sendmsg.MessageType = MQC.MQMT_DATAGRAM;
sendmsg.MessageId = MQC.MQMI_NONE;
sendmsg.CorrelationId = MQC.MQCI_NONE;
// .NET defaults to 1200 which is Windows double byte
// So, use 819 to get single byte character set.
sendmsg.CharacterSet = 819;
// Add string property with key of "ABC" and value of "test1"
sendmsg.SetStringProperty("ABC", "test1");
sendmsg.WriteString(line);
// put the message on the outQ
outQ.Put(sendmsg, pmo);
logger("Message Data:> " + line);
}
catch (MQException mqex)
{
logger("CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
}
catch (System.IO.IOException ioex)
{
logger("ioex=" + ioex);
}
finally
{
try
{
if (outQ != null)
{
outQ.Close();
logger("closed: " + outputQName);
}
}
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 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)
{
MQTest01P mqt = new MQTest01P();
try
{
mqt.init(args);
mqt.testSend();
}
catch (System.ArgumentException e)
{
System.Console.Out.WriteLine("Usage: MQTest01P -h host -p port -c channel -m QueueManagerName -q QueueName [-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.