mq pub/sub: jms api and traces …...ibm software group n o t e s how to distinguish a source file...
TRANSCRIPT
![Page 1: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/1.jpg)
IBM Software Group
®
MQ Pub/Sub: JMS API and traceshttp://www-01.ibm.com/support/docview.wss?uid=swg27050204
Angel Rivera ([email protected])IBM MQ Distributed Level 2 SupportDate last updated: 20-Sep-2017Link to index: https://developer.ibm.com/answers/questions/402074/mq-pubsub-training-presentations.html
1
![Page 2: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/2.jpg)
IBM Software Group
Related presentations
This presentation is one of a series.
For the complete list, please see:
https://developer.ibm.com/answers/questions/40207
4/mq-pubsub-training-presentations.html
MQ Pub/Sub: training presentations
22
![Page 3: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/3.jpg)
IBM Software Group
Related zip file
This techdoc has 1 zip file with files that are
discussed in this presentation:
QMPS-trace-pub-sub-JMS.zip
The included files are:
Unix: runmqjms and set-mq-903
Windows: runmqjms.bat and set-mq-903.bat
JMS trace: mqjms_*.trc
Configuration: myjms.config
33
![Page 4: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/4.jpg)
IBM Software Group
Agenda
▪This presentation examines the JMS API from the
following MQ samples:
JmsProducer => publish a message
JmsConsumer => non-durable subscriber
▪Traces were obtained from running the samples
and are explained.
▪Introduction to JNDI
▪MQ Samples that use JNDI
JmsJndiProducer => publish a message
JmsJndiConsumer => non-durable subscriber
44
![Page 5: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/5.jpg)
IBM Software Group
What is JMS
JMS stands for:
Java Messaging Service
It is an extension of Java specifically designed to
interact with messaging systems.
It supports both:
Point-to-Point => using queues
Publish/Subscriber => using topic strings
55
![Page 6: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/6.jpg)
IBM Software Group
MQ and JMS
MQ ships both:
- MQ Classes for Java (deprecated in MQ 9.0), and
- MQ Classes for JMS (recommended!)
Note:http://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.pro.doc/q127140_.htm
MQ 9: Deprecated, stabilized and removed featuresA number of features are deprecated, stabilized or removed
from IBM® MQ Version 9.0…
Stabilization of IBM MQ classes for Java ==> In MQ 9.0 the
"MQ classes for Java" are now deprecated and the
recommended interface is the "MQ classes for JMS".
66
![Page 7: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/7.jpg)
IBM Software Group
notes
How to distinguish a source file that uses “MQ Classes for Java” and another
that uses “MQ Classes for JMS”
- The file extension is the same: .java
Both “MQ Classes” use “.java” as the extension, thus, this cannot be used to
distinguish them.
- The MQ Classes for Java use methods that begin with “MQ”, such as:
import com.ibm.mq.MQDestination;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueueManager;
- The MQ Classes for JMS use methods that include “jms”:
import javax.jms.Connection;
import javax.jms.Destination;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
Notes: How to distinguish Java and JMS
77
![Page 8: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/8.jpg)
IBM Software Group
MQ JMS samples
This presentation uses JMS samples shipped with
MQ:
Windows:
C:\Program Files\IBM\MQ\Tools\jms\samples
Unix/Linux:
/opt/mqm/samp/jms/samples
Note: There is a separate fileset for the samples.
Example for Linux: MQSeriesSamples*.rpm
88
![Page 9: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/9.jpg)
IBM Software Group
notes
OK! Let’s run a sample!
LINUX: rivera@mosquito: /opt/mqm/samp/jms/samples
$ java JmsProducer -m QMPS -d Q1 -h localhost -p 1424
Exception in thread "main" java.lang.NoClassDefFoundError: javax.jms.JMSException
at java.lang.J9VMInternals.verifyImpl(Native Method)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:499)
Caused by: java.lang.ClassNotFoundException: javax.jms.JMSException
at java.net.URLClassLoader.findClass(URLClassLoader.java:600)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:777)
... 6 more
Windows: C:\Program Files\IBM\MQ_2\Tools\jms\samples>
Error: Could not find or load main class JmsProducer
Both tests failed! WHAT HAPPENED!!!
Notes: Failed attempt to run a sample
99
![Page 10: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/10.jpg)
IBM Software Group
Must setup MQ environment variables
To run any MQ client application, including the JMS
samples, which are standalone applications (that is
not within an application server), it is necessary to
setup the MQ environment variables by execution
the command:
setmqenv -n Installation1
1010
![Page 11: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/11.jpg)
IBM Software Group
notes
Unix/Linux: You need to "source" (run "inline") the utility setmqenv by
specifying a leading . (dot) and a blank:
. /opt/mqm/bin/setmqenv -n Installation1
| |
| +--- blank
+--- dot
Notes:
- The . (dot) character used at the beginning of each command makes the
setmqenv script run in the current shell. Therefore, the environment changes
made by the setmqenv script are applied to the current shell.
Without the . character, the environment variables are changed in another
shell, and the changes are not applied to the shell from which the command is
issued.
- This does NOT apply to Windows.
Notes: setmqenv in Unix/Linux
1111
![Page 12: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/12.jpg)
IBM Software Group
notes
Unix/Linux: You can create a script that will run the setmqenv command.
For example, $HOME/bin/set-mq-903 can be created with the contents.
Note: “export PATH” is one single long line!#============ begin script (do not include this line in the script)
# Name: set-mq-903
# Purpose: to set up the environment to run MQ 9.0.3
. /opt/mqm/bin/setmqenv -n Installation1
# Additional MQ directories for the PATH
export
PATH=$PATH:$MQ_INSTALLATION_PATH/java/bin:$MQ_INSTALLATION_PATH/samp/bin:
$MQ_INSTALLATION_PATH/samp/jms/samples:
# Add local directory for running Java/JMS programs
export CLASSPATH=$CLASSPATH:.
# Display the fix pack level
dspmqver -f 2
# end
#============ end of script (do not include this line in the script)
To run the script, you can add to your .profile or .bashrc file. Include the dot and space!!
. $HOME/bin/set-mq-903
Notes: Unix/Linux shell script for setmqenv
1212
![Page 13: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/13.jpg)
IBM Software Group
notes
Windows: You can create a batch file that will run the setmqenv command.
For example, set-mq-903.bat can be created with the contents in a directory that is in
your PATH.
Note: “SET PATH” is one single long line!#============ begin script (do not include this line in the script)
REM Setup the environment to run MQ 9.0.3
CALL "C:\Program Files\IBM\MQ\bin\setmqenv" -n Installation1
REM Adding Samples to the path
SET PATH=%PATH%;%MQ_FILE_PATH%\Tools\c\Samples\Bin;%MQ_FILE_PATH%\Tools\c\
Samples\Bin64;%MQ_FILE_PATH%\Tools\jms\samples;%MQ_JAVA_INSTALL_PATH%\bin\
REM Add local directory for running Java/JMS programs
SET CLASSPATH=%CLASSPATH%;.
REM Display the fix pack level
dspmqver -f 2
#============ end of script (do not include this line in the script)
To run the batch file:
C:\> set-mq-903
Notes: Windows batch file for setmqenv
1313
![Page 14: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/14.jpg)
IBM Software Group
notes
What do you get from setmqenv and from the sample shell script / batch file?
- Updates to CLASSPATH, PATH, MANPATH (for ‘man’ manual pages)
- Environment variables for MQ
$ set | grep -i mqCLASSPATH=/opt/mqm/java/lib/com.ibm.mq.jar:/opt/mqm/java/lib/com.ibm.mqjms.jar:/opt/mqm/java/lib/com.ibm.mq.al
lclient.jar:/opt/mqm/samp/wmqjava/samples:/opt/mqm/samp/jms/samples:.
MANPATH=/opt/mqm/man:/usr/local/man:/usr/share/man
MQ_DATA_PATH=/var/mqm
MQ_ENV_MODE=64
MQ_INSTALLATION_NAME=Installation1
MQ_INSTALLATION_PATH=/opt/mqm
MQ_JAVA_DATA_PATH=/var/mqm
MQ_JAVA_INSTALL_PATH=/opt/mqm/java
MQ_JAVA_LIB_PATH=/opt/mqm/java/lib64
MQ_JRE_PATH=/opt/mqm/java/jre64/jre
MQ_RETVAL=0PATH=/opt/mqm/bin:/home/rivera/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/local/bin:/home/rivera/bin:
.:/sbin:/opt/mqm/java/bin:/opt/mqm/samp/bin:/opt/mqm/samp/jms/samples:
Notes: setmqenv
1414
![Page 15: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/15.jpg)
IBM Software Group
Invoking an MQ JMS application
The proper invocation of an MQ JMS application
(such as JmsProducer) uses the format:
java -Djava.library.path=$MQ_JAVA_LIB_PATH JmsProducer
You can create ‘wrapper’ scripts to make it easier.
These scripts could be used for taking traces
(to be discussed later on)
1515
![Page 16: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/16.jpg)
IBM Software Group
notes
Windows: You can create a batch file (runmqjms.bat) that will run the MQ application
using the desired setup (such as, no tracing, tracing using jms.config file, tracing using
arguments). For example, the file can be created with the contents in a directory that is
in your PATH. Note: Each line that has “java” is one single long line!#============ begin script (do not include this line in the script)
@echo off
rem Not using jms.config, nor properties
java -Djava.library.path="%MQ_JAVA_LIB_PATH%" %*
rem Using jms.config file
rem java -Djava.library.path="%MQ_JAVA_LIB_PATH%" -
Dcom.ibm.msg.client.config.location=file:/C:/w32tools/myjms.config %*
rem Using Java arguments for the command line (trace file in local
directory, name: mqjms_%PID%.trc)
rem java -Djava.library.path="%MQ_JAVA_LIB_PATH%"
-Dcom.ibm.msg.client.commonservices.trace.status=ON %*
#============ end of script (do not include this line in the script)
To run the batch file:
runmqjms JmsProducer -m QMPS -d Q1 -h localhost -p 1424
Notes: Windows batch file for runmqjms
1616
![Page 17: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/17.jpg)
IBM Software Group
notes
Unix/Linux: You can create a shell script (runmqjms) that will run the MQ application
using the desired setup (such as, no tracing, tracing using jms.config file, tracing using
arguments)
For example, the file can be created with the contents in a directory that is in your PATH.
Note: Each line that has “java” is one single long line!#============ begin script (do not include this line in the script)
# Name: runmqjms
## Not using jms.config, nor properties
java -Djava.library.path=$MQ_JAVA_LIB_PATH $*
## Using jms.config file
# java -Djava.library.path=$MQ_JAVA_LIB_PATH -
Dcom.ibm.msg.client.config.location=file:/var/mqm/myjms.config $*
## Using Java arguments for the command line (trace file in local
directory, name: mqjms_%PID%.trc)
# java -Djava.library.path=$MQ_JAVA_LIB_PATH
-Dcom.ibm.msg.client.commonservices.trace.status=ON $*
#============ end of script (do not include this line in the script)
To run the shell script:
runmqjms JmsProducer -m QMPS -d Q1 -h localhost -p 1424
Notes: Unix script for runmqjms
1717
![Page 18: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/18.jpg)
IBM Software Group
notes
Unix/Linux: We are ready!
Even though this presentation is regarding Pub/Sub, I would like to show the addition of
a “header” in messages handled by JMS, and it is more conveniently explained when
using queues.
Let’s have 2 messages, one by C application and another by JMS application.
Message 1) Let’s run the C application:
$ amqsput Q1 QMPS
Sample AMQSPUT0 start
target queue is Q1
TEST-1
Sample AMQSPUT0 end
Message 2) Now let’s run the JMS sample.
Notice that the argument -d Q1 refers to the “destination Queue Q1”
$ runmqjms JmsProducer -m QMPS -d Q1 -h localhost -p 1424
Notes: Running JmsProducer on a queue
1818
![Page 19: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/19.jpg)
IBM Software Group
notes
Step 2) Now let’s run the JMS sample:
$ runmqjms JmsProducer -m QMPS -d Q1 -h localhost -p 1424Enter some text to be sent in a message <ENTER to finish>:TEST-2
Sent message:
JMSMessage class: jms_text
JMSType: null
JMSDeliveryMode: 2
JMSDeliveryDelay: 0
JMSDeliveryTime: 1504524325857
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: ID:414d5120514d5053202020202020202089319c596c5a0520
JMSTimestamp: 1504524325857
JMSCorrelationID: null
JMSDestination: queue:///Q1
JMSReplyTo: null
JMSRedelivered: false
JMSXAppID: JmsProducer
JMSXDeliveryCount: 0
JMSXUserID: mqm
JMS_IBM_PutApplType: 28
JMS_IBM_PutDate: 20170904
JMS_IBM_PutTime: 11252586
TEST-2
Enter some text to be sent in a message <ENTER to finish>:
SUCCESS
Notes: Running JmsProducer
1919
![Page 20: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/20.jpg)
IBM Software Group
notes
At this point, the queue Q1 has 2 messages:
1: One created from the C-based “amqsput”
2: Another created from the JMS-based “JmsProducer”
Let’s take a look at the 1st message (C-based) by using the C-based sample “amqsbcg”
which browses the messages in a non-destructive fashion.
****Message descriptor****
StrucId : 'MD ' Version : 2
Report : 0 MsgType : 8
Expiry : -1 Feedback : 0
Encoding : 546 CodedCharSetId : 1208
Format : 'MQSTR '
Priority : 0 Persistence : 0
MsgId : X'414D5120514D5053202020202020202089319C596D590520'
CorrelId : X'000000000000000000000000000000000000000000000000'
…
**** Message ****
length - 6 of 6 bytes
00000000: 5445 5354 2D31 'TEST-1 '
Notes: Looking at the messages
2020
![Page 21: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/21.jpg)
IBM Software Group
notes
Let’s take a look at the 2nd message.
Notice the addition of a “header”, called RFH2, which indicates that it is a JMS message.****Message descriptor****
StrucId : 'MD ' Version : 2
Report : 0 MsgType : 8
Expiry : -1 Feedback : 0
Encoding : 273 CodedCharSetId : 1208
Format : 'MQHRF2 '
Priority : 4 Persistence : 1
MsgId : X'414D5120514D5053202020202020202089319C596C5A0520'
CorrelId : X'000000000000000000000000000000000000000000000000'
**** Message ****
length - 154 of 154 bytes
#### RFH2 header – begin ###
00000000: 5246 4820 0000 0002 0000 0094 0000 0111 'RFH ............'
00000010: 0000 04B8 4D51 5354 5220 2020 0000 0000 '....MQSTR ....'
00000020: 0000 04B8 0000 0020 3C6D 6364 3E3C 4D73 '....... <mcd><Ms'
00000030: 643E 6A6D 735F 7465 7874 3C2F 4D73 643E 'd>jms_text</Msd>'
00000040: 3C2F 6D63 643E 2020 0000 0048 3C6A 6D73 '</mcd> ...H<jms'
00000050: 3E3C 4473 743E 7175 6575 653A 2F2F 2F51 '><Dst>queue:///Q'
00000060: 313C 2F44 7374 3E3C 546D 733E 3135 3034 '1</Dst><Tms>1504'
00000070: 3532 3433 3235 3835 373C 2F54 6D73 3E3C '524325857</Tms><'
00000080: 446C 763E 323C 2F44 6C76 3E3C 2F6A 6D73 'Dlv>2</Dlv></jms‘
#### RFH2 header – end ###
00000090: 3E20 2020 5445 5354 2D32 '> TEST-2 '
Notes: Looking at the messages
2121
![Page 22: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/22.jpg)
IBM Software Group
notes
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q031990_.htm
Mapping JMS messages onto IBM MQ messages
MQ messages are composed of a Message Descriptor, an optional MQRFH2 header,
and a body.
The contents of a JMS message are partly mapped and partly copied to an MQ
message. Figure 1 shows how the structure of a JMS message is transformed to an
IBM MQ message and back again
NOTE: This presentation will not talk more about the complex subject of RFH2.
Notes: RFH2 Header
2222
![Page 23: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/23.jpg)
IBM Software Group
notes
Let’s take a look at the source code for JMSProducer.java
It produces a message to a destination.
The destination can be a Queue or a Topic String
* Usage:
* JmsProducer -m queueManagerName -d destinationName [-h host -p
port -l channel] [-u user -w passWord]
* JmsProducer -m QM1 -d Q1
* JmsProducer -m QM1 -d topic://foo -h localhost -p 1414
-u tester -w testpw
A Connection Factory (CF) contains the information on how to contact
the queue manager: hostname, port, server-connection channel
// Create a connection factory
JmsFactoryFactory ff =
JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
Notes: JMSProducer source code
2323
![Page 24: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/24.jpg)
IBM Software Group
notes
The connection to the queue manager is made.
A session is created.
Within a session, the destination reference is created and the producer is “opened”.
// Create JMS objects
connection = cf.createConnection();
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
if (isTopic) {
destination = session.createTopic(destinationName);
}
else {
destination = session.createQueue(destinationName);
}
producer = session.createProducer(destination);
// Start the connection
connection.start();
Notes: JMSProducer source code
2424
![Page 25: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/25.jpg)
IBM Software Group
notes
The text for the messages is read from the command line and sent.
// do {
System.out.print("Enter some text to be sent in a message
<ENTER to finish>:");
… TextMessage message = session.createTextMessage(line);
// And, send the message
producer.send(message);
System.out.println("Sent message:\n" + message);
}
while (line != null);
Close the producer, the session and the connection.
...
producer.close();
...
session.close();
...
connection.close();
Notes: JMSProducer source code
2525
![Page 26: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/26.jpg)
IBM Software Group
notes
The JMSConsumer.java source code is very similar to the one for JMSProducer.java.
The main differences are:
Instead of a “producer” (MQPUT) it is a “consumer” (MQGET):
consumer = session.createConsumer(destination);
Instead of “sending” a message to a destination, is “receiving”
// And, receive the message
Message message;
do {
message = consumer.receive(timeout);
if (message != null) {
System.out.println("Received message:\n" + message);
}
}
while (message != null);
Notes: JMSConsumer source code
2626
![Page 27: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/27.jpg)
IBM Software Group
Modifying runmqjms to capture traces
During the scenario described next,
the JMS traces will be gathered.
The runmqjms script can be modified to use the
main option for capturing the traces.
Comment out the original 1st option and uncomment
the 2nd option
## Not using jms.config, nor properties
# java -Djava.library.path=$MQ_JAVA_LIB_PATH $*
## Using jms.config file
java -Djava.library.path=$MQ_JAVA_LIB_PATH
-Dcom.ibm.msg.client.config.location=file:/var/mqm/myjms.config $*
2727
![Page 28: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/28.jpg)
IBM Software Group
Creating the JMS config file
You can use the existing sample config file as a
model:cd /var/mqm
cp $MQ_JAVA_INSTALL_PATH/bin/jms.config myjms.config
chmod 644 myjms.config
Uncomment the following and change value from OFF to ON
com.ibm.msg.client.commonservices.trace.status=ON
Uncomment the following and add “/var/mqm/trace”:
com.ibm.msg.client.commonservices.trace.outputName=
/var/mqm/trace/mqjms_%PID%.trc
2828
![Page 29: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/29.jpg)
IBM Software Group
Scenario using a topic destination
Open 2 command windows:
- One for JMSConsumer
- Another for the JMSProducer
From the window for the JMSConsumer enter:
runmqjms JmsConsumer -m QMPS -d topic://sales -h localhost -p 1424
From the window for the JMSProducer enter:
runmqjms JmsProducer -m QMPS -d topic://sales -h localhost -p 1424
Enter 1 message, such as TEST-JMS
Press enter to exit
From JMSConsumer notice the received message.
2929
![Page 30: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/30.jpg)
IBM Software Group
notes
mqm@mosquito: /home/mqm
$ runmqjms JmsProducer -m QMPS -d topic://sales -h localhost -p 1424
runmqjms: Begin
Enter some text to be sent in a message <ENTER to finish>:TEST-JMS
Sent message:
JMSMessage class: jms_text
JMSType: null
JMSDeliveryMode: 2
JMSDeliveryDelay: 0
JMSDeliveryTime: 1504534060420
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: ID:414d5120514d5053202020202020202089319c596a660520
JMSTimestamp: 1504534060420
JMSCorrelationID: null
JMSDestination: topic://sales
JMSReplyTo: null
JMSRedelivered: false
JMSXAppID: JmsProducer
JMSXDeliveryCount: 0
JMSXUserID: mqm
JMS_IBM_ConnectionID: 414D5143514D5053202020202020202089319C5969650520
JMS_IBM_PutApplType: 28
JMS_IBM_PutDate: 20170904
JMS_IBM_PutTime: 14074044
TEST-JMS
Enter some text to be sent in a message <ENTER to finish>:
SUCCESS
Notes: JMSProducer
3030
![Page 31: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/31.jpg)
IBM Software Group
notes
$ runmqjms JmsConsumer -m QMPS -d topic://sales -h localhost -p 1424
runmqjms: Begin
Received message:
JMSMessage class: jms_text
JMSType: null
JMSDeliveryMode: 2
JMSDeliveryDelay: 0
JMSDeliveryTime: 0
JMSExpiration: 0
JMSPriority: 4
JMSMessageID: ID:414d5120514d5053202020202020202089319c596b660520
JMSTimestamp: 1504534060420
JMSCorrelationID: ID:414d5120514d5053202020202020202089319c596c640520
JMSDestination: topic://sales
JMSReplyTo: null
JMSRedelivered: false
JMSXAppID: QMPS
JMSXDeliveryCount: 1
JMSXUserID: mqm
JMS_IBM_Character_Set: UTF-8
JMS_IBM_ConnectionID: 414D5143514D5053202020202020202089319C5969650520
JMS_IBM_Encoding: 273
JMS_IBM_Format: MQSTR
JMS_IBM_MsgType: 8
JMS_IBM_PutApplType: 26
JMS_IBM_PutDate: 20170904
JMS_IBM_PutTime: 14074044
TEST-JMS
No message received in 15 seconds!
SUCCESS
Notes: JMSConsumer
3131
![Page 32: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/32.jpg)
IBM Software Group
notes
Now let’s take a look at the traces that were generated:
$ cd /var/mqm/trace
$ ls *.trc
mqjms_18528.trc
mqjms_18558.trc
Some highlights are:
| java.version :- 1.7.0
| sun.java.command :- JmsConsumer -m QMPS -d topic://sales -h localhost -p 1424
[04/09/17 10:07:34.460.04] 0001 Version information
[04/09/17 10:07:34.460.04] 0001 IBM MQ classes for Java Message Service
[04/09/17 10:07:34.460.04] 0001 9.0.3.0
[04/09/17 10:07:35.481.02] 0001 @40430055 c.i.mq.jms.MQSession
{ createTopic(String) [topic://sales]
Notes: Traces
3232
![Page 33: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/33.jpg)
IBM Software Group
notes
* For the producer:
[04/09/17 10:07:40.377.00] 0001 @180deb0a c.i.mq.jms.MQSession
{ createTextMessage(String) [TEST-JMS]
…
[04/09/17 10:07:40.441.0Y] 0001 @83213d16 c.i.m.j.remote.impl.RemoteTCPConnection
----+----+----+--- d send(byte [ ],int,int,int,int) Sending data <data> java.nio.HeapByteBuffer[pos=0
lim=824 cap=32756]
…
[04/09/17 10:07:40.441.0Y] 0001 0x00000320 ( 800) : 4c49454e 545f4944 3e3c2f75 73723e20 :
LIENT_ID></usr>
[04/09/17 10:07:40.441.0Y] 0001 0x00000330 ( 816) : 54455354 2d4a4d53 : TEST-
JMS
* For the consumer:
[04/09/17 10:07:40.513.00] 0003 @6a730995 c.i.m.j.remote.impl.RemoteTCPConnection
----+---- d receive(byte [ ],int,int) Received data <data> java.nio.HeapByteBuffer[pos=0 lim=824
cap=32756]
…
[04/09/17 10:07:40.513.00] 0003 0x00000320 ( 800) : 3c2f546f 703e3c2f 6d717073 3e202020 :
</Top></mqps>
[04/09/17 10:07:40.513.00] 0003 0x00000330 ( 816) : 54455354 2d4a4d53 : TEST-
JMS
Notes: Traces
3333
![Page 34: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/34.jpg)
IBM Software Group
Modifying runmqjms to capture traces (2)
The runmqjms script can be modified to use the
other option for capturing the traces.
Comment out the original 1st and 2nd options and
uncomment the 3rd option.
The trace files will be in the current directory.## Not using jms.config, nor properties
# java -Djava.library.path=$MQ_JAVA_LIB_PATH $*
## Using jms.config file
# java -Djava.library.path=$MQ_JAVA_LIB_PATH -
Dcom.ibm.msg.client.config.location=file:/var/mqm/myjms.config $*
## Using Java arguments for the command line
## (trace file in local directory, name: mqjms_%PID%.trc)
java -Djava.library.path=$MQ_JAVA_LIB_PATH
-Dcom.ibm.msg.client.commonservices.trace.status=ON $*
3434
![Page 35: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/35.jpg)
IBM Software Group
Motivation for JNDI
The invocation for the sample JMSProducer needs
to include the hostname and port of the queue
manager and the destination, such as:runmqjms JmsProducer -m QMPS -d topic://sales -h localhost -p 1424
Imagine that you have 50 different scripts that use
the invocation above.
The queue manager is moved to host2 and port
1415.
It would be very cumbersome to modify all those 50
scripts in order to specify the new values!
3535
![Page 36: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/36.jpg)
IBM Software Group
Motivation for JNDI
Here is how the “JNDI” comes to the rescue!
If the JMS applications use JNDI, then the 50 scripts
that have the invocation for the JMS application will
NOT have to change!
Instead, there is only ONE change to make:
- The update of the JMS resource for the Connection
Factory in the JNDI.
3636
![Page 37: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/37.jpg)
IBM Software Group
What is JNDI
The Java Naming and Directory Interface (JNDI)
is a Java API for a directory service that allows Java
software clients to discover and look up data and
objects via a name.
In JMS, JNDI is used mostly as a naming service to
locate administered objects which are created and
configured by the system administrator.
Administered objects include:
- Connection Factory and
- Destination objects like topics and queues.
3737
![Page 38: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/38.jpg)
IBM Software Group
notes
1) Let’s assume that the JNDI has the following administrative objects (showing only few attributes)
Connection Factory : Name (CF-QMPS)
CHANNEL(ANGEL.SVRCONN)
CONNECTIONNAMELIST(mosquito.raleigh.ibm.com(1424))
HOSTNAME(mosquito.raleigh.ibm.com)
PORT(1424)
QMANAGER(QMPS)
TRANSPORT(CLIENT)
Topic : Name (T-SALES)
TOPIC(sales)
CCSID(1208)
EXPIRY(APP)
PERSISTENCE(APP)
2) A JMS application can refer to Connection Factory CF-QMPS and Destination T-SALES in the
above JNDI.
In which case the following effective values will be used.
Queue Manager QMPS is located at mosquito.raleigh.ibm.com(1424)
The topic string to use is: sales
Notes: JMS app using JNDI
3838
![Page 39: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/39.jpg)
IBM Software Group
notes
3) Let’s assume that the queue manager QMPS is moved to another host (venus) and port
(1435)
The JNDI administrative object for Connection Factory CF-QMPS is modified and it looks now like
this:
Connection Factory : Name (CF-QMPS)
CHANNEL(ANGEL.SVRCONN)
CONNECTIONNAMELIST(venus.denver.ibm.com(1435))
HOSTNAME(venus.denver.ibm.com)
PORT(1435)
QMANAGER(QMPS)
TRANSPORT(CLIENT)
4) The JMS application keeps referring to Connection Factory CF-QMPS and Destination T-SALES in
the above JNDI.
No change at the application level! The JMS application is INSULATED from administrative changes.
5) The JNDI will return to the JMS application the new values:
Queue Manager QMPS is located at venus.denver.ibm.com(1435)
The topic string to use is: sales
Notes: JMS app using JNDI
3939
![Page 40: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/40.jpg)
IBM Software Group
Types of JNDI
These are some types of JNDI implementations:
+ File System (an actual file called: .bindings)
MQ Explorer and MQ JMSAdmin tools use it.
This is the one used in this presentation
+ Application Server (WAS files: resources.xml)
+ LDAP (no further discussion in this presentation)
4040
![Page 41: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/41.jpg)
IBM Software Group
MQ Explorer and File System JNDI
The easiest way to create/edit a File System JNDI is
by using the MQ Explorer:
Scroll down to: JMS Administered Objects
Right click and select: Add Initial Context…
Note: “Initial Context” really means: the full path of
the directory where the file .bindings will be located
4141
![Page 42: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/42.jpg)
IBM Software Group
MQ Explorer and File System JNDI
The following File System JNDI is for Windows,
using the C: drive:
file:/C:/var/mqm/JNDI-Directory
4242
![Page 43: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/43.jpg)
IBM Software Group
MQ Explorer and File System JNDI
Because you can have multiple JNDIs, you will need
to select the desired one and “Connect” to it.
(even if there is only one!)
Then you can create Connection Factories and
Destinations:
4343
![Page 44: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/44.jpg)
IBM Software Group
notes
Let’s visit the directory specified for this JNDI:
C:\var\mqm\JNDI-Directory> dir
09/05/2017 07:54 AM 71,089 .bindings
Notice that the contents is plain text, but it is NOT organized in a way that is
friendly for manual editing!
#This file is used by the JNDI FSContext.
#Tue Sep 05 07:54:40 EDT 2017
CF-QMPR1/RefAddr/79/Content=5000
TO.MPA/RefAddr/10/Content=false
TEST/RefAddr/78/Content=1
CF-QMPS/RefAddr/89/Content=true
FROM.MPA.RFR/RefAddr/9/Encoding=String
T-SALES/RefAddr/15/Type=MDCTX
…
Notes: File System JNDI
4444
![Page 45: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/45.jpg)
IBM Software Group
File System JNDI - JMSAdmin
The MQ JMSAdmin utility can be used to create and
edit a JNDI from a command line.
It is rather cumbersome and a bit difficult to use.
The following technote is recommended:http://www-01.ibm.com/support/docview.wss?uid=swg21614256
Detailed example of running JMSAdmin on MQ
7.1, 7.5, 8.0 and later.
The following is an older tutorial but still useful:http://www.ibm.com/support/docview.wss?uid=swg27023212
Configuring and running simple JMS P2P and Pub/Sub
applications in MQ MQ 7.0, 7.1, 7.5 and 8.0
4545
![Page 46: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/46.jpg)
IBM Software Group
WebSphere Application Server JNDI
IBM WebSphere Application Server ships the
MQ JMS client (Resource Adapter).
The following tutorial has more information on how to
create JMS administrative objects for MQ in the
JNDI controlled by WAS.
In the WAS console, “topic” means: topic STRING
http://www.ibm.com/support/docview.wss?uid=swg27016505
Using WebSphere MQ V7 as JMS Provider for
WebSphere Application Server V7, V8.0 and V8.5
4646
![Page 47: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/47.jpg)
IBM Software Group
MQ JMS samples that use JNDI
We have now a File System JNDI (.bindings file) that
has a Connection Factory (CF-QMPS )and
a Topic Destination (T-SALES)
Let’s use them!
These are some of the MQ samples that use JNDI:
JmsJndiProducer and JmsJndiConsumer
Usage (a single line, but split for better reading)
JmsJndiProducer -i initialContext
-c connectionFactory -d destination
4747
![Page 48: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/48.jpg)
IBM Software Group
notes
From the MQ sample, JmsJndiProducer.java here is an excerpt of the main calls related to the usage
of the JNDI.
Remember that when using a File System JNDI, the term “initial context” really means “directory
where the .bindings file is located”.
// Instantiate the initial context
String contextFactory =
"com.sun.jndi.fscontext.RefFSContextFactory";
Hashtable<String, String> environment = new Hashtable<String,
String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
environment.put(Context.PROVIDER_URL, initialContextUrl);
Context context = new InitialDirContext(environment);
System.out.println("Initial context found!");
// Lookup the connection factory
JmsConnectionFactory cf = (JmsConnectionFactory)
context.lookup(connectionFactoryFromJndi);
// Lookup the destination
destination = (JmsDestination) context.lookup(destinationFromJndi);
Notes: source code related to the JNDI
4848
![Page 49: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/49.jpg)
IBM Software Group
notes
Open 2 command windows: 1 for the consumer and 1 for the producer
+ Window 1: Consumer
runmqjms JmsJndiConsumer -i file:/C:/var/mqm/JNDI-Directory -c CF-QMPS -d T-SALES
The JNDI related calls do the following mapping:
- Connection Factory CF-QMPS => queue manager QMPS located in host mosquito, port 1424
- Topic Destination T-SALES => topic string “sales”
+ Window 2: Producer
runmqjms JmsJndiProducer -i file:/C:/var/mqm/JNDI-Directory -c CF-QMPS -d T-SALES
Notice that there is no need to enter a text.
This sample generates a random number (such as 90) and includes it in a sentence:
JmsJndiProducer: Your lucky number today is 90
+ Window 1: Consumer (Notice that the message is received)
JmsJndiProducer: Your lucky number today is 90
SUCCESS
Notes: Scenario with JNDI
4949
![Page 50: MQ Pub/Sub: JMS API and traces …...IBM Software Group n o t e s How to distinguish a source file that uses “MQ Classes for Java” and another that uses “MQ Classes for JMS”](https://reader033.vdocuments.us/reader033/viewer/2022042016/5e74aa5b0274453127347f8d/html5/thumbnails/50.jpg)
IBM Software Group
The End
This is the end of the presentation.
THANKS!!
5050