I am new to Websphere MQ (IBM z/OS) technologies. We had a requirement to implement a standalone application that uses JMS technology to connect to an MQ server (on IBM z/OS. This is maintained by a different organization for which we have only limited access) and put a message on the queue.
Here are pieces of my code below.
private void sendMessage(String queue, String msg) {
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, host);
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManagerName);
cf.setStringProperty(WMQConstants.USERID, user);
cf.setStringProperty(WMQConstants.PASSWORD, password);
Connection connection = null;
Session session = null;
Destination destination = null;
MessageProducer producer = null;
connection = cf.createConnection(user, password);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue(queue);
//((MQDestination)destination).setCCSID(37);
producer = session.createProducer(destination);
TextMessage message = session.createTextMessage();
message.setIntProperty(WMQConstants.JMS_IBM_CHARACTER_SET, 37);
//message.setIntProperty(WMQConstants.JMS_IBM_ENCODING, 785);
message.setText(msg);
// Start the connection
connection.start();
// And, send the message
producer.send(message);
}
I was successfully able to connect to the MQ server on the other end and put the messages on the remote server in ASCII format. I was able to consume the message that I have put on the queue from an AIX server.
But since the MQ is running on z/OS and the consumer is also an Mainframe application the message I put appears to be a garbage/unreadable format. After some research I figured out that messages needs to be converted to EBCDIC to be put on z/OS MQ. I expected that this will be taken care of by the IBM MQ libraries.
Please help on how can I put the messages in EBCDIC format.
More importantly, if your receiver is not a Java client, you need to disable the JMS header as follows:
destination = session.createQueue("queue:///" + queue + "?targetClient=1")
or by invoking the Native MQ implementation :
((MQDestination)destination).setMessageBodyStyle(WMQConstants.WMQ_MESSAGE_BODY_MQ)
See:
https://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q032120_.htm
https://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q032140_.htm?lang=en
http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.0.1/com.ibm.mq.csqzaw.doc/jm10910_.htm