MQand Java
MQand Java
MQand Java
Using Java
SC34-6066-02
WebSphere MQ
Using Java
SC34-6066-02
Note! Before using this information and the product it supports, be sure to read the general information under Appendix J, Notices, on page 505.
Third edition (January 2004) This is the third edition of this book that applies to WebSphere MQ. It applies to the following products: v IBM WebSphere MQ for AIX, Version 5.3 v IBM WebSphere MQ for HP-UX, Version 5.3 v IBM WebSphere MQ for iSeries, Version 5.3 v IBM WebSphere MQ for Linux for Intel, Version 5.3 v IBM WebSphere MQ for Linux for zSeries, Version 5.3 v IBM WebSphere MQ for Solaris, Version 5.3 v IBM WebSphere MQ for Windows, Version 5.3 v IBM WebSphere MQ for z/OS, Version 5.3 with fix pack 6 (CSD06) or later, and to any subsequent releases and modifications until otherwise indicated in new editions. Copyright International Business Machines Corporation 1997, 2004. All rights reserved. US Government Users Restricted Rights Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
Contents
Figures . . . . . . . . . . . . . . . ix Tables . . . . . . . . . . . . . . . xi About this book . . . . . . . . . . xiii
Who this book is for . . What you need to know to How to use this book . . Terms used in this book . . . . . . . understand this . . . . . . . . . . . . . . book . . . . . xiii xiii . xiii . xiv JMS Postcard . . . . . . . . . . . . . Setting up JMS Postcard . . . . . . . . Starting . . . . . . . . . . . . . . Sign-on . . . . . . . . . . . . . . Sending a postcard . . . . . . . . . . JMS Postcard configuration . . . . . . . How JMS Postcard works . . . . . . . Post installation setup . . . . . . . . . . Additional setup for publish/subscribe mode . Queues that require authorization for non-privileged users . . . . . . . . . Using the sample JMS applet to verify the TCP/IP client . . . . . . . . . . . . . . . Using the sample applet with OS/400 . . . Running the sample applet . . . . . . . Running the point-to-point IVT . . . . . . . Point-to-point verification without JNDI . . . Point-to-point verification with JNDI . . . . IVT error recovery . . . . . . . . . . The publish/subscribe installation verification test Publish/subscribe verification without JNDI . Publish/subscribe verification with JNDI . . PSIVT error recovery . . . . . . . . . Running your own WebSphere MQ JMS programs Solving problems . . . . . . . . . . . Tracing programs . . . . . . . . . . Logging . . . . . . . . . . . . . . . . . . . . . . 19 19 19 20 20 22 22 25 26
Summary of changes . . . . . . . . xv
| Changes for this edition (SC34606602) . . . . . xv | Changes for the second edition (SC34-6066-01) . . xv
Changes for the first edition (SC34-6066-00) . . . xv
. 29 . . . . . . . . . . . . . 29 30 30 31 31 32 34 35 35 36 37 38 38 38 39
Chapter 2. Installation . . . . . . . . . 9
What is installed . . . . . . . . . . . . Installation directories . . . . . . . . . Environment variables . . . . . . . . . STEPLIB configuration on z/OS and OS/390 . Web server configuration . . . . . . . . . Running WebSphere MQ Java applications under the Java 2 Security Manager . . . . . . . . . . . . . 9 10 10 12 12
. 13
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS) . . . . . . . . 19
Copyright IBM Corp. 1997, 2004
iii
The WebSphere MQ classes for Java interface . Java Development Kit . . . . . . . . . WebSphere MQ classes for Java class library .
. . .
. 64 . 64 . 65
MQQueueManager.begin() method MQGetMessageOptions fields . . Distribution lists . . . . . . . MQPutMessageOptions fields . . MQMD fields . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
98 98 98 98 99
iv
Using Java
Constructors . . . . . . Methods . . . . . . . MQSimpleConnectionManager Variables . . . . . . . Constructors . . . . . . Methods . . . . . . . MQC . . . . . . . . . MQPoolServicesEventListener . Methods . . . . . . . MQConnectionManager . . . MQReceiveExit . . . . . . Methods . . . . . . . MQSecurityExit . . . . . Methods . . . . . . . MQSendExit . . . . . . . Methods . . . . . . . ManagedConnection . . . . Methods . . . . . . . ManagedConnectionFactory . Methods . . . . . . . ManagedConnectionMetaData . Methods . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
163 166 176 176 176 176 179 180 180 181 182 182 184 184 186 186 188 188 191 191 193 193
Writing a simple publish/subscribe application connecting through WebSphere MQ . . . . . Import required packages . . . . . . . Obtain or create JMS objects . . . . . . Publish messages . . . . . . . . . . Receive subscriptions . . . . . . . . . Close down unwanted resources . . . . . TopicConnectionFactory administered objects Topic administered objects . . . . . . . Using topics . . . . . . . . . . . . . Topic names . . . . . . . . . . . . Creating topics at runtime . . . . . . . Subscriber options . . . . . . . . . . . Creating non-durable subscribers . . . . . Creating durable subscribers . . . . . . Using message selectors . . . . . . . . Suppressing local publications . . . . . . Combining the subscriber options . . . . Configuring the base subscriber queue . . . Subscription stores . . . . . . . . . Solving publish/subscribe problems . . . . . Incomplete publish/subscribe close down . . Subscriber cleanup utility . . . . . . . Manual cleanup . . . . . . . . . . Cleanup from within a program . . . . . Handling broker reports . . . . . . . . Other considerations . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
215 217 217 219 219 219 220 220 221 221 223 224 224 224 224 225 225 225 227 229 230 230 232 233 233 234
| |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
235 236 236 236 237 238 239 240 241 241 242 243 243 244 246 248 248 250 251 252 252 252 252 252 253 253 253 254
Methods . . . . . . . ExceptionListener . . . . . Methods . . . . . . . MapMessage . . . . . . Methods . . . . . . . Message . . . . . . . . Fields . . . . . . . . Methods . . . . . . . MessageConsumer . . . . Methods . . . . . . . MessageListener . . . . . Methods . . . . . . . MessageProducer . . . . . WebSphere MQ constructors Methods . . . . . . . MQQueueEnumeration * . . Methods . . . . . . . ObjectMessage . . . . . . Methods . . . . . . . Queue . . . . . . . . . WebSphere MQ constructors Methods . . . . . . . QueueBrowser . . . . . . Methods . . . . . . . QueueConnection . . . . . Methods . . . . . . . QueueConnectionFactory . . WebSphere MQ constructor. Methods . . . . . . . QueueReceiver . . . . . . Methods . . . . . . . QueueRequestor . . . . . Constructors . . . . . . Methods . . . . . . . QueueSender . . . . . . Methods . . . . . . . QueueSession . . . . . . Methods . . . . . . . Session . . . . . . . . Fields . . . . . . . . Methods . . . . . . . StreamMessage . . . . . . Methods . . . . . . . TemporaryQueue . . . . . Methods . . . . . . . TemporaryTopic . . . . . WebSphere MQ constructor. Methods . . . . . . . TextMessage . . . . . . . Methods . . . . . . . Topic . . . . . . . . . WebSphere MQ constructor. Methods . . . . . . . TopicConnection . . . . . Methods . . . . . . . TopicConnectionFactory . . . WebSphere MQ constructor. Methods . . . . . . . TopicPublisher . . . . . . Methods . . . . . . . TopicRequestor . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
338 340 340 341 341 349 349 349 363 363 366 366 367 367 367 373 373 374 374 375 375 375 377 377 379 379 381 381 381 384 384 385 385 385 387 387 390 390 393 393 393 405 405 413 413 414 414 414 415 415 416 416 416 420 420 423 423 423 431 431 434
vi
Using Java
| |
Constructors . . . . . . Methods . . . . . . . TopicSession . . . . . . . WebSphere MQ constructor. Methods . . . . . . . TopicSubscriber. . . . . . Methods . . . . . . . XAConnection . . . . . . Methods . . . . . . . XAConnectionFactory . . . Methods . . . . . . . XAQueueConnection . . . . Methods . . . . . . . XAQueueConnectionFactory . Methods . . . . . . . XAQueueSession . . . . . Methods . . . . . . . XASession . . . . . . . Methods . . . . . . . XATopicConnection . . . . Methods . . . . . . . XATopicConnectionFactory . . Methods . . . . . . . XATopicSession . . . . . . Methods . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
434 434 436 436 436 440 440 441 441 443 443 445 445 446 446 448 448 449 449 451 451 452 452 454 454
| | | | | | | |
Configuring WebSphere MQ JMS for a direct connection to WebSphere Business Integration Event Broker Version 5.0 and WebSphere Business Integration Message Broker Version 5.0 . . . . Secure Sockets Layer (SSL) authentication . . Multicast . . . . . . . . . . . . . HTTP tunnelling . . . . . . . . . . Connect via proxy . . . . . . . . . .
. . . . .
Appendix F. Using WebSphere MQ Java in applets with Java 1.2 or later . 481
Changing browser security settings . Copying package class files . . . . . . . . . . . . . 481 . 482
Appendix H. SSL CipherSuites supported by WebSphere MQ . . . . 487 Appendix I. JMS exception messages 489
. 467 . 467
Contents
vii
viii
Using Java
Figures
1. 2. 3. 4. WebSphere MQ classes for Java example applet . . . . . . . . . . . . . . 70 WebSphere MQ classes for Java example application . . . . . . . . . . . . . 73 WebSphere MQ classes for Java Message Service topic name hierarchy . . . . . . 221 How messages are transformed between JMS and WebSphere MQ using the MQRFH2 header . . . . . . . . . . . . . . 261 5. How JMS messages are transformed to WebSphere MQ messages (no MQRFH2 header) . . . . . . . . . . . ServerSessionPool and ServerSession functionality . . . . . . . . . . WebSphere MQ Integrator message flow . . . 273 . 284 470
6. 7.
ix
Using Java
Tables
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Platforms and connection modes . . . . . . 5 Product installation directories . . . . . . 10 Samples directories . . . . . . . . . . 10 Sample CLASSPATH statements for the product . . . . . . . . . . . . . . 11 Environment variables for the product . . . 12 Classes that are tested by IVT . . . . . . 34 Administration verbs . . . . . . . . . 44 Syntax and description of commands used to manipulate subcontexts . . . . . . . . 45 The JMS object types that are handled by the administration tool . . . . . . . . . . 46 Syntax and description of commands used to manipulate administered objects . . . . . 47 Property names and valid values . . . . . 49 The valid combinations of property and object type . . . . . . . . . . . . . . . 53 Character set identifiers . . . . . . . . 127 Set methods on MQQueueConnectionFactory 202 Property names for queue and topic URIs 205 Symbolic values for queue properties 206 The JMS 1.1 domain independent interfaces 235 Possible values for NameValueCCSID field 263 MQRFH2 folders and properties used by JMS 263 Property datatype values and definitions 264 JMS header fields mapping to MQMD fields 265 JMS properties mapping to MQMD fields 266 JMS provider specific properties mapping to MQMD fields . . . . . . . . . . . 266 Outgoing message field mapping . . . . . 267 Outgoing message JMS property mapping 267 Outgoing message JMS provider specific property mapping . . . . . . . . . . 267 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Incoming message JMS header field mapping Incoming message property mapping Incoming message provider specific JMS property mapping . . . . . . . . . . Load1 parameters and defaults . . . . . ASFClient1 parameters and defaults . . . . TopicLoad parameters and defaults . . . . ASFClient3 parameters and defaults . . . . Summary of interfaces in package javax.jms Summary of classes in package javax.jms Summary of classes in package com.ibm.mq.jms . . . . . . . . . . Summary of classes in package com.ibm.jms Comparison of representations of property values within the administration tool and within programs . . . . . . . . . . Utilities supplied with WebSphere MQ classes for Java Message Service . . . . . . . . Attribute settings for javaCodebase . . . . Attribute settings for javaClassName Attribute settings for javaClassNames Attribute settings for javaFactory . . . . . Attribute settings for javaReferenceAddress Attribute settings for javaSerializedData objectClass definition for javaSerializedObject objectClass definition for javaObject . . . . objectClass definition for javaContainer objectClass definition for javaNamingReference . . . . . . . . . CipherSpecs and matching CipherSuites 272 272 272 288 289 291 292 295 297 298 299
| 12. | | |
13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
457 461 464 464 464 465 465 465 465 466 466 466 487
39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
xi
xii
Using Java
xiii
xiv
Using Java
Summary of changes
This section describes changes in this edition of WebSphere MQ Using Java. Changes since the previous edition of the book are marked by vertical lines to the left of the changes. | | | | | | | | | | | | | | | | | |
xv
Changes
xvi
Using Java
Chapter 3. Using WebSphere MQ classes for Java (WebSphere MQ base Java) . . . . . . 15 Configuring your queue manager to accept client connections . . . . . . . . . . . . . . 15 TCP/IP client . . . . . . . . . . . . . 15 Verifying with the sample application . . . . . 16 Running your own WebSphere MQ base Java programs . . . . . . . . . . . . . . . 17 Solving WebSphere MQ base Java problems . . . 17 Tracing the sample application . . . . . . . 17 Error messages . . . . . . . . . . . . 18 Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS) JMS Postcard . . . . . . . . . . . . Setting up JMS Postcard . . . . . . . Starting . . . . . . . . . . . . . Sign-on . . . . . . . . . . . . . Sign-on advanced options . . . . . Sending a postcard . . . . . . . . . Running JMS Postcard with one queue manager . . . . . . . . . . . Running JMS Postcard with two queue managers . . . . . . . . . . . JMS Postcard configuration . . . . . . JMS Postcard default configuration . . How JMS Postcard works . . . . . . Starting up . . . . . . . . . . Receiving messages . . . . . . . . Sending messages . . . . . . . . How the postcards get there . . . . . Tidying up undeliverable messages . . Exchanging messages between different WebSphere MQ Postcard applications . Customizing JMS Postcard . . . . . Post installation setup . . . . . . . . .
Copyright IBM Corp. 1997, 2004
. . 19 . . 19 . . 19 . . 19 . . 20 . . 20 . . 20 . . . . . . . . . . . . . . 20 . . . . . . . . . 21 22 22 22 22 23 23 23 24
Chapter 5. Using the WebSphere MQ JMS administration tool . . . . . . . . . . . 41 Invoking the administration tool . . . . . . . 41 Configuration . . . . . . . . . . . . . 42 Using an unlisted InitialContextFactory . . . . 43 Security . . . . . . . . . . . . . . 43 Configuring for WebSphere Application Server V3.5 . . . . . . . . . . . . . . . . 44 Administration commands . . . . . . . . . 44 Manipulating subcontexts . . . . . . . . . 45 Administering JMS objects . . . . . . . . . 45 Object types . . . . . . . . . . . . . 45 Verbs used with JMS objects . . . . . . . . 47 Creating objects . . . . . . . . . . . . 48 LDAP naming considerations . . . . . . 48 Properties . . . . . . . . . . . . . . 49 Property dependencies . . . . . . . . . 56 The ENCODING property . . . . . . . . 57 SSL properties . . . . . . . . . . . . 58 Sample error conditions . . . . . . . . . 59
. 24 . 24 . 25
Using Java
Connection options
Programmable options allow WebSphere MQ Java to connect to WebSphere MQ in either of the following ways: v As a WebSphere MQ client using Transmission Control Protocol/Internet Protocol (TCP/IP) v In bindings mode, connecting directly to WebSphere MQ Table 1 on page 5 shows which of these connection modes can be used for each platform.
Using Java
Connections
In addition, WebSphere MQ JMS publish/subscribe applications can connect directly across TCP/IP to the IBM WebSphere MQ Event Broker program. For more information about this connection see Chapter 11, Writing WebSphere MQ JMS publish/subscribe applications, on page 213.
Table 1. Platforms and connection modes Server platform Windows NT Windows 2000 Windows XP AIX Solaris (v2.6, v2.8, V7, or SunOS v5.6, v5.7) OS/400 HP-UX OS/390 and z/OS Linux on Intel Linux on zSeries Client yes yes yes yes yes yes yes no yes yes Bindings yes yes yes yes yes yes yes yes yes no
Notes: 1. HP-UX Java bindings support is available only for HP-UXv11 systems running the POSIX draft 10 pthreaded version of WebSphere MQ. 2. On Linux on zSeries, only TCP/IP client connectivity is supported. The following sections describe these options in more detail.
Client connection
To use WebSphere MQ Java as a WebSphere MQ client, you can install it either on the WebSphere MQ server machine, which may also contain a Web server, or on a separate machine. If you install WebSphere MQ Java on the same machine as a Web server, you can download and run WebSphere MQ client applications on machines that do not have WebSphere MQ Java installed locally. Wherever you choose to install the client, you can run it in three different modes: From within any Java-enabled Web browser In this mode, the locations of the WebSphere MQ queue managers that can be accessed are constrained by the security restrictions of the browser that is used. Using an appletviewer To use this method, you must have the Java Development Kit (JDK) or Java Runtime Environment (JRE) installed on the client machine. As a standalone Java program or in a Web application server To use this method, you must have the Java Development Kit (JDK) or Java Runtime Environment (JRE) installed on the client machine.
Bindings connection
When used in bindings mode, WebSphere MQ Java uses the Java Native Interface (JNI) to call directly into the existing queue manager API, rather than communicating through a network. This provides better performance for
Chapter 1. Getting started
Connections
WebSphere MQ applications than using network connections. Unlike the client mode, applications that are written using the bindings mode cannot be downloaded as applets. To use the bindings connection, you must install WebSphere MQ Java on the WebSphere MQ server.
Prerequisites
To run WebSphere MQ base Java, you need the following software: v WebSphere MQ for the server platform you want to use. v Java Development Kit (JDK) for the server platform. v Java Development Kit, Java Runtime Environment (JRE), or Java-enabled Web browser for client platforms. (See Client connection on page 5.) v For z/OS and OS/390, OS/390 Version 2 Release 9 or higher, or z/OS, with UNIX System Services (USS). v For OS/400, the iSeries Developer Kit for Java, 5769-JV1, and the Qshell Interpreter, OS/400 (5769-SS1) Option 30. The following list shows the supported Java 2 Software Development Kits and Java Runtime Environments: v IBM Developer Kit for AIX, Java Technology Edition, Version 1.3.1 v IBM Developer Kit for Linux, Java Technology Edition, Version 1.3.1 v IBM Developer Kit for OS/390, Java Technology Edition, Version 1.3.1 v IBM Developer Kit for Windows, Java Technology Edition, Version 1.3.0 v IBM iSeries Developer Kit for Java, Version 1.3 v HP-UX SDK, for the Java platform, Version 1.3.1 v Java 2 Standard Edition, for the Solaris Operating Environment, SDK 1.3.1 To fully support Secure Socket Layer (SSL) authentication, you need a Java Runtime Environment at Version 1.4.0 for your platform. SSL support enables WebSphere MQ Java and Java Message Service (JMS) applications to benefit from secure connection to the queue manager, providing authentication, message integrity, and data encryption. Check the README file for the latest information about operating system levels this product has been tested against. To use the WebSphere MQ JMS administration tool (see Chapter 5, Using the WebSphere MQ JMS administration tool, on page 41), you need one of the following service provider packages, supplied with WebSphere MQ: v Lightweight Directory Access Protocol (LDAP) - ldap.jar, providerutil.jar. v File system - fscontext.jar, providerutil.jar. These packages provide the Java Naming and Directory Service (JNDI) service. This is the resource that stores physical representations of the administered objects. Users of WebSphere MQ JMS probably use an LDAP server for this purpose, but the tool also supports the use of the file system context service provider. If you use an LDAP server, configure it to store JMS objects. For information to assist with this configuration, refer to Appendix C, LDAP schema definition for storing Java objects, on page 463. To use publish/subscribe applications, you need one of the following: v SupportPac MA0C: MQSeries Publish/Subscribe. You can find this at:
Using Java
Prerequisites
www.ibm.com/software/ts/mqseries/txppacs/ma0c.html
| | |
v WebSphere MQ Integrator Version 2 v WebSphere MQ Event Broker Version 2.1 v WebSphere Business Integration Message Broker Version 5.0 v WebSphere Business Integration Event Broker Version 5.0 To use the XOpen/XA facilities of WebSphere MQ JMS on OS/400 you need a specific PTF. Check the README file for further information.
Using Java
Chapter 2. Installation
This chapter tells you how to install the WebSphere MQ classes for Java and WebSphere MQ classes for Java Message Service code.
What is installed
The latest versions of both WebSphere MQ base Java and WebSphere MQ JMS (together known as WebSphere MQ Java) are installed with WebSphere MQ. You might need to override default installation options to make sure this is done. Refer to the following books for more information about installing WebSphere MQ: WebSphere MQ for AIX, V5.3 Quick Beginnings WebSphere MQ for HP-UX, V5.3 Quick Beginnings WebSphere MQ for iSeries V5.3 Quick Beginnings WebSphere MQ for Linux, V5.3 Quick Beginnings WebSphere MQ for Sun Solaris, Version 5.3 Quick Beginnings WebSphere MQ for Windows NT and Windows 2000, Version 5.3 Quick Beginnings WebSphere MQ for z/OS Program Directory WebSphere MQ base Java is contained in the following Java .jar files: com.ibm.mq.jar com.ibm.mqbind.jar This code includes support for all the connection options. This code supports only the bindings connection and is not supplied or supported on all platforms. We recommend that you do not use it in any new applications.
WebSphere MQ JMS is contained in the following Java .jar file: com.ibm.mqjms.jar The following Java libraries from Sun Microsystems are distributed with the WebSphere MQ JMS product: connector.jar fscontext.jar | jms.jar jndi.jar ldap.jar providerutil.jar jta.jar Version 1.0 Version 1.2 Version 1.1 Version 1.2.1 (except for z/OS and OS/390) Version 1.2.2 (except for z/OS and OS/390) Version 1.2 Version 1.0.1
When installation is complete, files and samples are installed in the locations shown in Installation directories on page 10. We also supply postcard.jar for the Postcard application; see JMS Postcard on page 19.
Copyright IBM Corp. 1997, 2004
What is installed
After installation, update your environment variables, as shown in Environment variables. Note: Do not install the product, then subsequently install or reinstall a version of SupportPac MA88, or your WebSphere MQ Java support might revert to an earlier level.
Installation directories
The WebSphere MQ Java V5.3 files are installed in the directories shown in Table 2.
Table 2. Product installation directories Platform AIX z/OS and OS/390 iSeries and AS/400 HP-UX and Solaris Linux Windows systems
Note: On z/OS and OS/390, install_dir is the directory in which you installed the product; this is likely to be /usr/lpp.
Some sample programs, such as the Installation Verification Programs (IVP), are supplied. Table 3 lists the directory path to these on different platforms. WebSphere MQ base Java samples are within a subdirectory base and WebSphere MQ JMS samples are within a subdirectory jms.
Table 3. Samples directories Platform AIX z/OS and OS/390 iSeries and AS/400 HP-UX and Solaris Linux Windows systems Directory /usr/mqm/samp/java/ install_dir/mqm/java/samples/ /QIBM/ProdData/mqm/java/samples/ /opt/mqm/samp/java/ /opt/mqm/samp/java/ \Program Files\IBM\WebSphere MQ\tools\Java\
Note: On z/OS and OS/390, install_dir is the directory in which you installed the product; this is likely to be /usr/lpp.
Environment variables
After installation, update your CLASSPATH environment variable to include the WebSphere MQ base Java code and samples directories. Table 4 on page 11 shows typical CLASSPATH settings for the various platforms. WebSphere MQ Java uses other environment variables. Some are platform dependent and are listed in Table 5 on page 12. MQ_JAVA_INSTALL_PATH and MQ_JAVA_DATA_PATH are common across platforms. On Windows systems, these variables are automatically set by the installation program, but on other platforms you need to set them manually to complete installation.
10
Using Java
Installation directories
MQ_JAVA_INSTALL_PATH points to the product installation directory, as shown in Table 2 on page 10. MQ_JAVA_DATA_PATH points to the root directory for logging and tracing, and is included so that you can use the same directory for WebSphere MQ Java and the base WebSphere MQ product.
Table 4. Sample CLASSPATH statements for the product Platform AIX Sample CLASSPATH CLASSPATH=/usr/mqm/java/lib/com.ibm.mq.jar: /usr/mqm/java/lib/connector.jar: /usr/mqm/samp/java/base: CLASSPATH=/opt/mqm/java/lib/com.ibm.mq.jar: /opt/mqm/java/lib/connector.jar: /opt/mqm/samp/java/base:
Windows systems CLASSPATH=mq_root_dir1\java\lib\com.ibm.mq.jar; mq_root_dir\java\lib\connector.jar; mq_root_dir\tools\java\base\; mq_root_dir\java\lib\jta.jar; z/OS and OS/390 iSeries and AS/400 Linux CLASSPATH=install_dir2/mqm/java/lib/com.ibm.mq.jar: install_dir/mqm/java/lib/connector.jar: install_dir/mqm/java/samples/base: CLASSPATH=/QIBM/ProdData/mqm/java/lib/com.ibm.mq.jar: /QIBM/ProdData/mqm/java/lib/connector.jar: /QIBM/ProdData/mqm/java/samples/base: CLASSPATH=/opt/mqm/java/lib/com.ibm.mq.jar: /opt/mqm/java/lib/connector.jar: /opt/mqm/samp/java/base:
Notes: 1. mq_root_dir stands here for the directory used to install WebSphere MQ on Windows systems. This is normally C:\Program Files\IBM\WebSphere MQ\. 2. install_dir is the directory in which you installed the product
To use WebSphere MQ JMS, you must include additional jar files in the classpath. These are listed in Post installation setup on page 25. If there are existing applications with a dependency on the deprecated bindings package com.ibm.mqbind, you must also add the file com.ibm.mqbind.jar to your classpath. You must update additional environment variables on some platforms, as shown in Table 5 on page 12.
Chapter 2. Installation
11
Installation directories
Table 5. Environment variables for the product Platform Environment variable LIBPATH=/usr/mqm/java/lib SHLIB_PATH=/opt/mqm/java/lib LD_LIBRARY_PATH=/opt/mqm/java/lib
Notes: 1. To use WebSphere MQ Bindings for Java on OS/400, ensure that the library QMQMJAVA is in your library list. 2. Ensure that you append the WebSphere MQ variables and do not overwrite any of the existing system environment variables. If you overwrite existing system environment variables, the application might fail during compilation or at runtime.
In other environments, you typically need to edit the startup JCL to include SCSQAUTH on the STEPLIB concatenation:
STEPLIB DD DSN=thlqual.SCSQAUTH,DISP=SHR
12
Using Java
This example of a policy file enables the WebSphere MQ Java classes to work correctly under the security manager, but you might still need to enable your own code to run correctly before your applications will work. The sample code shipped with WebSphere MQ Java has not been specifically enabled for use with the security manager; however the IVT tests run with the above policy file and the default security manager in place.
Chapter 2. Installation
13
14
Using Java
TCP/IP client
1. Define a server connection channel using the following procedures: For the OS/400 platform: a. Start your queue manager by using the STRMQM command. b. Define a sample channel called JAVA.CHANNEL by issuing the following command:
CRTMQMCHL CHLNAME(JAVA.CHANNEL) CHLTYPE(*SVRCN) MQMNAME(QMGRNAME) MCAUSERID(SOMEUSERID) TEXT(Sample channel for WebSphere MQ classes for Java)
where QMGRNAME is the name of your queue manager, and SOMEUSERID is an OS/400 user ID with appropriate authority to the WebSphere MQ resources. For z/OS or OS/390 platforms: Note: You must have the Client attachment feature installed on your target queue manager in order to connect using TCP/IP. a. Start your queue manager by using the START QMGR command. b. Define a sample channel called JAVA.CHANNEL by issuing the following command:
DEF CHL(JAVA.CHANNEL) CHLTYPE(SVRCONN) TRPTYPE(TCP) DESCR(Sample channel for WebSphere MQ classes for Java)
For other platforms: a. Start your queue manager by using the strmqm command. b. Type the following command to start the runmqsc program:
runmqsc [QMNAME]
15
2. Start a listener program with the following commands: For Windows NT, Windows 2000 operating systems: Issue the command:
runmqlsr -t tcp [-m QMNAME] -p 1414
Note: If you use the default queue manager, you can omit the -m option. For UNIX operating systems: Configure the inetd daemon, so that the inetd starts the WebSphere MQ channels. See WebSphere MQ Clients for instructions on how to do this. For the OS/400 operating system: Issue the command:
STRMQMLSR MQMNAME(QMGRNAME)
where QMGRNAME is the name of your queue manager. For the z/OS or OS/390 operating system: a. Ensure your channel initiator is started. If not, start it by issuing the START CHINIT command. b. Start the listener by issuing the command START LISTENER TRPTYPE(TCP) PORT(1414)
The program tries to: a. Connect to, and disconnect from, the named queue manager. b. Open, put, get, and close the system default local queue. c. Return a message if the operations are successful. 4. At the prompt (1): v To use a TCP/IP connection, enter a WebSphere MQ server host name. v To use native connection (bindings mode), leave the field blank. (Do not enter a name.)
16
Using Java
3. On OS/400, you can run the command java MQIVP only from the Qshell interactive interface (the Qshell is option 30 of OS/400, 5769-SS1). Alternatively, you can run the application by using the CL command RUNJVA CLASS(MQIVP). 4. To use the WebSphere MQ bindings for Java on OS/400, you must ensure that the library QMQMJAVA is in your library list.
where n is a number between 1 and 5, depending on the level of detail required. (The greater the number, the more information is gathered.) For more information about how to use trace, see Tracing WebSphere MQ base Java programs on page 94.
Chapter 3. Using WebSphere MQ classes for Java (WebSphere MQ base Java)
17
Error messages
Error messages
Here are some of the more common error messages that you might see: Unable to identify local host IP address The server is not connected to the network. Connect the server to the network and retry. MQRC_ADAPTER_CONN_LOAD_ERROR If you see this z/OS error , ensure that the WebSphere MQ SCSQANLE and SCSQAUTH datasets are in your STEPLIB statement.
18
Using Java
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
This chapter tells you how to: v Set up and use JMS Postcard v Set up your system to use the test and sample programs v Run the point-to-point Installation Verification Test (IVT) program to verify your WebSphere MQ classes for Java Message Service installation v Run the sample publish/subscribe Installation Verification Test (PSIVT) program to verify your publish/subscribe installation v Run your own programs
JMS Postcard
JMS Postcard is a simple way to do the following: v Verify that you have successfully installed WebSphere MQ and WebSphere MQ JMS on one computer and, optionally, on others as well v Introduce you to messaging Note: JMS Postcard is not supported on WebSphere MQ for z/OS or WebSphere MQ for iSeries.
Starting
To start the JMS Postcard application, run the postcard script. This is supplied in the java/bin directory of the WebSphere MQ installation. The first time that you run JMS Postcard, it asks you to complete the default configuration, which sets up a suitable queue manager to act as mailbox. See JMS Postcard default configuration on page 22. Whenever you start a Postcard application, you must sign on and enter a nickname. (There are advanced options available on the sign-on dialog, see Sign-on advanced options on page 20 for details).
Copyright IBM Corp. 1997, 2004
19
JMS Postcard
Sign-on
The sign-on dialog has a check box labelled Advanced. Check this to see the extended dialog where you can choose which queue manager is used by the Postcard program. Notes: 1. If you have no queue managers at all, or just the default configuration, the checkbox is disabled. 2. Depending on what queue managers and clusters you have, the checkbox and options are in one of various combinations of enabled, disabled, and preselected.
Sending a postcard
To send a postcard successfully, you need two instances of the Postcard application with different nicknames. For example, suppose you start the Postcard application and use the nickname Will, and then start it again using the nickname Tim. Will can send postcards to Tim and Tim can send postcards to Will. If Will and Tim are connected to the same queue manager, see Running JMS Postcard with one queue manager. If Tim is on a different queue manager manager (on the same or a different computer from Will), see Running JMS Postcard with two queue managers on page 21. When the postcard arrives successfully, you know that your WebSphere MQ installation and WebSphere MQ JMS are working correctly. For an alternative way of verifying the installation of WebSphere MQ JMS, run the IVTRun application from the command line. See Running the point-to-point IVT on page 31 for more information about this.
20
Using Java
JMS Postcard
2. Enter your second nickname, for example Tim. 3. On Wills Postcard fill in the To field with your second nickname, Tim. (You can leave the On field empty and Postcard will fill it in for you, or you can type in the queue manager name that you see below the Message box after On). 4. Click in the Message box, type your message in, and click the Send button. 5. Look in Tims Postcard to see the message arrive, and double-click on it to see the postcard itself. 6. Try using Tim to send a message back to Will. You can do this by selecting the message that arrived in Tims list, and clicking the Reply button. Note: See JMS Postcard configuration on page 22 for advice about configuration.
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
21
JMS Postcard
Starting up
When JMS Postcard starts, it checks to see what queue managers exist on this computer, and initializes the sign-on dialog accordingly. If there are no queue managers at all, it prompts you to install the default configuration. JMS Postcard uses the Java Message Service method queueConnectionFactory.createQueueConnection() to connect to the default queue manager.
22
Using Java
JMS Postcard
Receiving messages
All the time JMS Postcard is running, it polls a queue called postcard for incoming messages from other Postcard applications. If there is no queue called postcard, JMS Postcard creates one. When JMS Postcard starts running, it creates a Java Message Service QueueReceiver object for the local postcard queue, providing as a parameter a selector string that filters the messages to be received from the queue by the Correlation Identifier (CorrelId field). The selector string defines that the postcard client should only receive messages where the CorrelId field matches the nickname of the user. The words from the message data are then presented in the JMS Postcard window.
Sending messages
If you did not enter a computer name in the On: field, JMS Postcard assumes that the recipient is on the same queue manager. If you entered a name, JMS Postcard checks for the existence of a queue manager with this name, first using the exact name supplied, and then using a prefix in the same format as that created by the default configuration. In both cases, it issues a session.createQueue(postcard), and sets the base queue manager name to the string supplied. Finally, it builds a JMS BytesMessage from your nickname and the words you typed in, and runs queueSender.send(theMessage) to put the message onto the queue.
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
23
JMS Postcard
This example selects white text on a black background. The values represent intensity levels for red, green, and blue colors using a hexadecimal scale from 00 to FF. Other examples of colors are FF0000 (bright red), 00FF00 (bright green) and 0000FF (bright blue). Setting font size
MinimumFont=20
This example selects a minimum font size of 20 points. Any value smaller than 13 is ignored. Using an external browser for online help
WebBrowser=nautilus
This setting is only applicable on non-Windows systems. The internal browser used for displaying online help information cannot be customized. This setting allows you to identify an alternative browser.
24
Using Java
JMS Postcard
Tracing the Postcard application
Trace=1
Set this to start trace output. Note that the trace output is sent to the trc subdirectory of the directory defined by the MQ_JAVA_DATA_PATH system environment variable. If the application cannot write to this directory, trace output is directed to the system console. You can also use the MQJMS_TRACE_LEVEL parameter on the java command line to start tracing. See Tracing programs on page 38 for more about tracing applications.
Notes: 1. For z/OS and OS/390, use ibmjndi.jar and jndi.jar from /usr/lpp/ldap/lib instead of jndi.jar and ldap.jar. These files are supplied with the operating system. 2. Include the java/lib directory itself in the classpath to access the properties files used by the base Java API. 3. Include providerutil.jar, jndi.jar, and either ldap.jar or fscontext.jar if you need to access a JNDI namespace. 4. In certain environments, typically J2EE application servers, classes contained in these jars are provided by the environment. In these circumstances, use the classes provided by the environment instead of those provided with WebSphere MQ. Environment variables There are a number of scripts in the bin subdirectory of the WebSphere MQ JMS installation. These are for use as convenient shortcuts for a number of common actions. Many of these scripts assume that the environment variables MQ_JAVA_INSTALL_PATH and MQ_JAVA_DATA_PATH are
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
25
Setup
defined, pointing to the directory in which WebSphere MQ JMS is installed and a directory for log and trace output, respectively. If you do not set these variables, you must edit the scripts in the bin directory accordingly. On Windows NT, you can set the classpath and other environment variables by using the Environment tab of System Properties. On Windows 2000 and Windows XP, Environment is a button on the Advanced tab of System Properties. On UNIX, these are normally set from each users logon scripts. On any platform, you can use scripts to maintain different classpaths and other environment variables for different projects. Note: If you are migrating from the SupportPac MA88, be aware that the connector.jar is now packaged in the java/lib directory with the other jar files, with the following consequences: v You need an entry for connector.jar in the classpath, as explained above. v If you have previously implemented your own ConnectionManagers, as described in Supplying your own ConnectionManager on page 85, you must replace references to com.ibm.mq.resource and com.ibm.mq.resource.spi with references to javax.resource and javax.resource.spi respectively.
| |
26
Using Java
where MY.QUEUE.MANAGER is the name of the queue manager on which the broker is running. If the broker is running, a message similar to the following is displayed:
WebSphere MQ message broker for queue manager MY.QUEUE.MANAGER running.
If the operating system reports that it cannot run the dspmqbrk command, ensure that the MQSeries Publish/Subscribe broker is installed properly. If the operating system reports that the broker is not active, start it using the command:
strmqbrk -m MY.QUEUE.MANAGER
WebSphere MQ Integrator V2 To verify that the broker provided in WebSphere MQ Integrator V2 is installed and running, refer to the product documentation. The command to start the broker in WebSphere MQ Integrator V2 is:
mqsistart MYBROKER
where MYBROKER is the name of the broker. WebSphere MQ Event Broker To verify that the broker provided in WebSphere MQ Event Broker is installed and running, refer to the product documentation. The command to start the broker in WebSphere MQ Event Broker is:
wmqpsstart MYBROKER
where MYBROKER is the name of the broker. Create the WebSphere MQ JMS system queues This does not apply if you use a direct connection across TCP/IP to WebSphere MQ Event Broker. For a publish/subscribe implementation to work correctly, you must create a number of system queues. A script is supplied, in the bin subdirectory of the WebSphere MQ JMS installation, to assist with this task. To use the script, enter the following commands:
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
27
For z/OS and OS/390: 1. Copy the script from the HFS into a PDS using a TSO command similar to
OGET /usr/lpp/mqm/java/bin/MQJMS_PSQ.mqsc USERID.MQSC(MQJMSPSQ)
The PDS should be of fixed-block format with a record length of 80. 2. Either use the CSQUTIL application to execute this command script, or add the script to the CSQINP2 DD concatenation in your queue managers started task JCL. In either case, refer to the WebSphere MQ for z/OS System Setup Guide and the WebSphere MQ for z/OS System Administration Guide for further details. For other platforms:
runmqsc MY.QUEUE.MANAGER < MQJMS_PSQ.mqsc
If an error occurs, check that you typed the queue manager name correctly and that the queue manager is running.
5. To operate the local queue manager to communicate with the remote broker, take the following steps:
28
Using Java
29
or by pointing your Java 1.3 enabled browser at this Web page. Change the string <web.server.host/jmsapplet> as appropriate to the URL of the Web server you are using. Running in appletviewer from the local machine: Invoke the applet using a command line like the following:
appletviewer test.html
Remember that the WebSphere MQ base Java and WebSphere MQ JMS libraries must be present in the same local directory as the applet class file. Also, in this case, the applet might connect only to queue managers on the local machine. | | | Running the applet as an application: Compile the applet using the command:
javac JMSTestApplet.java
The JMS sample applet contains a main method that allows the applet to run as a standalone Java application. This option requires the WebSphere MQ base Java and WebSphere MQ JMS libraries to be present in the system CLASSPATH, as for your own
30
Using Java
For client mode, to run the test without JNDI, issue the following command:
IVTRun [-t] -nojndi -client -m <qmgr> -host <hostname> [-port <port>] [-channel <channel>]
where: -t qmgr hostname port channel turns tracing on (by default, tracing is off) is the name of the queue manager to which you want to connect is the host on which the queue manager is running is the TCP/IP port on which the queue managers listener is running (default 1414) is the client connection channel (default SYSTEM.DEF.SVRCONN)
If the test completes successfully, you should see output similar to the following:
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
31
Point-to-point IVT
5648-C60, 5724-B41, 5655-F10 (c) Copyright IBM Corp. 2002. All Rights Reserved. Websphere MQ classes for Java(tm) Message Service 5.300 Installation Verification Test Creating a QueueConnectionFactory Creating a Connection Creating a Session Creating a Queue Creating a QueueSender Creating a QueueReceiver Creating a TextMessage Sending the message to SYSTEM.DEFAULT.LOCAL.QUEUE Reading the message back again Got message: JMS Message class: jms_text JMSType: null JMSDeliveryMode: 2 JMSExpiration: 0 JMSPriority: 4 JMSMessageID: ID:414d51204153434152492020202020207cce883c03300020 JMSTimestamp: 1016124013892 JMSCorrelationID:null JMSDestination: queue:///SYSTEM.DEFAULT.LOCAL.QUEUE JMSReplyTo: null JMSRedelivered: false JMS_IBM_PutDate:20020314 JMSXAppID:java JMS_IBM_Format:MQSTR JMS_IBM_PutApplType:6 JMS_IBM_MsgType:8 JMSXUserID:parkiw JMS_IBM_PutTime:16401390 JMSXDeliveryCount:1 A simple text message from the MQJMSIVT program Reply string equals original string Closing QueueReceiver Closing QueueSender Closing Session Closing Connection IVT completed OK IVT finished
This message means that either the server is not storing Java objects, or the permissions on the objects or the suffix are not correct. See Checking your LDAP server configuration on page 463. Also, the following administered objects must be retrievable from a JNDI namespace: v MQQueueConnectionFactory v MQQueue A script, named IVTSetup on UNIX, or IVTSetup.bat on Windows systems, is provided to create these objects automatically. Enter the command:
IVTSetup
32
Using Java
Point-to-point IVT
The script invokes the WebSphere MQ JMS Administration tool (see Chapter 5, Using the WebSphere MQ JMS administration tool, on page 41) and creates the objects in a JNDI namespace. The MQQueueConnectionFactory is bound under the name ivtQCF (for LDAP, cn=ivtQCF). All the properties are default values:
TRANSPORT(BIND) PORT(1414) HOSTNAME(localhost) CHANNEL(SYSTEM.DEF.SVRCONN) VERSION(1) CCSID(819) TEMPMODEL(SYSTEM.DEFAULT.MODEL.QUEUE) QMANAGER()
The MQQueue is bound under the name ivtQ (cn=ivtQ). The value of the QUEUE property becomes QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE). All other properties have default values:
PERSISTENCE(APP) QUEUE(SYSTEM.DEFAULT.LOCAL.QUEUE) EXPIRY(APP) TARGCLIENT(JMS) ENCODING(NATIVE) VERSION(1) CCSID(1208) PRIORITY(APP) QMANAGER()
Once the administered objects are created in the JNDI namespace, run the IVTRun (IVTRun.bat on Windows systems) script using the following command:
IVTRun [ -t ] -url "<providerURL>" [ -icf <initCtxFact> ]
where: -t providerURL Note: Enclose the providerURL string in quotation marks (). This is the JNDI location of the administered objects. If the default initial context factory is in use, this is an LDAP URL of the form:
"ldap://hostname.company.com/contextName"
If a file system service provider is used, (see initCtxFact below), the URL is of the form:
"file://directorySpec"
initCtxFact
is the classname of the initial context factory. The default is for an LDAP service provider, and has the value:
com.sun.jndi.ldap.LdapCtxFactory
If the test completes successfully, the output is similar to the non-JNDI output, except that the create QueueConnectionFactory and Queue lines indicate retrieval of the object from JNDI. The following shows an example.
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
33
Point-to-point IVT
5648-C60, 5724-B41, 5655-F10 (c) Copyright IBM Corp. 2002. All Rights Reserved. Websphere MQ classes for Java(tm) Message Service 5.300 Installation Verification Test Using administered objects, please ensure that these are available Retrieving a QueueConnectionFactory from JNDI Creating a Connection Creating a Session Retrieving a Queue from JNDI Creating a QueueSender Creating a QueueReceiver Creating a TextMessage Sending the message to SYSTEM.DEFAULT.LOCAL.QUEUE Reading the message back again Got message: JMS Message class: jms_text JMSType: null ... ...
Although not strictly necessary, it is good practice to remove objects that are created by the IVTSetup script from the JNDI namespace. A script called IVTTidy (IVTTidy.bat on Windows systems) is provided for this purpose.
34
Using Java
Publish/subscribe IVT
When you run the PSIVT, the publisher publishes the message, and the subscriber receives and displays the message. The publisher publishes to the brokers default stream. The subscriber is non-durable, does not perform message selection, and accepts messages from local connections. It performs a synchronous receive, waiting a maximum of 5 seconds for a message to arrive. You can run the PSIVT, like the IVT, in either JNDI mode or standalone mode. JNDI mode uses JNDI to retrieve a TopicConnectionFactory and a Topic from a JNDI namespace. If JNDI is not used, these objects are created at runtime.
For client mode, to run the test without JNDI, issue the following command:
PSIVTRun -nojndi -client -m <qmgr> -host <hostname> [-port <port>] [-channel <channel>] [-bqm <broker>] [-t]
where: -nojndi qmgr hostname port channel broker indicates no JNDI lookup of the administered objects is the name of the queue manager to which you wish to connect is the host on which the queue manager is running is the TCP/IP port on which the queue managers listener is running (default 1414) is the client connection channel (default SYSTEM.DEF.SVRCONN) is the name of the remote queue manager on which the broker is running. If this is not specified, the value used for qmgr is assumed. turns tracing on (default is off)
-t
35
Publish/subscribe IVT
Creating a Connection Creating a TopicConnectionFactory Creating a Session Creating a Topic Creating a TopicPublisher Creating a TopicSubscriber Creating a TextMessage Adding text Publishing the message to topic://MQJMS/PSIVT/Information Waiting for a message to arrive [5 secs max]... Got message: JMS Message class: jms_text JMSType: null JMSDeliveryMode: 2 JMSExpiration: 0 JMSPriority: 4 JMSMessageID: ID:414d51204153434152492020202020207cce883c19230020 JMSTimestamp: 1016124933637 JMSCorrelationID:ID:414d51204153434152492020202020207cce883c09320020 JMSDestination: topic://MQJMS/PSIVT/Information JMSReplyTo: null JMSRedelivered: false JMS_IBM_PutDate:20020314 JMSXAppID:ASCARI JMS_IBM_Format:MQSTR JMS_IBM_PutApplType:26 JMS_IBM_MsgType:8 JMSXUserID:parkiw JMS_IBM_PutTime:16553367 JMSXDeliveryCount:1 A simple text message from the MQJMSPSIVT program Reply string equals original string Closing TopicSubscriber Closing TopicPublisher Closing Session Closing Connection PSIVT finished
This command defines the Topic. These definitions assume that a default queue manager, on which the broker is running, is available. For details on configuring these objects to use a non-default queue manager, see Administering JMS objects on page 45. These objects must reside in a context pointed to by the -url command-line parameter described below.
36
Using Java
Publish/subscribe IVT
To run the test in JNDI mode, enter the following command:
PSIVTRun [ -t ] -url "<providerURL>" [ -icf <initCtxFact> ]
where: -t providerURL Note: Enclose the providerURL string in quotation marks (). This is the JNDI location of the administered objects. If the default initial context factory is in use, this is an LDAP URL of the form:
"ldap://hostname.company.com/contextName"
If a file system service provider is used, (see initCtxFact below), the URL is of the form:
"file://directorySpec"
initCtxFact
is the classname of the initial context factory. The default is for an LDAP service provider, and has the value:
com.sun.jndi.ldap.LdapCtxFactory
If the test completes successfully, output is similar to the non-JNDI output, except that the create QueueConnectionFactory and Queue lines indicate retrieval of the object from JNDI.
indicates that the broker is installed on the target queue manager, but its control queue contains some outstanding messages. For instructions on how to start it, see Additional setup for publish/subscribe mode on page 26. v If the following message is displayed:
Unable to connect to queue manager: <default>
ensure that your WebSphere MQ system has configured a default queue manager. v If the following message is displayed:
Unable to connect to queue manager: ...
ensure that the administered TopicConnectionFactory that the PSIVT uses is configured with a valid queue manager name. Alternatively, if you used the -nojndi option, ensure that you supplied a valid queue manager (using the -m option). v If the following message is displayed:
Unable to access broker control queue on queue manager: ... Please ensure the broker is installed on this queue manager
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
37
Publish/subscribe IVT
ensure that the administered TopicConnectionFactory that the PSIVT uses is configured with the name of the queue manager on which the broker is installed. If you used the -nojndi option, ensure that you supplied a queue manager name (using the -m option).
Solving problems
If a program does not complete successfully, run the installation verification program, which is described in Running the point-to-point IVT on page 31, and follow the advice given in the diagnostic messages.
Tracing programs
The WebSphere MQ JMS trace facility is provided to help IBM staff to diagnose customer problems. Trace is disabled by default, because the output rapidly becomes large, and is unlikely to be of use in normal circumstances. If you are asked to provide trace output, enable it by setting the Java property MQJMS_TRACE_LEVEL to one of the following values: on base traces WebSphere MQ JMS calls only traces both WebSphere MQ JMS calls and the underlying WebSphere MQ base Java calls
For example:
java -DMQJMS_TRACE_LEVEL=base MyJMSProg
To disable trace, set MQJMS_TRACE_LEVEL to off. By default, trace is output to a file named mqjms.trc in the current working directory. You can redirect it to a different directory by using the Java property MQJMS_TRACE_DIR. For example:
java -DMQJMS_TRACE_LEVEL=base -DMQJMS_TRACE_DIR=/somepath/tracedir MyJMSProg
38
Using Java
Logging
The WebSphere MQ JMS log facility is provided to report serious problems, particularly those that might indicate configuration errors rather than programming errors. By default, log output is sent to the System.err stream, which usually appears on the stderr of the console in which the JVM is run. You can redirect the output to a file by using a Java property that specifies the new location, for example:
java -DMQJMS_LOG_DIR=/mydir/forlogs MyJMSProg
The utility script runjms, in the bin directory of the WebSphere MQ JMS installation, sets this property to:
<MQ_JAVA_DATA_PATH>/log
where MQ_JAVA_DATA_PATH is set, on Windows systems, to the path to your WebSphere MQ Java installation. On other platforms you need to set this environment variable. When the log is redirected to a file, it is output in a binary form. To view the log, the utility formatLog (formatLog.bat on Windows systems) is provided, which converts the file to plain text format. The utility is stored in the bin directory of your WebSphere MQ JMS installation. Run the conversion as follows:
formatLog <inputfile> <outputfile>
Chapter 4. Using WebSphere MQ classes for Java Message Service (WebSphere MQ JMS)
39
Logging
40
Using Java
where: -t -v -cfg config_filename Enables trace (default is trace off) Produces verbose output (default is terse output) Names an alternative configuration file (see Configuration on page 42)
A command prompt is displayed, which indicates that the tool is ready to accept administration commands. This prompt initially appears as:
InitCtx>
41
where test.scp is a script file that contains administration commands (see Administration commands on page 44). The last command in the file must be the END command.
Configuration
Configure the administration tool with values for the following three properties: INITIAL_CONTEXT_FACTORY The service provider that the tool uses. There are three explicitly supported values for this property: v com.sun.jndi.ldap.LdapCtxFactory (for LDAP) v com.sun.jndi.fscontext.RefFSContextFactory (for file system context) v com.ibm.websphere.naming.WsnInitialContextFactory (to work with WebSphere Application Servers CosNaming repository) On z/OS and OS/390, com.ibm.jndi.LDAPCtxFactory is also supported and provides access to an LDAP server. However, this is incompatible with com.sun.jndi.ldap.LdapCtxFactory, in that objects created using one InitialContextFactory cannot be read or modified using the other. You can also use an InitialContextFactory that is not in the list above. See Using an unlisted InitialContextFactory on page 43 for more details. PROVIDER_URL The URL of the sessions initial context; the root of all JNDI operations carried out by the tool. Three forms of this property are supported: v ldap://hostname/contextname (for LDAP) v file:[drive:]/pathname (for file system context) v iiop://hostname[:port] /[?TargetContext=ctx] (to access base WebSphere Application Server CosNaming namespace) SECURITY_AUTHENTICATION Whether JNDI passes security credentials to your service provider. This property is used only when an LDAP service provider is used. This property can take one of three values: v none (anonymous authentication) v simple (simple authentication) v CRAM-MD5 (CRAM-MD5 authentication mechanism) If a valid value is not supplied, the property defaults to none. See Security on page 43 for more details about security with the administration tool. These properties are set in a configuration file. When you invoke the tool, you can specify this configuration by using the -cfg command-line parameter, as described
42
Using Java
Configuration
in Invoking the administration tool on page 41. If you do not specify a configuration file name, the tool attempts to load the default configuration file (JMSAdmin.config). It looks for this file first in the current directory, and then in the <MQ_JAVA_INSTALL_PATH>/bin directory, where <MQ_JAVA_INSTALL_PATH> is the path to your WebSphere MQ JMS installation. The configuration file is a plain-text file that consists of a set of key-value pairs, separated by =. This is shown in the following example:
#Set the service provider INITIAL_CONTEXT_FACTORY=com.sun.jndi.ldap.LdapCtxFactory #Set the initial context PROVIDER_URL=ldap://polaris/o=ibm_us,c=us #Set the authentication type SECURITY_AUTHENTICATION=none
(A # in the first column of the line indicates a comment, or a line that is not used.) The installation comes with a sample configuration file that is called JMSAdmin.config, and is found in the <MQ_JAVA_INSTALL_PATH>/bin directory. Edit this file to suit the setup of your system.
Security
You need to understand the effect of the SECURITY_AUTHENTICATION property described in Configuration on page 42. v If you set this parameter to none, JNDI does not pass any security credentials to the service provider, and anonymous authentication is performed. v If you set the parameter to either simple or CRAM-MD5, security credentials are passed through JNDI to the underlying service provider. These security credentials are in the form of a user distinguished name (User DN) and password. If security credentials are required, you are prompted for these when the tool initializes. Avoid this by setting the PROVIDER_USERDN and PROVIDER_PASSWORD properties in the JMSAdmin configuration file.
43
Configuration
Note: If you do not use these properties, the text typed, including the password, is echoed to the screen. This may have security implications. The tool does no authentication itself; the task is delegated to the LDAP server. The LDAP server administrator must set up and maintain access privileges to different parts of the directory. If authentication fails, the tool displays an appropriate error message and terminates. More detailed information about security and JNDI is in the documentation at Suns Java web site (http://java.sun.com).
Administration commands
When the command prompt is displayed, the tool is ready to accept commands. Administration commands are generally of the following form:
verb [param]*
where verb is one of the administration verbs listed in Table 7. All valid commands consist of at least one (and only one) verb, which appears at the beginning of the command in either its standard or short form. The parameters a verb can take depend on the verb. For example, the END verb cannot take any parameters, but the DEFINE verb can take any number of parameters. Details of the verbs that take at least one parameter are discussed in later sections of this chapter.
Table 7. Administration verbs Verb ALTER DEFINE DISPLAY DELETE CHANGE Short form ALT DEF DIS DEL CHG Description Change at least one of the properties of a given administered object Create and store an administered object, or create a new subcontext Display the properties of one or more stored administered objects, or the contents of the current context Remove one or more administered objects from the namespace, or remove an empty subcontext Alter the current context, allowing the user to traverse the directory namespace anywhere below the initial context (pending security clearance) Make a copy of a stored administered object, storing it under an alternative name Alter the name under which an administered object is stored
COPY MOVE
CP MV
44
Using Java
Administration commands
Table 7. Administration verbs (continued) Verb END Short form Description Close the administration tool
Verb names are not case-sensitive. Usually, to terminate commands, you press the carriage return key. However, you can override this by typing the + symbol directly before the carriage return. This enables you to enter multiline commands, as shown in the following example:
DEFINE Q(BookingsInputQueue) + QMGR(QM.POLARIS.TEST) + QUEUE(BOOKINGS.INPUT.QUEUE) + PORT(1415) + CCSID(437)
Lines beginning with one of the characters *, #, or / are treated as comments, or lines that are ignored.
Manipulating subcontexts
Use the verbs CHANGE, DEFINE, DISPLAY and DELETE to manipulate directory namespace subcontexts. Their use is described in Table 8.
Table 8. Syntax and description of commands used to manipulate subcontexts Command syntax DEFINE CTX(ctxName) Description Attempts to create a new child subcontext of the current context, having the name ctxName. Fails if there is a security violation, if the subcontext already exists, or if the name supplied is not valid. Displays the contents of the current context. Administered objects are annotated with a, subcontexts with [D]. The Java type of each object is also displayed. Attempts to delete the current contexts child context having the name ctxName. Fails if the context is not found, is non-empty, or if there is a security violation. Alters the current context, so that it now refers to the child context having the name ctxName. One of two special values of ctxName can be supplied: =UP moves to the current contexts parent =INIT moves directly to the initial context Fails if the specified context does not exist, or if there is a security violation.
DISPLAY CTX
DELETE CTX(ctxName)
CHANGE CTX(ctxName)
Object types
Table 9 on page 46 shows the eight types of administered objects. The Keyword column shows the strings that you can substitute for TYPE in the commands shown
Chapter 5. Using the WebSphere MQ JMS administration tool
45
Description The WebSphere MQ implementation of the JMS ConnectionFactory interface. This represents a factory object for creating connections in the both the point-to-point and publish/subscribe domains. The WebSphere MQ implementation of the JMS QueueConnectionFactory interface. This represents a factory object for creating connections in the point-to-point domain. The WebSphere MQ implementation of the JMS TopicConnectionFactory interface. This represents a factory object for creating connections in the publish/subscribe domain. The WebSphere MQ implementation of the JMS Queue interface. This represents a destination for messages in the point-to-point domain. The WebSphere MQ implementation of the JMS Topic interface. This represents a destination for messages in the publish/subscribe domain. The WebSphere MQ implementation of the JMS XAConnectionFactory interface. This represents a factory object for creating connections in both the point-to-point and publish/subscribe domains, and where the connections use the XA versions of JMS classes. The WebSphere MQ implementation of the JMS XAQueueConnectionFactory interface. This represents a factory object for creating connections in the point-to-point domain that use the XA versions of JMS classes. The WebSphere MQ implementation of the JMS XATopicConnectionFactory interface. This represents a factory object for creating connections in the publish/subscribe domain that use the XA versions of JMS classes.
| | | | | |
MQConnectionFactory
CF
MQQueueConnectionFactory
QCF
MQTopicConnectionFactory
TCF
MQQueue
MQTopic
| | | | | | | |
MQXAConnectionFactory12
XACF
MQXAQueueConnectionFactory2
XAQCF
MQXATopicConnectionFactory2
XATCF
46
Using Java
Keyword WSQCF
Description The WebSphere MQ implementation of the JMS QueueConnectionFactory interface. This represents a factory object for creating connections in the point-to-point domain that use the XA versions of the JMS classes with a version of WebSphere Application Server before Version 5. The WebSphere MQ implementation of the JMS TopicConnectionFactory interface. This represents a factory object for creating connections in the publish/subscribe domain that use the XA versions of the JMS classes with a version of WebSphere Application Server before Version 5.
| | |
JMSWrapXATopicConnectionFactory3 WSTCF
| | |
1. This object type applies to JMS 1.1 only.
2. These classes are provided for use by vendors of application servers. They are unlikely to be directly useful to application programmers.
| |
3. Use this style of ConnectionFactory if you want your JMS sessions to participate in global transactions that are coordinated by a version of WebSphere Application Server before Version 5.
DISPLAY TYPE(name)
DELETE TYPE(name)
47
Creating objects
Objects are created and stored in a JNDI namespace using the following command syntax:
DEFINE TYPE(name) [property]*
That is, the DEFINE verb, followed by a TYPE(name) administered object reference, followed by zero or more properties (see Properties on page 49).
Note that, although the object name supplied (testQueue) does not have a prefix, the tool automatically adds one to ensure compliance with the LDAP naming convention. Likewise, submitting the command DISPLAY Q(testQueue) also causes this prefix to be added.
48
Using Java
Properties
A property consists of a name-value pair in the format:
PROPERTY_NAME(property_value)
Property names are not case-sensitive, and are restricted to the set of recognized names shown in Table 11. This table also shows the valid property values for each property.
Table 11. Property names and valid values Property BROKERCCDSUBQ1 BROKERCCSUBQ BROKERCONQ Short form CCDSUB CCSUB BCON
1
Valid values (defaults in bold) v SYSTEM.JMS.D.CC.SUBSCRIBER.QUEUE v Any string v SYSTEM.JMS.ND.CC.SUBSCRIBER.QUEUE v Any string Any string v SYSTEM.JMS.D.SUBSCRIBER.QUEUE v Any string v SYSTEM.BROKER.DEFAULT.STREAM v Any string Any string v SYSTEM.JMS.ND.SUBSCRIBER.QUEUE v Any string v V1 - To use the WebSphere MQ broker. Also to use the WebSphere MQ Integrator V2 or WebSphere MQ Event Broker brokers in compatibility mode. v V2 - To use the WebSphere MQ Integrator V2 or WebSphere MQ Event Broker brokers in native mode Any positive integer Any string v v v v SAFE ASPROP NONE STRONG
CCS CHAN CL
v 3600000 v Any positive integer Any string Any string v BASIC - No authentication, username authentication, or password authentication v CERTIFICATE - Public key certificate authentication See The ENCODING property on page 57
| | |
DIRECTAUTH
ENCODING
ENC
49
FAILIFQUIESCE
FIQ
HOSTNAME
HOST LA
| | | | | | | | | | | | | | | | | | | | | | | | |
LOCALADDRESS
| |
MSGSELECTION
MSEL
50
Using Java
| | | | | | | | | | | | | | |
MULTICAST
PERSISTENCE
PER
POLLINGINT PORT
PINT
PRIORITY
| | | |
PROXYHOSTNAME PROXYPORT PUBACKINT QMANAGER QUEUE RECEXIT RECEXITINIT SECEXIT SECEXITINIT SENDEXIT SENDXITINIT
PHOST PPORT PAI QMGR QU RCX RCXI SCX SCXI SDX SDXI SSUBS
| | | | |
SPARSESUBS
51
SPEER SRI SS
SYNCPOINTALLGETS TARGCLIENT
SPAG TC
TEMPMODEL
| |
| |
USECONNPOOLING UCP
Notes: 1. In certain environments, specifying the same queue name for the BROKERCCDSUBQ and BROKERDURSUBQ properties of an MQTopic object can cause a JMSException to be thrown. You are advised, therefore, to specify different queue names for these properties.
Many of the properties are relevant only to a specific subset of the object types. Table 12 on page 53 shows for each property which object types are valid, and gives a brief description of each property. The object types are identified using keywords; refer to Table 9 on page 46 for an explanation of these. Numbers refer to notes at the end of the table. See also Property dependencies on page 56. Appendix A, Mapping between administration tool properties and programmable properties, on page 457 shows the relationship between properties set by the tool and programmable properties.
52
Using Java
BROKERCCSUBQ
BROKERCONQ BROKERDURSUBQ
Y Y
Y Y Y
Y Y Y
Y2 Y Y Y Y Y Y
Y2 Y Y Y Y
Y Y Y Y
Y2 Y Y
2
Y Y
Y2 Y Y
2
Y Y Y Y
Y Y
Y Y
LOCALADDRESS
MSGBATCHSZ
53
MSGSELECTION
Y Y Y
Y2
Y2
QMANAGER QUEUE RECEXIT RECEXITINIT SECEXIT SECEXITINIT SENDEXIT SENDEXITINIT SPARSESUBS SSLCIPHERSUITE
Y Y
Y Y Y Y Y Y Y Y
Y Y Y Y Y Y
Y Y Y Y Y Y Y
54
Using Java
STATREFRESHINT
SUBSTORE
SYNCPOINTALLGETS Y TARGCLIENT5
Y Y Y
TEMPMODEL TEMPQPREFIX
Y Y
Y Y
TOPIC TRANSPORT4 Y2 Y Y2
USECONNPOOLING
55
Notes: 1. This object type applies to JMS 1.1 only. 2. Only the BROKERVER, CLIENTID, DESCRIPTION, HOSTNAME, PORT, and TRANSPORT properties are supported for a TopicConnectionFactory object, or a JMS 1.1 domain independent ConnectionFactory object, when connecting directly to WebSphere MQ Event Broker over TCP/IP. 3. See Appendix D, Connecting to other products, on page 469. 4. HOSTNAME, PORT, and TRANSPORT are also used to identify if you are connecting to WebSphere MQ Event Broker and the brokers IP hostname and listening port. For more information about using WebSphere MQ Event Broker, see Chapter 11, Writing WebSphere MQ JMS publish/subscribe applications, on page 213. 5. The TARGCLIENT property indicates whether the WebSphere MQ RFH2 format is used to exchange information with target applications. The MQJMS_CLIENT_JMS_COMPLIANT constant indicates that the RFH2 format is used to send information. Applications that use WebSphere MQ JMS understand the RFH2 format. Set the MQJMS_CLIENT_JMS_COMPLIANT constant when you exchange information with a target WebSphere MQ JMS application. The MQJMS_CLIENT_NONJMS_MQ constant indicates that the RFH2 format is not used to send information. Typically, this value is used for an existing WebSphere MQ application (that is, one that does not handle RFH2). 6. For XACF, XAQCF, XATCF, WSQCF, and WSTCF objects, only the BIND transport type is allowed.
Property dependencies
Some properties have dependencies on each other. This might mean that it is meaningless to supply a property unless another property is set to a particular value. The specific property groups where this can occur are v Client properties v Properties for connecting to WebSphere MQ Event Broker v Exit initialization strings Client properties Some properties are only relevant to a connection with the TRANSPORT property set to the value CLIENT. If this property is not explicitly set on a connection factory to one of the values CLIENT or DIRECT, the transport used on connections provided by the factory is WebSphere MQ Bindings. Consequently, none of the client properties on this connection factory can be configured. These are: v HOST v PORT v CHANNEL v CCSID v RECEXIT v RECEXITINIT v SECEXIT v SECEXITINIT v SENDEXIT v SENDEXITINIT v SSLCIPHERSUITE
56
Using Java
In this string: v N denotes normal v R denotes reversed v 3 denotes z/OS v The first character represents integer encoding v The second character represents decimal encoding v The third character represents floating-point encoding This provides a set of twelve possible values for the ENCODING property.
Chapter 5. Using the WebSphere MQ JMS administration tool
57
SSL properties
When you specify TRANSPORT(CLIENT), you can enable Secure Sockets Layer (SSL) encrypted communication using the SSLCIPHERSUITE property. Set this property to a valid CipherSuite provided by your JSSE provider; it must match the CipherSpec named on the SVRCONN channel named by the CHANNEL property. However, CipherSpecs (as specified on the SVRCONN channel) and CipherSuites (as specified on ConnectionFactory objects) use different naming schemes to represent the same SSL encryption algorithms. If a recognized CipherSpec name is specified on the SSLCIPHERSUITE property, JMSAdmin issues a warning and maps the CipherSpec to its equivalent CipherSuite. See Appendix H, SSL CipherSuites supported by WebSphere MQ, on page 487 for a list of CipherSpecs recognized by WebSphere MQ and JMSAdmin. The SSLPEERNAME matches the format of the SSLPEER parameter, which can be set on channel definitions. It is a list of attribute name and value pairs separated by commas or semicolons. For example:
SSLPEERNAME(CN=QMGR.*, OU=IBM, OU=WEBSPHERE)
The set of names and values makes up a distinguished name. For more details about distinguished names and their use with WebSphere MQ, see the WebSphere MQ Security book. The example given checks the identifying certificate presented by the server at connect-time. For the connection to succeed, the certificate must have a Common Name beginning QMGR., and must have at least two Organizational Unit names, the first of which is IBM and the second WEBSPHERE. Checking is case-insensitive. If SSLPEERNAME is not set, no such checking is performed. SSLPEERNAME is ignored if SSLCIPHERSUITE is not specified. The SSLCRL property specifies zero or more CRL (Certificate Revocation List) servers. Use of this property requires a JVM at Java 2 v1.4. This is a space-delimited list of entries of the form:
ldap://hostname:[port]
optionally followed by a single /. If port is omitted, the default LDAP port of 389 is assumed. At connect-time, the SSL certificate presented by the server is checked against the specified CRL servers. See the WebSphere MQ Security book for more about CRL security. If SSLCRL is not set, no such checking is performed. SSLCRL is ignored if SSLCIPHERSUITE is not specified.
58
Using Java
Unknown property
InitCtx/cn=Trash> DEFINE QCF(testQCF) PIZZA(ham and mushroom) Unable to create a valid object, please check the parameters supplied Unknown property: PIZZA
| | | | | | | | | | | | | |
The following are examples of error conditions that might arise on Windows when looking up JNDI administered objects from a JMS client. If your JMS application is running in a WebSphere Application Server environment, these error conditions might occur only if you are using a version of WebSphere Application Server before Version 5. 1. If you are using the WebSphere JNDI provider, com.ibm.websphere.naming.WsnInitialContextFactory, you must use a forward slash (/) to access administered objects defined in sub-contexts; for example, jms/MyQueueName. If you use a backslash (\), an InvalidNameException is thrown. 2. If you are using the Sun JNDI provider, com.sun.jndi.fscontext.RefFSContextFactory, you must use a backslash (\) to access administered objects defined in sub-contexts; for example, ctx1\\fred. If you use a forward slash (/), a NameNotFoundException is thrown.
59
60
Using Java
Chapter 7. Writing WebSphere MQ base Java programs . . . . . . . . . . . . . . . Should I write applets or applications? . . . . . Connection differences. . . . . . . . . . . Client connections . . . . . . . . . . . Bindings mode . . . . . . . . . . . . Defining which connection to use . . . . . . Specifying a range of ports for client connections Example code fragments . . . . . . . . . . Example applet code . . . . . . . . . . Example application code . . . . . . . . Operations on queue managers . . . . . . . . Setting up the WebSphere MQ environment . . Connecting to a queue manager . . . . . . Accessing queues and processes . . . . . . . Handling messages . . . . . . . . . . . . Handling errors . . . . . . . . . . . . . Getting and setting attribute values . . . . . . Multithreaded programs . . . . . . . . . . Writing user exits . . . . . . . . . . . . Connection pooling . . . . . . . . . . . . Controlling the default connection pool . . . . The default connection pool and multiple components . . . . . . . . . . . . . Supplying a different connection pool . . . . Supplying your own ConnectionManager . . . JTA/JDBC coordination using WebSphere MQ base Java . . . . . . . . . . . . . . . . . Installation . . . . . . . . . . . . . Installation on Windows systems . . . . . Installation on other platforms . . . . . . Usage . . . . . . . . . . . . . . . Known problems and limitations . . . . . . Secure Sockets Layer (SSL) support . . . . . . Enabling SSL . . . . . . . . . . . . . Using the distinguished name of the queue manager . . . . . . . . . . . . . . Using certificate revocation lists . . . . . . Supplying a customized SSLSocketFactory . . . Error handling when using SSL. . . . . . . Compiling and testing WebSphere MQ base Java programs . . . . . . . . . . . . . . . Running WebSphere MQ base Java applets . . . Running WebSphere MQ base Java applications Tracing WebSphere MQ base Java programs . .
67 67 67 67 68 68 68 69 69 72 74 74 75 75 76 77 78 79 79 80 81 83 84 85 87 87 87 87 88 88 89 90 90 91 92 92 93 93 94 94
Chapter 8. Environment-dependent behavior . . 95 Core details . . . . . . . . . . . . . . 95 Restrictions and variations for core classes . . . . 96 MQGMO_* values . . . . . . . . . . . 96
Copyright IBM Corp. 1997, 2004
MQ base Java . . . . . . . . 101 . . . . . . . . 102 . . . . . . . . 102 . . . . . . . . 103 . . . . . . . . 104 . . . . . . . . 104 . . . . . . . . 106 . . . . . . . . 107 . . . . . . . . 107 . . . . . . . . 107 . . . . . . . . 109 . . . . . . . . 109 . . . . . . . . 109 . . . . . . . . 110 . . . . . . . . 110 . . . . . . . . 114 . . . . . . . . 114 . . . . . . . . 117 . . . . . . . . 117 . . . . . . . . 117 . . . . . . . . 118 . . . . . . . . 119 . . . . . . . . 119 . . . . . . . . 122 . . . . . . . . 123 . . . . . . . . 123 . . . . . . . . 124 . . . . . . . . 124 . . . . . . . . 126 . . . . . . . . 126 . . . . . . . . 134 . . . . . . . . 134 . . . . . . . . 144 . . . . . . . . 144 . . . . . . . . 146 . . . . . . . . 146 . . . . . . . . 146 . . . . . . . . 147 . . . . . . . . 147 . . . . . . . . 147 . . . . . . . . 148 . . . . . . . . 149
61
Constructors . . . . . . MQProcess . . . . . . . Constructors . . . . . . Methods . . . . . . . MQPutMessageOptions . . . Variables . . . . . . . Constructors . . . . . . MQQueue . . . . . . . Constructors . . . . . . Methods . . . . . . . MQQueueManager . . . . Variables . . . . . . . Constructors . . . . . . Methods . . . . . . . MQSimpleConnectionManager Variables . . . . . . . Constructors . . . . . . Methods . . . . . . . MQC . . . . . . . . . MQPoolServicesEventListener . Methods . . . . . . . MQConnectionManager . . . MQReceiveExit . . . . . . Methods . . . . . . . MQSecurityExit . . . . . Methods . . . . . . . MQSendExit . . . . . . . Methods . . . . . . . ManagedConnection . . . . Methods . . . . . . . ManagedConnectionFactory . Methods . . . . . . . ManagedConnectionMetaData . Methods . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
149 150 150 150 152 152 154 155 155 155 163 163 163 166 176 176 176 176 179 180 180 181 182 182 184 184 186 186 188 188 191 191 193 193
62
Using Java
63
Advantages of Java
If you place your applet on a Web server that is accessible outside the corporate firewall, anyone on the Internet can download and use your application. This means that you can get messages into your WebSphere MQ system from anywhere on the Internet. This opens the door to building a whole new set of Internet accessible service, support, and electronic commerce applications.
These verbs all take, as a parameter, a handle to the WebSphere MQ object on which they are to operate. Because Java is object-oriented, the Java programming interface turns this round. Your program consists of a set of WebSphere MQ objects, which you act upon by calling methods on those objects. When you use the procedural interface, you disconnect from a queue manager by using the call MQDISC(Hconn, CompCode, Reason), where Hconn is a handle to the queue manager. In the Java interface, the queue manager is represented by an object of class MQQueueManager. You disconnect from the queue manager by calling the disconnect() method on that class.
// declare an object of type queue manager MQQueueManager queueManager=new MQQueueManager(); ... // do something... ... // disconnect from the queue manager queueManager.disconnect();
To compile Java applications on the iSeries and AS/400 platforms, you must first install: v The AS/400 Developer Kit for Java, 5769-JV1 v The Qshell Interpreter, OS/400 (5769-SS1) Option 30
64
Using Java
65
66
Using Java
Connection differences
The way you program for WebSphere MQ classes for Java has some dependencies on the connection modes you want to use.
Client connections
When WebSphere MQ classes for Java is used as a client, it is similar to the WebSphere MQ C client, but has the following differences: v It supports only TCP/IP. v It does not support connection tables. v It does not read any WebSphere MQ environment variables at startup. v Information that would be stored in a channel definition and in environment variables is stored in a class called Environment. Alternatively, this information can be passed as parameters when the connection is made. v Error and exception conditions are written to a log specified in the MQException class. The default error destination is the Java console.
Copyright IBM Corp. 1997, 2004
67
Connection differences
The WebSphere MQ classes for Java clients do not support the MQBEGIN verb or fast bindings. For general information on WebSphere MQ clients, see the WebSphere MQ Clients book.
Bindings mode
The bindings mode of WebSphere MQ classes for Java differs from the client modes in the following ways: v Most of the parameters provided by the MQEnvironment class are ignored v The bindings support the MQBEGIN verb and fast bindings into the WebSphere MQ queue manager Note: WebSphere MQ for iSeries and WebSphere MQ for z/OS do not support the use of MQBEGIN to initiate global units of work that are coordinated by the queue manager.
MQEnvironment.hostname Set the value of this variable follows: v For client connections, set this to the host name of the WebSphere MQ server to which you want to connect v For bindings mode, set this to null | | | | | | | | | | | | | | | | | | | |
v You can set the localAddressSetting variable in the MQEnvironment class. Here is an example:
MQEnvironment.localAddressSetting = "9.20.0.1(2000,3000)";
In each of these examples, when the application connects to a queue manager subsequently, the application binds to a local IP address and port number in the range 9.20.0.1(2000) to 9.20.0.1(3000). Connection errors might occur if you restrict the range of ports. If an error occurs, an MQException is thrown containing the WebSphere MQ reason code, MQRC_Q_MGR_NOT_AVAILABLE. An error might occur if all the ports in the
68
Using Java
Connection differences
| | specified range are in use, or if a specified IP address, host name, or port number is not valid; a negative port number, for example.
69
Example code
// =========================================================================== // // Licensed Materials - Property of IBM // // 5639-C34 // // (c) Copyright IBM Corp. 1995,2002 // // =========================================================================== // WebSphere MQ Client for Java sample applet // // This sample runs as an applet using the appletviewer and HTML file, // using the command :// appletviewer MQSample.html // Output is to the command line, NOT the applet viewer window. // // Note. If you receive WebSphere MQ error 2 reason 2059 and you are sure your // WebSphere MQ and TCP/IP setup is correct, // you should click on the "Applet" selection in the Applet viewer window // select properties, and change "Network access" to unrestricted. import com.ibm.mq.*; // Include the WebSphere MQ classes for Java package public class MQSample extends java.applet.Applet { private String hostname = "your_hostname"; private String channel = "server_channel"; // // // // // // // // // // define the name of your host to connect to define name of channel for client to use Note. assumes WebSphere MQ Server is listening on the default TCP/IP port of 1414 define name of queue manager object to connect to.
// When the class is called, this initialization is done first. public void init() { // Set up WebSphere MQ environment MQEnvironment.hostname = hostname; MQEnvironment.channel = channel;
// Could have put the // hostname & channel // string directly here!
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,//Set TCP/IP or server MQC.TRANSPORT_MQSERIES);//Connection } // end of init Figure 1. WebSphere MQ classes for Java example applet (Part 1 of 3)
70
Using Java
Example code
public void start() { try { // Create a connection to the queue manager qMgr = new MQQueueManager(qManager); // Set up the options on the queue we wish to open... // Note. All WebSphere MQ Options are prefixed with MQC in Java. int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT ; // Now specify the queue that we wish to open, and the open options... MQQueue system_default_local_queue = qMgr.accessQueue("SYSTEM.DEFAULT.LOCAL.QUEUE", openOptions); // Define a simple WebSphere MQ message, and write some text in UTF format.. MQMessage hello_world = new MQMessage(); hello_world.writeUTF("Hello World!"); // specify the message options... MQPutMessageOptions pmo = new MQPutMessageOptions(); // // // // accept the defaults, same as MQPMO_DEFAULT constant
// put the message on the queue system_default_local_queue.put(hello_world,pmo); // get the message back again... // First define a WebSphere MQ message buffer to receive the message into.. MQMessage retrievedMessage = new MQMessage(); retrievedMessage.messageId = hello_world.messageId; // Set the get message options.. MQGetMessageOptions gmo = new MQGetMessageOptions(); // get the message off the queue.. system_default_local_queue.get(retrievedMessage, gmo); // And prove we have the message by displaying the UTF message text String msgText = retrievedMessage.readUTF(); System.out.println("The message is: " + msgText); // Close the queue system_default_local_queue.close(); // Disconnect from the queue manager qMgr.disconnect(); } // If an error has occurred in the above, try to identify what went wrong. // Was it a WebSphere MQ error? Figure 1. WebSphere MQ classes for Java example applet (Part 2 of 3)
Chapter 7. Writing WebSphere MQ base Java programs
71
Example code
catch (MQException ex) { System.out.println("A WebSphere MQ error occurred : Completion code " + ex.completionCode + " Reason code " + ex.reasonCode); } // Was it a Java buffer space error? catch (java.io.IOException ex) { System.out.println("An error occurred whilst writing to the message buffer: " + ex); } } // end of start } // end of sample
72
Using Java
Example code
// // // // // // // // ====================================================================== Licensed Materials - Property of IBM 5639-C34 (c) Copyright IBM Corp. 1995, 2002 ====================================================================== WebSphere MQ classes for Java sample application This sample runs as a Java application using the command :- java MQSample // Include the WebSphere MQ classes for Java package
import com.ibm.mq.*;
public class MQSample { private String qManager = "your_Q_manager"; private MQQueueManager qMgr; public static void main(String args[]) { new MQSample(); } public MQSample() { try {
// // // //
define name of queue manager to connect to. define a queue manager object
// Create a connection to the queue manager qMgr = new MQQueueManager(qManager); // Set up the options on the queue we wish to open... // Note. All WebSphere MQ Options are prefixed with MQC in Java. int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT ; // Now specify the queue that we wish to open, // and the open options... MQQueue system_default_local_queue = qMgr.accessQueue("SYSTEM.DEFAULT.LOCAL.QUEUE", openOptions); // Define a simple WebSphere MQ message, and write some text in UTF format.. MQMessage hello_world = new MQMessage(); hello_world.writeUTF("Hello World!"); // specify the message options... MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the // defaults, // same as MQPMO_DEFAULT Figure 2. WebSphere MQ classes for Java example application (Part 1 of 2)
73
74
Using Java
To specify the channel name and host name, use the following code:
MQEnvironment.hostname = "host.domain.com"; MQEnvironment.channel = "java.client.channel";
By default, the Java clients attempt to connect to a WebSphere MQ listener at port 1414. To specify a different port, use the code:
MQEnvironment.port = nnnn;
The user ID and password default to blanks. To specify a non-blank user ID or password, use the code:
MQEnvironment.userID = "uid"; MQEnvironment.password = "pwd"; // equivalent to env var MQ_USER_ID // equivalent to env var MQ_PASSWORD
To disconnect from a queue manager, call the disconnect() method on the queue manager:
queueManager.disconnect();
If you call the disconnect method, all open queues and processes that you have accessed through that queue manager are closed. However, it is good programming practice to close these resources explicitly when you finish using them. To do this, use the close() method. The commit() and backout() methods on a queue manager replace the MQCMIT and MQBACK calls that are used with the procedural interface.
The options parameter is the same as the Options parameter in the MQOPEN call. The accessQueue method returns a new object of class MQQueue.
75
With WebSphere MQ classes for Java, you can also create a queue by using the MQQueue constructor. The parameters are exactly the same as for the accessQueue method, with the addition of a queue manager parameter. For example:
MQQueue queue = new MQQueue(queueManager, "qName", MQC.MQOO_OUTPUT, "qMgrName", "dynamicQName", "altUserId");
Constructing a queue object in this way enables you to write your own subclasses of MQQueue. To access a process, use the accessProcess method in place of accessQueue. This method does not have a dynamic queue name parameter, because this does not apply to processes. The accessProcess method returns a new object of class MQProcess. When you have finished using the process object, use the close() method to close it, as in the following example:
process.close();
With WebSphere MQ classes for Java, you can also create a process by using the MQProcess constructor. The parameters are exactly the same as for the accessProcess method, with the addition of a queue manager parameter. Constructing a process object in this way enables you to write your own subclasses of MQProcess.
Handling messages
Put messages onto queues using the put() method of the MQQueue class. You get messages from queues using the get() method of the MQQueue class. Unlike the procedural interface, where MQPUT and MQGET put and get arrays of bytes, the Java programming language puts and gets instances of the MQMessage class. The MQMessage class encapsulates the data buffer that contains the actual message data, together with all the MQMD (message descriptor) parameters that describe that message. To build a new message, create a new instance of the MQMessage class, and use the writeXXX methods to put data into the message buffer. When the new message instance is created, all the MQMD parameters are automatically set to their default values, as defined in the WebSphere MQ Application Programming Reference. The put() method of MQQueue also takes an instance of the MQPutMessageOptions class as a parameter. This class represents the MQPMO structure. The following example creates a message and puts it onto a queue:
// Build a new message containing my age followed by my name MQMessage myMessage = new MQMessage(); myMessage.writeInt(25); String name = "Charlie Jordan";
76
Using Java
Message handling
myMessage.writeInt(name.length()); myMessage.writeBytes(name); // Use the default put message options... MQPutMessageOptions pmo = new MQPutMessageOptions(); // put the message! queue.put(myMessage,pmo);
The get() method of MQQueue returns a new instance of MQMessage, which represents the message just taken from the queue. It also takes an instance of the MQGetMessageOptions class as a parameter. This class represents the MQGMO structure. You do not need to specify a maximum message size, because the get() method automatically adjusts the size of its internal buffer to fit the incoming message. Use the readXXX methods of the MQMessage class to access the data in the returned message. The following example shows how to get a message from a queue:
// Get a message from the queue MQMessage theMessage = new MQMessage(); MQGetMessageOptions gmo = new MQGetMessageOptions(); queue.get(theMessage,gmo); // has default values // Extract the message data int age = theMessage.readInt(); int strLen = theMessage.readInt(); byte[] strData = new byte[strLen]; theMessage.readFully(strData,0,strLen); String name = new String(strData,0);
You can alter the number format that the read and write methods use by setting the encoding member variable. You can alter the character set to use for reading and writing strings by setting the characterSet member variable. See MQMessage on page 126 for more details. Note: The writeUTF() method of MQMessage automatically encodes the length of the string as well as the Unicode bytes it contains. When your message will be read by another Java program (using readUTF()), this is the simplest way to send string information.
Handling errors
Methods in the Java interface do not return a completion code and reason code. Instead, they throw an exception whenever the completion code and reason code resulting from a WebSphere MQ call are not both zero. This simplifies the program logic so that you do not have to check the return codes after each call to WebSphere MQ. You can decide at which points in your program you want to deal with the possibility of failure. At these points, you can surround your code with try and catch blocks, as in the following example:
try { myQueue.put(messageA,putMessageOptionsA); myQueue.put(messageB,putMessageOptionsB); } catch (MQException ex) {
Chapter 7. Writing WebSphere MQ base Java programs
77
Error handling
// This block of code is only executed if one of // the two put methods gave rise to a non-zero // completion code or reason code. System.out.println("An error occurred during the put operation:" + "CC = " + ex.completionCode + "RC = " + ex.reasonCode); System.out.println("Cause exception:" + ex.getCause() ); }
The WebSphere MQ call reason codes reported back in Java exceptions are documented in a chapter called Return Codes in the WebSphere MQ Application Programming Reference. Sometimes the reason code does not convey all details associated with the error. This can occur if WebSphere MQ uses services provided by another product (for example, a JSSE implementation) that throws a java.lang.Exception to WebSphere MQ Java. In this case, the method MQException.getCause() retrieves the underlying java.lang.Exception that caused the error.
| |
78
Using Java
Multithreaded programs
Multithreaded programs are hard to avoid in Java. Consider a simple program that connects to a queue manager and opens a queue at startup. The program displays a single button on the screen. When a user presses that button, the program fetches a message from the queue. The Java runtime environment is inherently multithreaded. Therefore, your application initialization occurs in one thread, and the code that executes in response to the button press executes in a separate thread (the user interface thread). With the C based WebSphere MQ client, this would cause a problem, because handles cannot be shared across multiple threads. WebSphere MQ classes for Java relaxes this constraint, allowing a queue manager object (and its associated queue and process objects) to be shared across multiple threads. The implementation of WebSphere MQ classes for Java ensures that, for a given connection (MQQueueManager object instance), all access to the target WebSphere MQ queue manager is synchronized. A thread that wants to issue a call to a queue manager is blocked until all other calls in progress for that connection are complete. If you require simultaneous access to the same queue manager from multiple threads within your program, create a new MQQueueManager object for each thread that requires concurrent access. (This is equivalent to issuing a separate MQCONN call for each thread.)
79
Each exit is passed an MQChannelExit and an MQChannelDefinition object instance. These objects represent the MQCXP and MQCD structures defined in the procedural interface. For a Send exit, the agentBuffer parameter contains the data that is about to be sent. For a Receive exit or a Security exit, the agentBuffer parameter contains the data that has just been received. You do not need a length parameter, because the expression agentBuffer.length indicates the length of the array. For the Send and Security exits, your exit code should return the byte array that you want to send to the server. For a Receive exit, your exit code must return the modified data that you want WebSphere MQ classes for Java to interpret. The simplest possible exit body is:
{ return agentBuffer; }
If your program is to run as a downloaded Java applet, the security restrictions that apply mean that you cannot read or write any local files. If your exit needs a configuration file, you can place the file on the Web and use the java.net.URL class to download it and examine its contents.
Connection pooling
WebSphere MQ classes for Java provides additional support for applications that deal with multiple connections to WebSphere MQ queue managers. When a connection is no longer required, instead of destroying it, it can be pooled and later reused. This can provide a substantial performance enhancement for applications and middleware that connect serially to arbitrary queue managers. WebSphere MQ provides a default connection pool. Applications can activate or deactivate this connection pool by registering and deregistering tokens through the MQEnvironment class. If the pool is active when WebSphere MQ base Java constructs an MQQueueManager object, it searches this default pool and reuses
80
Using Java
Connection pooling
any suitable connection. When an MQQueueManager.disconnect() call occurs, the underlying connection is returned to the pool. Alternatively, applications can construct an MQSimpleConnectionManager connection pool for a particular use. Then, the application can either specify that pool during construction of an MQQueueManager object, or pass that pool to MQEnvironment for use as the default connection pool. | | | | | | | | | | To prevent connections from using too much resource, you can limit the total number of connections that an MQSimpleConnectionManager object can handle, and you can limit the size of the connection pool. Setting limits is useful if there are conflicting demands for connections within a JVM. By default, the getMaxConnections() method returns the value zero, which means that there is no limit to the number of connections that the MQSimpleConnectionManager object can handle. You can set a limit by using the setMaxConnections() method. If you set a limit and the limit is reached, a request for a further connection might cause an MQException to be thrown, with a reason code of MQRC_MAX_CONNS_LIMIT_REACHED. Also, WebSphere MQ base Java provides a partial implementation of the Java 2 Platform Enterprise Edition (J2EE) Connector Architecture. Applications running under a Java 2 v1.3 JVM with JAAS 1.0 (Java Authentication and Authorization Service) can provide their own connection pool by implementing the javax.resource.spi.ConnectionManager interface. Again, this interface can be specified on the MQQueueManager constructor, or specified as the default connection pool.
MQApp1 takes a list of local queue managers from the command line, connects to each in turn, and performs some operation. However, when the command line lists the same queue manager many times, it is more efficient to connect only once, and to reuse that connection many times. WebSphere MQ base Java provides a default connection pool that you can use to do this. To enable the pool, use one of the MQEnvironment.addConnectionPoolToken() methods. To disable the pool, use MQEnvironment.removeConnectionPoolToken(). The following example application, MQApp2, is functionally identical to MQApp1, but connects only once to each queue manager.
Chapter 7. Writing WebSphere MQ base Java programs
81
Connection pooling
import com.ibm.mq.*; public class MQApp2 { public static void main(String[] args) throws MQException { MQPoolToken token=MQEnvironment.addConnectionPoolToken(); for (int i=0; i<args.length; i++) { MQQueueManager qmgr=new MQQueueManager(args[i]); : : (do something with qmgr) : qmgr.disconnect(); } MQEnvironment.removeConnectionPoolToken(token); } }
The first bold line activates the default connection pool by registering an MQPoolToken object with MQEnvironment. The MQQueueManager constructor now searches this pool for an appropriate connection and only creates a connection to the queue manager if it cannot find an existing one. The qmgr.disconnect() call returns the connection to the pool for later reuse. These API calls are the same as the sample application MQApp1. The second highlighted line deactivates the default connection pool, which destroys any queue manager connections stored in the pool. This is important because otherwise the application would terminate with a number of live queue manager connections in the pool. This situation could cause errors that would appear in the queue manager logs. The default connection pool stores a maximum of ten unused connections, and keeps unused connections active for a maximum of five minutes. The application can alter this (for details, see Supplying a different connection pool on page 84). Instead of using MQEnvironment to supply an MQPoolToken, the application can construct its own:
MQPoolToken token=new MQPoolToken(); MQEnvironment.addConnectionPoolToken(token);
Some applications or middleware vendors provide subclasses of MQPoolToken in order to pass information to a custom connection pool. They can be constructed and passed to addConnectionPoolToken() in this way so that extra information can be passed to the connection pool.
82
Using Java
Connection pooling
83
Connection pooling
The connection that is forged during the first MQQueueManager constructor is stored in myConnMan after the qmgr.disconnect() call. The connection is then reused during the second call to the MQQueueManager constructor. The second line enables the MQSimpleConnectionManager. The last line disables MQSimpleConnectionManager, destroying any connections held in the pool. An MQSimpleConnectionManager is, by default, in MODE_AUTO, which is described later in this section. An MQSimpleConnectionManager allocates connections on a most-recently-used basis, and destroys connections on a least-recently-used basis. By default, a connection is destroyed if it has not been used for five minutes, or if there are more than ten unused connections in the pool. You can alter these values using: v MQSimpleConnectionManager.setTimeout() v MQSimpleConnectionManager.setHighThreshold() You can also set up an MQSimpleConnectionManager for use as the default connection pool, to be used when no Connection Manager is supplied on the MQQueueManager constructor.
84
Using Java
Connection pooling
The following application demonstrates this:
import com.ibm.mq.*; public class MQApp4 { public static void main(String []args) { MQSimpleConnectionManager myConnMan=new MQSimpleConnectionManager(); myConnMan.setActive(MQSimpleConnectionManager.MODE_AUTO); myConnMan.setTimeout(3600000); myConnMan.setMaxConnections(75); myConnMan.setMaxUnusedConnections(50); MQEnvironment.setDefaultConnectionManager(myConnMan); MQApp3.main(args); } }
| |
| | | |
The bold lines create and configure an MQSimpleConnectionManager object. The configuration does the following: v Ends connections that are not used for an hour v Limits the number of connections managed by myConnMan to 75 v Limits the number of unused connections in the pool to 50 v Sets MODE_AUTO, which is the default. This means that the pool is active only if it is the default connection manager, and there is at least one token in the set of MQPoolTokens held by MQEnvironment. The new MQSimpleConnectionManager is then set as the default connection manager. In the last line, the application calls MQApp3.main(). This runs a number of threads, where each thread uses WebSphere MQ independently. These threads use myConnMan when they forge connections.
The MQQueueManager constructor calls allocateConnection on the appropriate ConnectionManager. It passes appropriate implementations of ManagedConnectionFactory and ConnectionRequestInfo as parameters to describe the connection required.
85
Connection pooling
The ConnectionManager searches its pool for a javax.resource.spi.ManagedConnection object that has been created with identical ManagedConnectionFactory and ConnectionRequestInfo objects. If the ConnectionManager finds any suitable ManagedConnection objects, it creates a java.util.Set that contains the candidate ManagedConnections. Then, the ConnectionManager calls the following:
ManagedConnection mc=mcf.matchManagedConnections(connectionSet, subject, cxRequestInfo);
The WebSphere MQ implementation of ManagedConnectionFactory ignores the subject parameter. This method selects and returns a suitable ManagedConnection from the set, or returns null if it does not find a suitable ManagedConnection. If there is not a suitable ManagedConnection in the pool, the ConnectionManager can create one by using:
ManagedConnection mc=mcf.createManagedConnection(subject, cxRequestInfo);
Again, the subject parameter is ignored. This method connects to a WebSphere MQ queue manager and returns an implementation of javax.resource.spi.ManagedConnection that represents the newly-forged connection. Once the ConnectionManager has obtained a ManagedConnection (either from the pool or freshly created), it creates a connection handle using:
Object handle=mc.getConnection(subject, cxRequestInfo);
This connection handle can be returned from allocateConnection(). A ConnectionManager must register an interest in the ManagedConnection through:
mc.addConnectionEventListener()
The ConnectionEventListener is notified if a severe error occurs on the connection, or when MQQueueManager.disconnect() is called. When MQQueueManager.disconnect() is called, the ConnectionEventListener can do either of the following: v Reset the ManagedConnection using the mc.cleanup() call, then return the ManagedConnection to the pool v Destroy the ManagedConnection using the mc.destroy() call If the ConnectionManager is the default ConnectionManager, it can also register an interest in the state of the MQEnvironment-managed set of MQPoolTokens. To do so, first construct an MQPoolServices object, then register an MQPoolServicesEventListener object with the MQPoolServices object:
MQPoolServices mqps=new MQPoolServices(); mqps.addMQPoolServicesEventListener(listener);
The listener is notified when an MQPoolToken is added or removed from the set, or when the default ConnectionManager changes. The MQPoolServices object also provides a way to query the current size of the set of MQPoolTokens.
86
Using Java
JTA/JDBC coordination
Installation
In order to use the XA-JTA support, you must use the special JTA switch library. The method for using this library varies depending on whether you are using Windows systems or one of the other platforms.
The makefiles are set up to link against the databases and JDKs in their standard installed location. The exception to this is Oracle, which can be installed anywhere on the system. The makefile uses Oracles ORACLE_HOME environment variable to link the library correctly. If your JDK is in a non-standard location, you can override the default directory with the JAVA_HOME definition:
make JAVA_HOME=/usr/my_jdk13 oracle
The above command produces a switch file named jdbcora, which is used in the same way as a standard switch library, including using the same XAOpenString. If you have previously configured an XAResourceManager in your qm.ini, replace the SwitchFile line with a reference to the new JTA-specific switch file. If you have not previously used an XA switch file, refer to the WebSphere MQ System Administration Guide for of configuring the XAResourceManager stanza for different databases, remembering to replace the standard switch file with the Java-specific one. Once you have updated the qm.ini, restart the queue manager. Ensure that all appropriate database environment variables have been set before calling strmqm.
Chapter 7. Writing WebSphere MQ base Java programs
87
JTA/JDBC coordination
Usage
The basic sequence of API calls for a user application is:
qMgr = new MQQueueManager("QM1") Connection con = qMgr.getJDBCConnection( xads ); qMgr.begin() < Perform MQ and DB operations to be grouped in a unit of work > qMgr.commit() or qMgr.backout(); con.close() qMgr.disconnect()
xads in the getJDBCConnection call is a database-specific implementation of the XADataSource interface, which defines the details of the database to connect to. See the documentation for your database to determine how to create an appropriate XADataSource object to pass into getJDBCConnection. You also need to update your CLASSPATH with the appropriate database-specific jar files for performing JDBC work. If you need to connect to multiple databases, you might have to call getJDBCConnection several times to perform the transaction across several different connections. There are two forms of the getJDBCConnection, reflecting the two forms of XADataSource.getXAConnection:
public java.sql.Connection getJDBCConnection(javax.sql.XADataSource xads) throws MQException, SQLException, Exception public java.sql.Connection getJDBCConnection(XADataSource dataSource, String userid, String password) throws MQException, SQLException, Exception
These methods declare Exception in their throws clauses to avoid problems with the JVM verifier for customers who are not using the JTA functionality. The actual exception thrown is javax.transaction.xa.XAException. which requires the jta.jar file to be added to the classpath for programs that did not previously require it.
88
Using Java
JTA/JDBC coordination
Solaris and JDK 1.3 When running on Solaris with JDK 1.3, attempting to start the queue manager from a user ID other than root or mqm is likely to fail to load the jdbcora switch file with the following message being put to the error log:
AMQ6175: The system could not dynamically load the library /opt/mqm/java/lib/jdbcora. The error message was ld.so.1: amqzxma0: fatal: libverify.so: open failed: No such file or directory. The Queue Manager will continue without this module.
The problem arises because of a dependency between two libraries in JDK1.3 that cannot be resolved by the dynamic linker when the invoking program has the setuid bit set (as strmqm does). Under these circumstances, start the queue manager from the mqm user ID; if this is not practical, make a symbolic link for libverify into /usr/lib. For example:
ln -s /usr/j2se/jre/lib/sparc/libverify.so /usr/lib/libverify.so
Solaris and multiple XAResourceManager stanzas When attempting to use multiple XAResourceManager stanzas on any given queue manager on Solaris, the commit call might fail. Treat this as an unsupported combination; it does not affect queue managers with a single XAResourceManager stanza. Windows systems The JDBC libraries supplied with WebSphere MQ Java (jdbcdb2.dll and jdbcora.dll) have a dependency on jvm.dll, which is supplied with the JVM. However, depending on the JVM used, this DLL might be in a subdirectory that is not on the path; for example, jre/bin/classic/jvm.dll. If jvm.dll cannot be found when the queue manager starts, the queue manager produces a message like the following (this example is for DB2):
AMQ6174: The library C:\Program Files\IBM\MQSeries\Java\lib\jdbc\jdbcdb2.dll was not found. The queue manager will continue without this module.
In fact, the file not found is jvm.dll. The solution is to either copy jvm.dll to somewhere already on the path or update the path to include the location of jvm.dll.
89
SSL support
Enabling SSL
SSL is supported only for client connections. To enable SSL, you must specify the CipherSuite to use when communicating with the queue manager, and this must match the CipherSpec set on the target channel. Additionally, the named CipherSuite must be supported by your JSSE provider. However, CipherSuites are distinct from CipherSpecs and so have different names. Appendix H, SSL CipherSuites supported by WebSphere MQ, on page 487 contains a table mapping the CipherSpecs supported by WebSphere MQ to their equivalent CipherSuites as known to JSSE. To enable SSL, specify the CipherSuite using the sslCipherSuite static member variable of MQEnvironment. The following example attaches to a SVRCONN channel named SECURE.SVRCONN.CHANNEL, which has been set up to require SSL with a CipherSpec of RC4_MD5_EXPORT:
MQEnvironment.hostname = "your_hostname"; MQEnvironment.channel = "SECURE.SVRCONN.CHANNEL"; MQEnvironment.sslCipherSuite = "SSL_RSA_EXPORT_WITH_RC4_40_MD5"; MQQueueManager qmgr = new MQQueueManager("your_Q_manager");
Note that, although the channel has a CipherSpec of RC4_MD5_EXPORT, the Java application must specify a CipherSuite of SSL_RSA_EXPORT_WITH_RC4_40_MD5. For more information about CipherSpecs and CipherSuites, see the WebSphere MQ Security book. See Appendix H, SSL CipherSuites supported by WebSphere MQ, on page 487 for a list of mappings between CipherSpecs and CipherSuites. The sslCipherSuite property can also be set using the MQC.SSL_CIPHER_SUITE_PROPERTY in the Hash table of connection properties. To successfully connect using SSL, the JSSE TrustStore must be set up with Certificate Authority root certificates from which the certificate presented by the queue manager can be authenticated. Similarly, if SSLClientAuth on the SVRCONN channel has been set to MQSSL_CLIENT_AUTH_REQUIRED, the JSSE KeyStore must contain an identifying certificate that is trusted by the queue manager.
allows the connection to succeed only if the queue manager presents a certificate with a Common Name beginning QMGR., and at least two Organizational Unit names, the first of which must be IBM and the second WEBSPHERE. The sslPeerName property can also be set using the MQC.SSL_PEER_NAME_PROPERTY in the hash table of connection properties. For more information about distinguished names, refer to WebSphere MQ Security. If sslPeerName is set, connections succeed only if it is set to a valid pattern and the queue manager presents a matching certificate.
90
Using Java
SSL support
Having created a CertStoreParameters instance, use the static constructor on CertStore to create a CertStore of type LDAP:
CertStore cs = CertStore.getInstance("LDAP", csp);
Other CertStore types (for example, Collection) are also supported. Commonly there are several CRL servers set up with identical CRL information to give redundancy. Once you have a CertStore object for each of these CRL servers, place them all in a suitable Collection. The following example shows the CertStore objects placed in an ArrayList:
import java.util.ArrayList; Collection crls = new ArrayList(); crls.add(cs);
This Collection can be set into the MQEnvironment static variable, sslCertStores, before connecting to enable CRL checking:
MQEnvironment.sslCertStores = crls;
The certificate presented by the queue manager when a connection is being set up is validated as follows: 1. The first CertStore object in the Collection identified by sslCertStores is used to identify a CRL server. 2. An attempt is made to contact the CRL server. 3. If the attempt is successful, the server is searched for a match for the certificate. a. If the certificate is found to be revoked, the search process is over and the connection request fails with reason code MQRC_SSL_CERTIFICATE_REVOKED. b. If the certificate is not found, the search process is over and the connection is allowed to proceed. 4. If the attempt to contact the server is unsuccessful, the next CertStore object is used to identify a CRL server and the process repeats from step 2. If this was the last CertStore in the Collection, or if the Collection contains no CertStore objects, the search process has failed and the connection request fails with reason code MQRC_SSL_CERT_STORE_ERROR.
Chapter 7. Writing WebSphere MQ base Java programs
91
SSL support
The Collection object determines the order in which CertStores are used. The Collection of CertStores can also be set using the MQC.SSL_CERT_STORE_PROPERTY. As a convenience, this property also allows a single CertStore to be specified without needing to be a member of a Collection. If sslCertStores is set to null, no CRL checking is performed. This property is ignored if sslCipherSuite is not set.
WebSphere MQ classes for Java then use this SSLSocketFactory to connect to the WebSphere MQ queue manager. This property can also be set using the MQC.SSL_SOCKET_FACTORY_PROPERTY. If sslSocketFactory is set to null, the JVMs default SSLSocketFactory is used. This property is ignored if sslCipherSuite is not set.
92
Using Java
SSL support
MQRC_SSL_PEER_NAME_ERROR The DN pattern specified in the sslPeerName property was not valid. MQRC_UNSUPPORTED_CIPHER_SUITE The CipherSuite named in sslCipherSuite was not recognized by the JSSE provider. A full list of CipherSuites supported by the JSSE provider can be obtained by a program using the SSLSocketFactory.getSupportedCipherSuites() method. A list of CipherSuites that can be used to communicate with WebSphere MQ can be found in Appendix H, SSL CipherSuites supported by WebSphere MQ, on page 487. MQRC_SSL_CERTIFICATE_REVOKED The certificate presented by the queue manager was found in a CRL specified with the sslCertStores property. Update the queue manager to use trusted certificates. MQRC_SSL_CERT_STORE_ERROR None of the supplied CertStores could be searched for the certificate presented by the queue manager. The MQException.getCause() method returns the error that occurred while searching the first CertStore attempted. If the causal exception is NoSuchElementException, ClassCastException, or NullPointerException, check that the Collection specified on the sslCertStores property contains at least one valid CertStore object.
Run your applet either by loading this HTML file into a Java-enabled Web browser, or by using the appletviewer that comes with the Java Development Kit (JDK). To use the applet viewer, enter the command:
appletviewer myclass.html
93
The trace is written to the Java console (System.err). If your program is an application, or if you run it from your local disk using the appletviewer command, you can also redirect the trace output to a file of your choice. The following code fragment shows an example of how to redirect the trace output to a file called myapp.trc:
import java.io.*; try { FileOutputStream traceFile = new FileOutputStream("myapp.trc"); MQEnvironment.enableTracing(2,traceFile); } catch (IOException ex) { // couldnt open the file, // trace to System.err instead MQEnvironment.enableTracing(2); }
There are five different levels of tracing: 1. Provides entry, exit, and exception tracing 2. Provides parameter information in addition to 1 3. Provides transmitted and received WebSphere MQ headers and data blocks in addition to 2 4. Provides transmitted and received user message data in addition to 3 5. Provides tracing of methods in the Java Virtual Machine in addition to 4 To trace methods in the Java Virtual Machine with trace level 5: v For an application, run it by issuing the command java_g (instead of java) v For an applet, run it by issuing the command appletviewer_g (instead of appletviewer) Note: java_g is not supported on OS/400, but similar function is provided by using OPTION(*VERBOSE) on the RUNJVA command.
94
Using Java
Core details
WebSphere MQ classes for Java contains the following core set of classes, which can be used in all environments with only the minor variations listed in Restrictions and variations for core classes on page 96. v MQEnvironment v MQException v MQGetMessageOptions Excluding: MatchOptions GroupStatus SegmentStatus Segmentation v MQManagedObject Excluding: inquire() set() v MQMessage Excluding: groupId messageFlags messageSequenceNumber offset originalLength v MQPoolServices v MQPoolServicesEvent v MQPoolServicesEventListener v MQPoolToken v MQPutMessageOptions Excluding: knownDestCount unknownDestCount invalidDestCount recordFields v MQProcess v MQQueue v MQQueueManager
Copyright IBM Corp. 1997, 2004
95
Core details
Excluding: begin() accessDistributionList() v MQSimpleConnectionManager v MQC Notes: 1. Some constants are not included in the core (see Restrictions and variations for core classes for details); do not use them in completely portable programs. 2. Some platforms do not support all connection modes. On these platforms, you can use only the core classes and options that relate to the supported modes. (See Table 1 on page 5.)
MQGMO_* values
The following MQGMO_* values are not supported by all queue managers, and their use might throw MQException from an MQQueue.get(): MQGMO_SYNCPOINT_IF_PERSISTENT MQGMO_MARK_SKIP_BACKOUT MQGMO_BROWSE_MSG_UNDER_CURSOR MQGMO_LOCK MQGMO_UNLOCK MQGMO_LOGICAL_ORDER MQGMO_COMPLETE_MESSAGE MQGMO_ALL_MSGS_AVAILABLE MQGMO_ALL_SEGMENTS_AVAILABLE Additionally, MQGMO_SET_SIGNAL is not supported when used from Java.
MQPMRF_* values
These are used only when putting messages to a distribution list, and are supported only by queue managers supporting distribution lists. For example, z/OS and OS/390 queue managers do not support distribution lists.
MQPMO_* values
The following MQPMO_* values are not supported by all queue managers, and their use might throw MQException from an MQQueue.put() or an MQQueueManager.put(): MQPMO_NEW_MESSAGE_ID MQPMO_NEW_CORREL_ID MQPMO_LOGICAL_ORDER
MQCNO_FASTPATH_BINDING
This value is ignored on queue managers that do not support it, or when using a TCP/IP client connection.
96
Using Java
Restrictions
MQRO_* values
The following report options can be set but are ignored by some queue managers. This can affect applications connected to a queue manager that honors the report options when the report message is generated by a remote queue manager that does not. Avoid relying on these options if there is a possibility that a queue manager involved does not support them. MQRO_EXCEPTION_WITH_FULL_DATA MQRO_EXPIRATION_WITH_FULL_DATA MQRO_COA_WITH_FULL_DATA MQRO_COD_WITH_FULL_DATA MQRO_DISCARD_MSG
97
MQQueueManager.begin() method
This can be used only against a WebSphere MQ queue manager on UNIX or Windows systems in bindings mode. Otherwise, it fails with MQRC_ENVIRONMENT_ERROR. See JTA/JDBC coordination using WebSphere MQ base Java on page 87 for more details.
MQGetMessageOptions fields
When using a queue manager that does not support the Version 2 MQGMO structure, leave the following fields set to their default values: GroupStatus SegmentStatus Segmentation Also, the MatchOptions field support only MQMO_MATCH_MSG_ID and MQMO_MATCH_CORREL_ID. If you put unsupported values into these fields, the subsequent MQQueue.get() fail with MQRC_GMO_ERROR. If the queue manager does not support the Version 2 MQGMO structure, these fields are not updated after a successful MQQueue.get().
Distribution lists
The following classes are used to create distribution lists: MQDistributionList MQDistributionListItem MQMessageTracker You can create and populate MQDistributionLists and MQDistributionListItems in any environment, but not all queue managers allow you to open an MQDistributionList. In particular, z/OS and OS/390 queue managers do not support distribution lists. Attempting to open an MQDistributionList when using such a queue manager results in MQRC_OD_ERROR.
MQPutMessageOptions fields
Four fields in the MQPMO are rendered as the following member variables in the MQPutMessageOptions class: knownDestCount
98
Using Java
MQMD fields
The following MQMD fields are largely concerned with message segmentation: GroupId MsgSeqNumber Offset MsgFlags OriginalLength If an application sets any of these MQMD fields to values other than their defaults, and then does a put() or get() on a queue manager that does not support these, the put() or get() raises an MQException with MQRC_MD_ERROR. A successful put() or get() with such a queue manager always leaves the MQMD fields set to their default values. Do not send a grouped or segmented message to a Java application that runs against a queue manager that does not support message grouping and segmentation. If a Java application attempts to get() a message from a queue manager that does not support these fields, and the physical message to be retrieved is part of a group of segmented messages (that is, it has non-default values for the MQMD fields), it is retrieved without error. However, the MQMD fields in the MQMessage are not updated, the MQMessage format property is set to MQFMT_MD_EXTENSION, and the true message data is prefixed with an MQMDE structure that contains the values for the new fields.
99
100
Using Java
101
MQChannelDefinition
MQChannelDefinition
java.lang.Object com.ibm.mq.MQChannelDefinition
public class MQChannelDefinition extends Object Use the MQChannelDefinition class to pass information concerning the connection to the queue manager to the send, receive, and security exits. Note: This class does not apply when connecting directly to WebSphere MQ in bindings mode.
Variables
channelName public String channelName The name of the channel through which the connection is established. connectionName public String connectionName The TCP/IP hostname of the machine on which the queue manager resides. maxMessageLength public int maxMessageLength The maximum length of message that can be sent to the queue manager. queueManagerName public String queueManagerName The name of the queue manager to which the connection is made. receiveUserData public String receiveUserData A storage area for the receive exit to use. Information placed here is preserved across invocations of the receive exit, and is also available to the send and security exits. remotePassword public String remotePassword The password used to establish the connection. remoteUserId public String remoteUserId The user id used to establish the connection. securityUserData public String securityUserData A storage area for the security exit to use. Information placed here is preserved across invocations of the security exit, and is also available to the send and receive exits. sendUserData public String sendUserData
102
Using Java
MQChannelDefinition
A storage area for the send exit to use. Information placed here is preserved across invocations of the send exit, and is also available to the security and receive exits. sslPeerName public String sslPeerName If SSL is used to encrypt data on the wire, this is set to the Distinguished Name presented by the queue manager during connection. If SSL is not used, it is left at null.
Constructors
MQChannelDefinition public MQChannelDefinition()
103
MQChannelExit
MQChannelExit
java.lang.Object com.ibm.mq.MQChannelExit
public class MQChannelExit extends Object This class defines context information passed to the send, receive, and security exits when they are invoked. The exit must set the exitResponse member variable to indicate what action the WebSphere MQ Client for Java should take next. Note: This class does not apply when connecting directly to WebSphere MQ in bindings mode.
Variables
MQXCC_CLOSE_CHANNEL public final static int MQXCC_CLOSE_CHANNEL MQXCC_OK public final static int MQXCC_OK MQXCC_SUPPRESS_FUNCTION public final static int MQXCC_SUPPRESS_FUNCTION MQXCC_SEND_AND_REQUEST_SEC_MSG public final static int MQXCC_SEND_AND_REQUEST_SEC_MSG MQXCC_SEND_SEC_MSG public final static int MQXCC_SEND_SEC_MSG MQXCC_SUPPRESS_EXIT public final static int MQXCC_SUPPRESS_EXIT MQXR_INIT public final static int MQXR_INIT MQXR_INIT_SEC public final static int MQXR_INIT_SEC MQXR_SEC_MSG public final static int MQXR_SEC_MSG MQXR_TERM public final static int MQXR_TERM MQXR_XMIT public final static int MQXR_XMIT MQXT_CHANNEL_SEC_EXIT public final static int MQXT_CHANNEL_SEC_EXIT MQXT_CHANNEL_SEND_EXIT public final static int MQXT_CHANNEL_SEND_EXIT MQXT_CHANNEL_RCV_EXIT public final static int MQXT_CHANNEL_RCV_EXIT capabilityFlags public static final int capabilityFlags
104
Using Java
MQChannelExit
Indicates the capability of the queue manager. Only the MQC.MQCF_DIST_LISTS flag is supported. exitID public int exitID The type of exit that has been invoked. For an MQSecurityExit this is always MQXT_CHANNEL_SEC_EXIT; for an MQSendExit this is always MQXT_CHANNEL_SEND_EXIT; for an MQReceiveExit this is always MQXT_CHANNEL_RCV_EXIT. exitReason public int exitReason The reason for invoking the exit. Possible values are: MQXR_INIT Exit initialization; called after the channel connection conditions have been negotiated, but before any security flows have been sent. MQXR_INIT_SEC Indicates that the exit is to initiate the security dialog with the queue manager. MQXR_SEC_MSG Indicates to the security exit that a security message has been received from the queue manager. MQXR_TERM Exit termination; called after the disconnect flows have been sent but before the socket connection is destroyed. MQXR_XMIT For a send exit, indicates that data is to be transmitted to the queue manager. For a receive exit, indicates that data has been received from the queue manager. exitResponse public int exitResponse Set by the exit to indicate the action that WebSphere MQ classes for Java should take next. Valid values are: MQXCC_CLOSE_CHANNEL Set by any exit to indicate that the connection to the queue manager should be closed. MQXCC_OK Set by the security exit to indicate that security exchanges are complete. Set by send exit to indicate that the returned data is to be transmitted to the queue manager. Set by the receive exit to indicate that the returned data is available for processing by the WebSphere MQ Client for Java. MQXCC_SEND_AND_REQUEST_SEC_MSG Set by the security exit to indicate that the returned data is to be transmitted to the queue manager, and that a response is expected from the queue manager.
105
MQChannelExit
MQXCC_SEND_SEC_MSG Set by the security exit to indicate that the returned data is to be transmitted to the queue manager, and that no response is expected. MQXCC_SUPPRESS_EXIT Set by any exit to indicate that it should no longer be called. MQXCC_SUPPRESS_FUNCTION Set by the security exit to indicate that communications with the queue manager should be shut down. exitUserArea public byte exitUserArea[] A storage area available for the exit to use. Any data placed in the exitUserArea is preserved by the WebSphere MQ Client for Java across exit invocations with the same exitID. (That is, the send, receive, and security exits each have their own, independent, user areas.) fapLevel public static final int fapLevel The negotiated Format and Protocol (FAP) level. maxSegmentLength public int maxSegmentLength The maximum length for any one transmission to a queue manager. If the exit returns data that is to be sent to the queue manager, the length of the returned data must not exceed this value.
Constructors
MQChannelExit public MQChannelExit()
106
Using Java
MQDistributionList
MQDistributionList
java.lang.Object com.ibm.mq.MQManagedObject com.ibm.mq.MQDistributionList
public class MQDistributionList extends MQManagedObject (See page 123.) Create an MQDistributionList using the MQDistributionList constructor or the accessDistributionList method for MQQueueManager. A distribution list represents a set of open queues to which messages can be sent using a single call to the put() method. (See Distribution lists in the WebSphere MQ Application Programming Guide.)
Constructors
MQDistributionList
public MQDistributionList(MQQueueManager qMgr, MQDistributionListItem[] litems, int openOptions, String alternateUserId) throws MQException
qMgr is the queue manager where the list is to be opened. litems are the items to be included in the distribution list. See accessDistributionList on page 166 for details of the remaining parameters.
Methods
getFirstDistributionListItem public MQDistributionListItem getFirstDistributionListItem() Returns the first item in the distribution list, or null if the list is empty. getInvalidDestinationCount public int getInvalidDestinationCount() Returns the number of items in the distribution list that failed to open successfully. getValidDestinationCount public int getValidDestinationCount() Returns the number of items in the distribution list that were opened successfully. put
public synchronized void put(MQMessage message, MQPutMessageOptions putMessageOptions ) throws MQException
107
MQDistributionList
Parameters message An input/output parameter containing the message descriptor information and the returned message data. putMessageOptions Options that control the action of MQPUT. (See MQPutMessageOptions on page 152 for details.) Throws MQException if the put fails.
108
Using Java
MQDistributionListItem
MQDistributionListItem
java.lang.Object com.ibm.mq.MQMessageTracker com.ibm.mq.MQDistributionListItem
public class MQDistributionListItem extends MQMessageTracker (See page 144.) An MQDistributionListItem represents a single item (queue) within a distribution list.
Variables
completionCode public int completionCode The completion code resulting from the last operation on this item. If this was the construction of an MQDistributionList, the completion code relates to the opening of the queue. If it was a put operation, the completion code relates to the attempt to put a message onto this queue. The initial value is 0. queueManagerName public String queueManagerName The name of the queue manager on which the queue is defined. The initial value is . queueName public String queueName The name of a queue you want to use with a distribution list. This cannot be the name of a model queue. The initial value is . reasonCode public int reasonCode The reason code resulting from the last operation on this item. If this was the construction of an MQDistributionList, the reason code relates to the opening of the queue. If it was a put operation, the reason code relates to the attempt to put a message onto this queue. The initial value is 0.
Constructors
MQDistributionListItem public MQDistributionListItem() Construct a new MQDistributionListItem object.
109
MQEnvironment
MQEnvironment
java.lang.Object com.ibm.mq.MQEnvironment
public class MQEnvironment extends Object Note: All the methods and attributes of this class apply to the WebSphere MQ classes for Java client connections, but only enableTracing, disableTracing, properties, and version_notice apply to bindings connections. MQEnvironment contains static member variables that control the environment in which an MQQueueManager object (and its corresponding connection to WebSphere MQ) is constructed. Values set in the MQEnvironment class take effect when the MQQueueManager constructor is called, so set the values in the MQEnvironment class before you construct an MQQueueManager instance.
Variables
Note: Variables marked with * do not apply when connecting directly to WebSphere MQ in bindings mode. CCSID* public static int CCSID The CCSID used by the client. Changing this value affects the way that the queue manager you connect to translates information in the WebSphere MQ headers. All data in WebSphere MQ headers is drawn from the invariant part of the ASCII codeset, except for the data in the applicationIdData and the putApplicationName fields of the MQMessage class. (See MQMessage on page 126.) If you avoid using characters from the variant part of the ASCII codeset for these two fields, you are then safe to change the CCSID from 819 to any other ASCII codeset. If you change the clients CCSID to be the same as that of the queue manager to which you are connecting, you gain a performance benefit at the queue manager because it does not attempt to translate the message headers. The default value is 819. channel* public static String channel The name of the channel to connect to on the target queue manager. You must set this member variable, or the corresponding property, before constructing an MQQueueManager instance for use in client mode.
110
Using Java
MQEnvironment
hostname* public static String hostname The TCP/IP hostname of the machine on which the WebSphere MQ server resides. If the hostname is not set, and no overriding properties are set, bindings mode is used to connect to the local queue manager. | | | | | | | | | | | | | | | | | | localAddressSetting* public static String localAddressSetting The local address, including a range of ports, that is used when connecting to a WebSphere MQ queue manager through a firewall. The format of a local address is [ip-addr][(low-port[,high-port])]. Here are some examples: 9.20.4.98 The channel binds to address 9.20.4.98 locally 9.20.4.98(1000) The channel binds to address 9.20.4.98 locally and uses port 1000 9.20.4.98(1000,2000) The channel binds to address 9.20.4.98 locally and uses a port in the range 1000 to 2000 (1000) The channel binds to port 1000 locally (1000,2000) The channel binds to a port in the range 1000 to 2000 locally You can specify a host name instead of an IP address. The variable is initialized from a system property called com.ibm.mq.localAddress when you start the JVM. The default value is null. password* public static String password Equivalent to the WebSphere MQ environment variable MQ_PASSWORD. If a security exit is not defined for this client, the value of password is transmitted to the server and is available to the server security exit when it is invoked. Use the value to verify the identity of the WebSphere MQ client. The default value is . port* public static int port The port to connect to. This is the port on which the WebSphere MQ server is listening for incoming connection requests. The default value is 1414. properties public static java.util.Hashtable properties A set of key/value pairs defining the WebSphere MQ environment. This hash table allows you to set environment properties as key/value pairs rather than as individual variables. The properties can also be passed as a Hashtable in a parameter on the MQQueueManager constructor. Properties passed on the constructor take precedence over values set with this properties variable, but they are otherwise interchangeable. The order of precedence of finding properties is: 1. properties parameter on MQQueueManager constructor 2. MQEnvironment.properties 3. Other MQEnvironment variables
Chapter 9. The WebSphere MQ base Java classes and interfaces
111
MQEnvironment
4. Constant default values The possible key/value pairs are shown in the following table:
Key MQC.CCSID_PROPERTY MQC.CHANNEL_PROPERTY MQC.CONNECT_OPTIONS_PROPERTY MQC.HOST_NAME_PROPERTY Value Integer (overrides MQEnvironment.CCSID) String (overrides MQEnvironment.channel) Integer, defaults to MQC.MQCNO_NONE String (overrides MQEnvironment.hostname) String (overrides MQEnvironment.localAddressSetting) org.omg.CORBA.ORB (optional) String (overrides MQEnvironment.password) Integer (overrides MQEnvironment.port) MQReceiveExit (overrides MQEnvironment.receiveExit) MQSecurityExit (overrides MQEnvironment.securityExit) MQSendExit (overrides MQEnvironment.sendExit) java.util.Collection, or java.security.cert.CertStore (overrides MQEnvironment.sslCertStores) String (overrides MQEnvironment.sslCipherSuite) String (overrides MQEnvironment.sslPeerName) javax.net.ssl.SSLSocketFactory (overrides MQEnvironment.sslSocketFactory) MQC.TRANSPORT_MQSERIES_BINDINGS or MQC.TRANSPORT_MQSERIES_CLIENT or MQC.TRANSPORT_MQSERIES (the default, which selects bindings or client, based on the value of hostname.) String (overrides MQEnvironment.userID.)
| |
MQC.USER_ID_PROPERTY
receiveExit* public static MQReceiveExit receiveExit A receive exit allows you to examine, and possibly alter, data received from a queue manager. It is normally used in conjunction with a corresponding send exit at the queue manager. To provide your own receive exit, define a class that implements the MQReceiveExit interface, and assign receiveExit to an instance of that class. Otherwise, you can leave receiveExit set to null, in which case no receive exit is called. See also MQReceiveExit on page 182.
112
Using Java
MQEnvironment
securityExit* public static MQSecurityExit securityExit A security exit allows you to customize the security flows that occur when an attempt is made to connect to a queue manager. To provide your own security exit, define a class that implements the MQSecurityExit interface, and assign securityExit to an instance of that class. Otherwise, you can leave securityExit set to null, in which case no security exit is called. See also MQSecurityExit on page 184. sendExit* public static MQSendExit sendExit A send exit allows you to examine, and possibly alter, the data sent to a queue manager. It is normally used in conjunction with a corresponding receive exit at the queue manager. To provide your own send exit, define a class that implements the MQSendExit interface, and assign sendExit to an instance of that class. Otherwise, you can leave sendExit set to null, in which case no send exit is called. See also MQSendExit on page 186. sslCertStores* public static java.util.Collection sslCertStores A Collection of CertStore objects used for certificate revocation checking. Use of this variable requires a JVM at Java 2 v1.4 or later. If sslCipherSuite is set, this variable can be used to ensure that the queue managers certificate has not become revoked. Each CertStore in the Collection represents an identical copy of the certificate revocation list (CRL). For more information on the behaviour of sslCertStores, refer to Using certificate revocation lists on page 91. If set to null (default), the certificate presented by the queue manager is not checked against any certificate revocation list. This variable is ignored if sslCipherSuite is null. sslCipherSuite* public static String sslCipherSuite If set, SSL is enabled for the connection. Set the sslCipherSuite to the CipherSuite name matching the CipherSpec set on the SVRCONN channel. If set to null (default), no SSL encryption is performed. sslPeerName* public static String sslPeerName A distinguished name pattern. If sslCipherSuite is set, this variable can be used to ensure the correct queue manager is used. For a description of the format for this value, see Using the distinguished name of the queue manager on page 90. If set to null (default), no checking of the queue managers DN is performed. This variable is ignored if sslCipherSuite is null.
113
MQEnvironment
sslSocketFactory* public static javax.net.ssl.SSLSocketFactory sslSocketFactory The factory to use when connecting with SSL encryption. If sslCipherSuite is set, this variable can be used to customize all aspects of the SSL connection. For more information on constructing and customizing SSLSocketFactory instances, refer to your JSSE provider; for information regarding the use of this variable, refer to Supplying a customized SSLSocketFactory on page 92. If set to null (default) and SSL encryption is requested, the default SSLSocketFactory is used. This variable is ignored if sslCipherSuite is null. userID* public static String userID Equivalent to the WebSphere MQ environment variable MQ_USER_ID. If a security exit is not defined for this client, the value of userID is transmitted to the server and is available to the server security exit when it is invoked. Use the value to verify the identity of the WebSphere MQ client. The default value is . version_notice public final static String version_notice The current version of WebSphere MQ classes for Java.
Constructors
MQEnvironment public MQEnvironment()
Methods
addConnectionPoolToken
public static void addConnectionPoolToken(MQPoolToken token)
Adds the supplied MQPoolToken to the set of tokens. A default ConnectionManager can use this as a hint; typically, it is enabled only while there is at least one token in the set. Parameters: token The MQPoolToken to add to the set of tokens.
addConnectionPoolToken
public static MQPoolToken addConnectionPoolToken()
Constructs an MQPoolToken and adds it to the set of tokens. The MQPoolToken is returned to the application to be passed later into removeConnectionPoolToken().
114
Using Java
MQEnvironment
disableTracing public static void disableTracing() Turns off the WebSphere MQ Client for Java trace facility. enableTracing public static void enableTracing(int level) Turns on the WebSphere MQ Client for Java trace facility. Parameters level enableTracing
public static void enableTracing(int level, OutputStream stream)
Turns on the WebSphere MQ Client for Java trace facility. Parameters: level The level of tracing required, from 1 to 5 (5 being the most detailed).
Returns the default ConnectionManager. If the default ConnectionManager is actually an MQConnectionManager, returns null. getVersionNotice()
public static final String getVersionNotice()
Removes the specified MQPoolToken from the set of tokens. If that MQPoolToken is not in the set, there is no action. Parameters: token The MQPoolToken to remove from the set of tokens.
setDefaultConnectionManager
public static void setDefaultConnectionManager( MQConnectionManager cxManager)
Sets the supplied MQConnectionManager to be the default ConnectionManager. The default ConnectionManager is used when there is no ConnectionManager specified on the MQQueueManager constructor. This method also empties the set of MQPoolTokens. Parameters: cxManager The MQConnectionManager to be the default ConnectionManager.
Chapter 9. The WebSphere MQ base Java classes and interfaces
115
MQEnvironment
setDefaultConnectionManager
public static void setDefaultConnectionManager (javax.resource.spi.ConnectionManager cxManager)
Sets the default ConnectionManager, and empties the set of MQPoolTokens. The default ConnectionManager is used when there is no ConnectionManager specified on the MQQueueManager constructor. This method requires a JVM at Java 2 v1.3 or later, with JAAS 1.0 or later installed. Parameters: cxManager The default ConnectionManager (which implements the javax.resource.spi.ConnectionManager interface).
116
Using Java
MQException
MQException
java.lang.Object java.lang.Throwable java.lang.Exception com.ibm.mq.MQException
public class MQException extends Exception An MQException is thrown whenever a WebSphere MQ error occurs. You can change the output stream for the exceptions that are logged by setting the value of MQException.log. The default value is System.err. This class contains definitions of completion code and error code constants. Constants beginning MQCC_ are WebSphere MQ completion codes, and constants beginning MQRC_ are WebSphere MQ reason codes. The WebSphere MQ Application Programming Reference contains a full description of these errors and their probable causes.
Variables
completionCode public int completionCode WebSphere MQ completion code giving rise to the error. The possible values are: v MQException.MQCC_WARNING v MQException.MQCC_FAILED exceptionSource public Object exceptionSource The object instance that threw the exception. You can use this as part of your diagnostics when determining the cause of an error. log public static java.io.outputStreamWriter log Stream to which exceptions are logged. (The default is System.err.) If you set this to null, no logging occurs. reasonCode public int reasonCode WebSphere MQ reason code describing the error. For a full explanation of the reason codes, refer to the WebSphere MQ Application Programming Reference.
Constructors
MQException
public MQException(int completionCode, int reasonCode, Object source)
117
MQException
completionCode The WebSphere MQ completion code. reasonCode The WebSphere MQ reason code. source The object in which the error occurred.
Methods
getCause
public Throwable getCause()
Returns the cause of this MQException, or null if the cause is nonexistent or unknown. Note that this method is available on MQException even under JVMs before Java 2 v1.4. initCause
public Throwable initCause(Throwable cause)
Initializes the cause of this MQException to the specified value. Throws IllegalArgumentException if the cause is this MQException or IllegalStateException if the cause has already been set. Returns this MQException. Note that this method is available on MQException even under JVMs before Java 2 v1.4. Applications do not normally use this method.
118
Using Java
MQGetMessageOptions
MQGetMessageOptions
java.lang.Object com.ibm.mq.MQGetMessageOptions
public class MQGetMessageOptions extends Object This class contains options that control the behavior of MQQueue.get(). Note: The behavior of some of the options available in this class depends on the environment in which they are used. These elements are marked with a *. See Chapter 8, Environment-dependent behavior, on page 95 for details.
Variables
groupStatus* public char groupStatus This is an output field that indicates whether the retrieved message is in a group, and if it is, whether it is the last in the group. Possible values are: MQC.MQGS_LAST_MSG_IN_GROUP Message is the last in the group. This is also the value returned if the group consists of only one message. MQC.MQGS_MSG_IN_GROUP Message is in a group, but is not the last in the group. MQC.MQGS_NOT_IN_GROUP Message is not in a group. matchOptions* public int matchOptions Selection criteria that determine which message is retrieved. The following match options can be set: MQC.MQMO_MATCH_CORREL_ID Correlation id to be matched. MQC.MQMO_MATCH_GROUP_ID Group id to be matched. MQC.MQMO_MATCH_MSG_ID Message id to be matched. MQC.MQMO_MATCH_MSG_SEQ_NUMBER Match message sequence number. MQC.MQMO_NONE No matching required. options public int options Options that control the action of MQQueue.get. Any or none of the following values can be specified. If more than one option is required, the values can be added together or combined using the bitwise OR operator. MQC.MQGMO_ACCEPT_TRUNCATED_MSG Allow truncation of message data.
Chapter 9. The WebSphere MQ base Java classes and interfaces
119
MQGetMessageOptions
MQC.MQGMO_BROWSE_FIRST Browse from start of queue. MQC.MQGMO_BROWSE_MSG_UNDER_CURSOR* Browse message under browse cursor. MQC.MQGMO_BROWSE_NEXT Browse from the current position in the queue. MQC.MQGMO_CONVERT Request the application data to be converted, to conform to the characterSet and encoding attributes of the MQMessage, before the data is copied into the message buffer. Because data conversion is also applied as the data is retrieved from the message buffer, applications do not usually set this option. Using this option can cause problems when converting from single byte character sets to double byte character sets. Instead, do the conversion using the readString, readLine, and writeString methods after the message has been delivered. MQC.MQGMO_FAIL_IF_QUIESCING Fail if the queue manager is quiescing. MQC.MQGMO_LOCK* Lock the message that is browsed. MQC.MQGMO_MARK_SKIP_BACKOUT* Allow a unit of work to be backed out without reinstating the message on the queue. MQC.MQGMO_MSG_UNDER_CURSOR Get message under browse cursor. MQC.MQGMO_NONE No other options have been specified; all options assume their default values. MQC.MQGMO_NO_SYNCPOINT Get message without syncpoint control. MQC.MQGMO_NO_WAIT Return immediately if there is no suitable message. MQC.MQGMO_SYNCPOINT Get the message under syncpoint control; the message is marked as being unavailable to other applications, but it is deleted from the queue only when the unit of work is committed. The message is made available again if the unit of work is backed out. MQC.MQGMO_SYNCPOINT_IF_PERSISTENT* Get message with syncpoint control if message is persistent. MQC.MQGMO_UNLOCK* Unlock a previously locked message. MQC.MQGMO_WAIT Wait for a message to arrive. Segmenting and grouping WebSphere MQ messages can be sent or received as a single entity, can be split into several segments for sending and receiving, and can also be linked to other messages in a group.
120
Using Java
MQGetMessageOptions
Each piece of data that is sent is known as a physical message, which can be a complete logical message, or a segment of a longer logical message. Each physical message usually has a different MsgId. All the segments of a single logical message have the same groupId value and MsgSeqNumber value, but the Offset value is different for each segment. The Offset field gives the offset of the data in the physical message from the start of the logical message. The segments usually have different MsgId values, because they are individual physical messages. Logical messages that form part of a group have the same groupId value, but each message in the group has a different MsgSeqNumber value. Messages in a group can also be segmented. The following options can be used for dealing with segmented or grouped messages: MQC.MQGMO_ALL_MSGS_AVAILABLE* Retrieve messages from a group only when all the messages in the group are available. MQC.MQGMO_ALL_SEGMENTS_AVAILABLE* Retrieve the segments of a logical message only when all the segments in the group are available. MQC.MQGMO_COMPLETE_MSG* Retrieve only complete logical messages. MQC.MQGMO_LOGICAL_ORDER* Return messages in groups, and segments of logical messages, in logical order. resolvedQueueName public String resolvedQueueName This is an output field that the queue manager sets to the local name of the queue from which the message was retrieved. This is different from the name used to open the queue if an alias queue or model queue was opened. segmentation* public char segmentation This is an output field that indicates whether or not segmentation is allowed for the retrieved message. Possible values are: MQC.MQSEG_INHIBITED Segmentation not allowed. MQC.MQSEG_ALLOWED Segmentation allowed. segmentStatus* public char segmentStatus This is an output field that indicates whether the retrieved message is a segment of a logical message. If the message is a segment, the flag indicates whether or not it is the last segment. Possible values are: MQC.MQSS_LAST_SEGMENT Message is the last segment of the logical message. This is also the value returned if the logical message consists of only one segment.
Chapter 9. The WebSphere MQ base Java classes and interfaces
121
MQGetMessageOptions
MQC.MQSS_NOT_A_SEGMENT Message is not a segment. MQC.MQSS_SEGMENT Message is a segment, but is not the last segment of the logical message. waitInterval public int waitInterval The maximum time (in milliseconds) that an MQQueue.get call waits for a suitable message to arrive (used in conjunction with MQC.MQGMO_WAIT). A value of MQC.MQWI_UNLIMITED indicates that an unlimited wait is required.
Constructors
MQGetMessageOptions public MQGetMessageOptions() Construct a new MQGetMessageOptions object with options set to MQC.MQGMO_NO_WAIT, a wait interval of zero, and a blank resolved queue name.
122
Using Java
MQManagedObject
MQManagedObject
java.lang.Object com.ibm.mq.MQManagedObject
public class MQManagedObject extends Object MQManagedObject is a superclass for MQQueueManager, MQQueue, and MQProcess. It provides the ability to inquire and set attributes of these resources.
Variables
alternateUserId public String alternateUserId The alternate user ID (if any) specified when this resource was opened. Setting this attribute has no effect. closeOptions public int closeOptions Set this attribute to control the way the resource is closed. The default value is MQC.MQCO_NONE, and this is the only permissible value for all resources other than permanent dynamic queues, and temporary dynamic queues that are being accessed by the objects that created them. For these queues, the following additional values are permissible: MQC.MQCO_DELETE Delete the queue if there are no messages. MQC.MQCO_DELETE_PURGE Delete the queue, purging any messages on it. connectionReference public MQQueueManager connectionReference The queue manager to which this resource belongs. Setting this attribute has no effect. isOpen public boolean isOpen Indicates whether this resource is currently open. This attribute is deprecated and setting it has no effect. name public String name The name of this resource (either the name supplied on the access method, or the name allocated by the queue manager for a dynamic queue). Setting this attribute has no effect. openOptions public int openOptions The options specified when this resource was opened. Setting this attribute has no effect.
123
MQManagedObject
Constructors
MQManagedObject protected MQManagedObject() Constructor method.
Methods
close
public synchronized void close()
Throws MQException. Closes the object. No further operations against this resource are permitted after this method has been called. To change the behavior of the close method, set the closeOptions attribute. Throws MQException if the WebSphere MQ call fails. getDescription
public String getDescription()
Throws MQException. Returns the description of this resource as held at the queue manager. If this method is called after the resource has been closed, an MQException is thrown. inquire
public void inquire(int selectors[], int intAttrs[], byte charAttrs[])
Throws MQException. Returns an array of integers and a set of character strings containing the attributes of an object (queue, process, or queue manager). The attributes to be queried are specified in the selectors array. Refer to the WebSphere MQ Application Programming Reference for details of the permissible selectors and their corresponding integer values. Many of the more common attributes can be queried using the getXXX() methods defined in MQManagedObject, MQQueue, MQQueueManager, and MQProcess. Parameters selectors Integer array identifying the attributes with values to be inquired on. intAttrs The array in which the integer attribute values are returned. Integer attribute values are returned in the same order as the integer attribute selectors in the selectors array.
124
Using Java
MQManagedObject
charAttrs The buffer in which the character attributes are returned, concatenated. Character attributes are returned in the same order as the character attribute selectors in the selectors array. The length of each attribute string is fixed for each attribute. Throws MQException if the inquire fails. isOpen public boolean isOpen() Returns the value of the isOpen variable. set
public synchronized void set(int selectors[], int intAttrs[], byte charAttrs[])
Throws MQException. Sets the attributes defined in the selectors vector. The attributes to be set are specified in the selectors array. Refer to the WebSphere MQ Application Programming Reference for details of the permissible selectors and their corresponding integer values. Some queue attributes can be set using the setXXX() methods defined in MQQueue. Parameters selectors Integer array identifying the attributes with values to be set. intAttrs The array of integer attribute values to be set. These values must be in the same order as the integer attribute selectors in the selectors array. charAttrs The buffer in which the character attributes to be set are concatenated. These values must be in the same order as the character attribute selectors in the selectors array. The length of each character attribute is fixed. Throws MQException if the set fails.
125
MQMessage
MQMessage
java.lang.Object com.ibm.mq.MQMessage
public class MQMessage implements DataInput, DataOutput MQMessage represents both the message descriptor and the data for a WebSphere MQ message. There is group of readXXX methods for reading data from a message, and a group of writeXXX methods for writing data into a message. The format of numbers and strings used by these read and write methods can be controlled by the encoding and characterSet member variables. The remaining member variables contain control information that accompanies the application message data when a message travels between sending and receiving applications. The application can set values into the member variable before putting a message to a queue and can read values after retrieving a message from a queue.
Variables
accountingToken public byte accountingToken[] Part of the identity context of the message; it allows an application to charge for work done as a result of the message. The default value is MQC.MQACT_NONE. applicationIdData public String applicationIdData Part of the identity context of the message; it is information that is defined by the application suite, and can be used to provide additional information about the message or its originator. The default value is . applicationOriginData public String applicationOriginData Information defined by the application that can be used to provide additional information about the origin of the message. The default value is . backoutCount public int backoutCount A count of the number of times the message has previously been returned by an MQQueue.get() call as part of a unit of work, and subsequently backed out. The default value is zero. characterSet public int characterSet The coded character set identifier of character data in the application message data. The behavior of the readString, readLine, and writeString methods is altered accordingly.
126
Using Java
MQMessage
The default value for this field is MQC.MQCCSI_Q_MGR. If the default value is used, CharacterSet 819 (iso-8859-1/latin/ibm819) is assumed. The character set values you can use depend upon the JVM you use. Table 13 shows coded character set identifiers and the characterSet values to use:
Table 13. Character set identifiers characterSet 37 437 500 819 1200 1208 273 277 278 280 284 285 297 420 424 737 775 813 838 850 852 855 856 857 860 861 862 863 864 865 866 868 869 870 871 874 875 912 913 914 915 916 918 920 921 922 930 932 Description ibm037 ibm437 / PC Original ibm500 iso-8859-1 / latin1 / ibm819 Unicode UTF-8 ibm273 ibm277 ibm278 ibm280 ibm284 ibm285 ibm297 ibm420 ibm424 ibm737 / PC Greek ibm775 / PC Baltic iso-8859-7 / greek / ibm813 ibm838 ibm850 / PC Latin 1 ibm852 / PC Latin 2 ibm855 / PC Cyrillic ibm856 ibm857 / PC Turkish ibm860 / PC Portuguese ibm861 / PC Icelandic ibm862 / PC Hebrew ibm863 / PC Canadian French ibm864 / PC Arabic ibm865 / PC Nordic ibm866 / PC Russian ibm868 ibm869 / PC Modern Greek ibm870 ibm871 ibm874 ibm875 iso-8859-2 / latin2 / ibm912 iso-8859-3 / latin3 / ibm913 iso-8859-4 / latin4 / ibm914 iso-8859-5 / cyrillic / ibm915 iso-8859-8 / hebrew / ibm916 ibm918 iso-8859-9 / latin5 / ibm920 ibm921 ibm922 ibm930 PC Japanese
Chapter 9. The WebSphere MQ base Java classes and interfaces
127
MQMessage
Table 13. Character set identifiers (continued) characterSet 933 935 937 939 942 948 949 950 954 964 970 1006 1025 1026 1089 1097 1098 1112 1122 1123 1124 1250 1251 1252 1253 1254 1255 1256 1257 1258 1381 1383 2022 5601 33722 Description ibm933 ibm935 ibm937 ibm939 ibm942 ibm948 ibm949 ibm950 / Big 5 Traditional Chinese EUCJIS ibm964 / CNS 11643 Traditional Chinese ibm970 ibm1006 ibm1025 ibm1026 iso-8859-6 / arabic / ibm1089 ibm1097 ibm1098 ibm1112 ibm1122 ibm1123 ibm1124 Windows Latin 2 Windows Cyrillic Windows Latin 1 Windows Greek Windows Turkish Windows Hebrew Windows Arabic Windows Baltic Windows Vietnamese ibm1381 ibm1383 JIS ksc-5601 Korean ibm33722
correlationId public byte correlationId[] For an MQQueue.get() call, the correlation identifier of the message to be retrieved. Normally the queue manager returns the first message with a message identifier and correlation identifier that match those specified. The special value MQC.MQCI_NONE allows any correlation identifier to match. For an MQQueue.put() call, this specifies the correlation identifier to use. The default value is MQC.MQCI_NONE. encoding public int encoding
128
Using Java
MQMessage
The representation used for numeric values in the application message data; this applies to binary, packed decimal, and floating point data. The behavior of the read and write methods for these numeric formats is altered accordingly. The following encodings are defined for binary integers: MQC.MQENC_INTEGER_NORMAL Big-endian integers, as in Java MQC.MQENC_INTEGER_REVERSED Little-endian integers, as used by PCs. The following encodings are defined for packed-decimal integers: MQC.MQENC_DECIMAL_NORMAL Big-endian packed-decimal, as used by z/OS. MQC.MQENC_DECIMAL_REVERSED Little-endian packed-decimal. The following encodings are defined for floating-point numbers: MQC.MQENC_FLOAT_IEEE_NORMAL Big-endian IEEE floats, as in Java. MQC.MQENC_FLOAT_IEEE_REVERSED Little-endian IEEE floats, as used by PCs. MQC.MQENC_FLOAT_S390 z/OS format floating points. Construct a value for the encoding field by adding together one value from each of these three sections (or using the bitwise OR operator). The default value is:
MQC.MQENC_INTEGER_NORMAL | MQC.MQENC_DECIMAL_NORMAL | MQC.MQENC_FLOAT_IEEE_NORMAL
For convenience, this value is also represented by MQC.MQENC_NATIVE. This setting causes writeInt() to write a big-endian integer, and readInt() to read a big-endian integer. If you set the flag MQC.MQENC_INTEGER_REVERSED flag instead, writeInt() writes a little-endian integer, and readInt() reads a little-endian integer. A loss in precision can occur when converting from IEEE format floating points to zSeries format floating points. expiry public int expiry An expiry time expressed in tenths of a second, set by the application that puts the message. After a messages expiry time has elapsed, it is eligible to be discarded by the queue manager. If the message specified one of the MQC.MQRO_EXPIRATION flags, a report is generated when the message is discarded. The default value is MQC.MQEI_UNLIMITED, meaning that the message never expires. feedback public int feedback
129
MQMessage
Used with a message of type MQC.MQMT_REPORT to indicate the nature of the report. The following feedback codes are defined by the system: v MQC.MQFB_EXPIRATION v MQC.MQFB_COA v MQC.MQFB_COD v MQC.MQFB_QUIT v MQC.MQFB_PAN v MQC.MQFB_NAN v MQC.MQFB_DATA_LENGTH_ZERO v MQC.MQFB_DATA_LENGTH_NEGATIVE v MQC.MQFB_DATA_LENGTH_TOO_BIG v MQC.MQFB_BUFFER_OVERFLOW v MQC.MQFB_LENGTH_OFF_BY_ONE v MQC.MQFB_IIH_ERROR Application-defined feedback values in the range MQC.MQFB_APPL_FIRST to MQC.MQFB_APPL_LAST can also be used. The default value of this field is MQC.MQFB_NONE, indicating that no feedback is provided. format public String format A format name used by the sender of the message to indicate the nature of the data in the message to the receiver. You can use your own format names, but names beginning with the letters MQ have meanings that are defined by the queue manager. The queue manager built-in formats are: MQC.MQFMT_ADMIN Command server request/reply message. MQC.MQFMT_COMMAND_1 Type 1 command reply message. MQC.MQFMT_COMMAND_2 Type 2 command reply message. MQC.MQFMT_DEAD_LETTER_HEADER Dead-letter header. MQC.MQFMT_EVENT Event message. MQC.MQFMT_NONE No format name. MQC.MQFMT_PCF User-defined message in programmable command format. MQC.MQFMT_STRING Message consisting entirely of characters. MQC.MQFMT_TRIGGER Trigger message MQC.MQFMT_XMIT_Q_HEADER Transmission queue header. The default value is MQC.MQFMT_NONE.
130
Using Java
MQMessage
groupId public byte[] groupId A byte string that identifies the message group to which the physical message belongs. The default value is MQC.MQGI_NONE. messageFlags public int messageFlags Flags controlling the segmentation and status of a message. messageId public byte messageId[] For an MQQueue.get() call, this field specifies the message identifier of the message to be retrieved. Normally, the queue manager returns the first message with a message identifier and correlation identifier that match those specified. The special value MQC.MQMI_NONE allows any message identifier to match. For an MQQueue.put() call, this specifies the message identifier to use. If MQC.MQMI_NONE is specified, the queue manager generates a unique message identifier when the message is put. The value of this member variable is updated after the put, to indicate the message identifier that was used. The default value is MQC.MQMI_NONE. messageSequenceNumber public int messageSequenceNumber The sequence number of a logical message within a group. messageType public int messageType Indicates the type of the message. The following values are currently defined by the system: v MQC.MQMT_DATAGRAM v MQC.MQMT_REPLY v MQC.MQMT_REPORT v MQC.MQMT_REQUEST Application-defined values can also be used, in the range MQC.MQMT_APPL_FIRST to MQC.MQMT_APPL_LAST. The default value of this field is MQC.MQMT_DATAGRAM. offset public int offset In a segmented message, the offset of data in a physical message from the start of a logical message. originalLength public int originalLength The original length of a segmented message. persistence public int persistence Message persistence. The following values are defined: v MQC.MQPER_NOT_PERSISTENT
Chapter 9. The WebSphere MQ base Java classes and interfaces
131
MQMessage
v MQC.MQPER_PERSISTENT v MQC.MQPER_PERSISTENCE_AS_Q_DEF The default value is MQC.MQPER_PERSISTENCE_AS_Q_DEF, which takes the persistence for the message from the default persistence attribute of the destination queue. priority public int priority The message priority. The special value MQC.MQPRI_PRIORITY_AS_Q_DEF can also be set in outbound messages, in which case the priority for the message is taken from the default priority attribute of the destination queue. The default value is MQC.MQPRI_PRIORITY_AS_Q_DEF. putApplicationName public String putApplicationName The name of the application that put the message. The default value is . putApplicationType public int putApplicationType The type of application that put the message. This can be a system-defined or user-defined value. The following values are defined by the system: v MQC.MQAT_AIX v MQC.MQAT_CICS v MQC.MQAT_DOS v MQC.MQAT_IMS v MQC.MQAT_MVS v MQC.MQAT_OS2 v MQC.MQAT_OS400 v MQC.MQAT_QMGR v MQC.MQAT_UNIX v MQC.MQAT_WINDOWS v MQC.MQAT_JAVA The default value is the special value MQC.MQAT_NO_CONTEXT, which indicates that no context information is present in the message. putDateTime public GregorianCalendar putDateTime The time and date that the message was put. replyToQueueManagerName public String replyToQueueManagerName The name of the queue manager to which reply or report messages should be sent. The default value is . If the value is on an MQQueue.put() call, the QueueManager fills in the value. replyToQueueName public String replyToQueueName
132
Using Java
MQMessage
The name of the message queue to which the application that issued the get request for the message should send MQC.MQMT_REPLY and MQC.MQMT_REPORT messages. The default value is . report public int report A report is a message about another message. This member variable enables the application sending the original message to specify which report messages are required, whether the application message data is to be included in them, and how to set the message and correlation identifiers in the report or reply. Any, all, or none of the following report types can be requested: v Exception v Expiration v Confirm on arrival v Confirm on delivery For each type, only one of the three corresponding values below should be specified, depending on whether the application message data is to be included in the report message. Note: Values marked with ** in the following list are not supported by z/OS queue managers; do not use them if your application is likely to access a z/OS queue manager, regardless of the platform on which the application is running. The valid values are: v MQC.MQRO_COA v MQC.MQRO_COA_WITH_DATA v MQC.MQRO_COA_WITH_FULL_DATA** v MQC.MQRO_COD v MQC.MQRO_COD_WITH_DATA v MQC.MQRO_COD_WITH_FULL_DATA** v MQC.MQRO_EXCEPTION v MQC.MQRO_EXCEPTION_WITH_DATA v MQC.MQRO_EXCEPTION_WITH_FULL_DATA** v MQC.MQRO_EXPIRATION v MQC.MQRO_EXPIRATION_WITH_DATA v MQC.MQRO_EXPIRATION_WITH_FULL_DATA** You can specify one of the following to control how the message Id is generated for the report or reply message: v MQC.MQRO_NEW_MSG_ID v MQC.MQRO_PASS_MSG_ID You can specify one of the following to control how the correlation Id of the report or reply message is to be set: v MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID v MQC.MQRO_PASS_CORREL_ID You can specify one of the following to control the disposition of the original message when it cannot be delivered to the destination queue: v MQC.MQRO_DEAD_LETTER_Q v MQC.MQRO_DISCARD_MSG **
133
MQMessage
If no report options are specified, the default is:
MQC.MQRO_NEW_MSG_ID | MQC.MQRO_COPY_MSG_ID_TO_CORREL_ID | MQC.MQRO_DEAD_LETTER_Q
You can specify one or both of the following to request that the receiving application sends a positive action or negative action report message. v MQRO_PAN v MQRO_NAN userId public String userId Part of the identity context of the message; it identifies the user that originated this message. The default value is .
Constructors
MQMessage public MQMessage() Creates a new message with default message descriptor information and an empty message buffer.
Methods
clearMessage
public void clearMessage()
Throws IOException. Discards any data in the message buffer and set the data offset back to zero. getDataLength
public int getDataLength()
Throws MQException. The number of bytes of message data remaining to be read. getDataOffset
public int getDataOffset()
Throws IOException. Returns the current cursor position within the message data (the point at which read and write operations take effect). getMessageLength
public int getMessageLength
Throws IOException. The number of bytes of message data in this MQMessage object. getTotalMessageLength public int getTotalMessageLength()
134
Using Java
MQMessage
The total number of bytes in the message as stored on the message queue from which this message was retrieved. When an MQQueue.get() method fails with a message-truncated error code, this method tells you the total size of the message on the queue. See also MQQueue.get on page 156. getVersion public int getVersion() Returns the version of the structure in use. readBoolean
public boolean readBoolean()
Throws IOException. Reads a (signed) byte from the current position in the message buffer. readChar
public char readChar()
Throws IOException, EOFException. Reads a Unicode character from the current position in the message buffer. readDecimal2
public short readDecimal2()
Throws IOException, EOFException. Reads a 2-byte packed decimal number (-999 to 999). The behavior of this method is controlled by the value of the encoding member variable. A value of MQC.MQENC_DECIMAL_NORMAL reads a big-endian packed decimal number; a value of MQC.MQENC_DECIMAL_REVERSED reads a little-endian packed decimal number. readDecimal4
public int readDecimal4()
Throws IOException, EOFException. Reads a 4-byte packed decimal number (-9999999 to 9999999). The behavior of this method is controlled by the value of the encoding member variable. A value of MQC.MQENC_DECIMAL_NORMAL reads a big-endian packed decimal number; a value of MQC.MQENC_DECIMAL_REVERSED reads a little-endian packed decimal number. readDecimal8
public long readDecimal8()
Throws IOException, EOFException. Reads an 8-byte packed decimal number (-999999999999999 to 999999999999999). The behavior of this method is controlled by the encoding member variable. A value of MQC.MQENC_DECIMAL_NORMAL reads a big-endian packed decimal number; a value of MQC.MQENC_DECIMAL_REVERSED reads a little-endian packed decimal number.
Chapter 9. The WebSphere MQ base Java classes and interfaces
135
MQMessage
readDouble
public double readDouble()
Throws IOException, EOFException. Reads a double from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method. Values of MQC.MQENC_FLOAT_IEEE_NORMAL and MQC.MQENC_FLOAT_IEEE_REVERSED read IEEE standard doubles in big-endian and little-endian formats respectively. A value of MQC.MQENC_FLOAT_S390 reads a System/390 format floating point number. readFloat
public float readFloat()
Throws IOException, EOFException. Reads a float from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method. Values of MQC.MQENC_FLOAT_IEEE_NORMAL and MQC.MQENC_FLOAT_IEEE_REVERSED read IEEE standard floats in big-endian and little-endian formats respectively. A value of MQC.MQENC_FLOAT_S390 reads a System/390 format floating point number. readFully
public void readFully(byte b[])
Throws Exception, EOFException. Fills the byte array b with data from the message buffer. readFully
public void readFully(byte b[], int off, int len)
Throws IOException, EOFException. Fills len elements of the byte array b with data from the message buffer, starting at offset off. readInt
public int readInt()
Throws IOException, EOFException. Reads an integer from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method.
136
Using Java
MQMessage
A value of MQC.MQENC_INTEGER_NORMAL reads a big-endian integer; a value of MQC.MQENC_INTEGER_REVERSED reads a little-endian integer. readInt2
public short readInt2()
Throws IOException, EOFException. Synonym for readShort(), provided for cross-language WebSphere MQ API compatibility. readInt4
public int readInt4()
Throws IOException, EOFException. Synonym for readInt(), provided for cross-language WebSphere MQ API compatibility. readInt8
public long readInt8()
Throws IOException, EOFException. Synonym for readLong(), provided for cross-language WebSphere MQ API compatibility. readLine
public String readLine()
Throws IOException. Converts from the codeset identified in the characterSet member variable to Unicode, and then reads in a line that has been terminated by \n, \r, \r\n, or EOF. readLong
public long readLong()
Throws IOException, EOFException. Reads a long from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL reads a big-endian long; a value of MQC.MQENC_INTEGER_REVERSED reads a little-endian long. readObject
public Object readObject()
Throws OptionalDataException, ClassNotFoundException, IOException. Reads an object from the message buffer. The class of the object, the signature of the class, and the value of the non-transient and non-static fields of the class are all read. readShort
Chapter 9. The WebSphere MQ base Java classes and interfaces
137
MQMessage
public short readShort()
Throws IOException, EOFException. Reads a short from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL reads a big-endian short; a value of MQC.MQENC_INTEGER_REVERSED reads a little-endian short. readString
public String readString(int length)
Throws IOException, EOFException. Reads a string in the codeset identified by the characterSet member variable, and convert it into Unicode. Parameters: length The number of characters to read (which may differ from the number of bytes according to the codeset, because some codesets use more than one byte per character).
readUInt2
public int readUInt2()
Throws IOException, EOFException. Synonym for readUnsignedShort(), provided for cross-language WebSphere MQ API compatibility. readUnsignedByte
public int readUnsignedByte()
Throws IOException, EOFException. Reads an unsigned byte from the current position in the message buffer. readUnsignedShort
public int readUnsignedShort()
Throws IOException, EOFException. Reads an unsigned short from the current position in the message buffer. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL reads a big-endian unsigned short; a value of MQC.MQENC_INTEGER_REVERSED reads a little-endian unsigned short. readUTF
public String readUTF()
Throws IOException.
138
Using Java
MQMessage
Reads a UTF string, prefixed by a 2-byte length field, from the current position in the message buffer. resizeBuffer
public void resizeBuffer(int size)
Throws IOException. A hint to the MQMessage object about the size of buffer that might be required for subsequent get operations. If the message currently contains message data, and the new size is less than the current size, the message data is truncated. seek
public void seek(int pos)
Throws IOException. Moves the cursor to the absolute position in the message buffer given by pos. Subsequent reads and writes act at this position in the buffer. Throws EOFException if pos is outside the message data length. setDataOffset
public void setDataOffset(int offset)
Throws IOException. Moves the cursor to the absolute position in the message buffer. This method is a synonym for seek(), and is provided for cross-language compatibility with the other WebSphere MQ APIs. setVersion
public void setVersion(int version)
Specifies which version of the structure to use. Possible values are: v MQC.MQMD_VERSION_1 v MQC.MQMD_VERSION_2 You do not need to call this method unless you want to force the client to use a version 1 structure when connected to a queue manager that is capable of handling version 2 structures. In all other situations, the client determines the correct version of the structure to use by querying the queue managers capabilities. skipBytes
public int skipBytes(int n)
Throws IOException, EOFException. Moves forward n bytes in the message buffer. This method blocks until one of the following occurs: v All the bytes are skipped v The end of message buffer is detected v An exception is thrown Returns the number of bytes skipped, which is always n.
Chapter 9. The WebSphere MQ base Java classes and interfaces
139
MQMessage
write
public void write(int b)
Throws IOException. Writes a byte into the message buffer at the current position. write
public void write(byte b[])
Throws IOException. Writes an array of bytes into the message buffer at the current position. write
public void write(byte b[], int off, int len)
Throws IOException. Writes a series of bytes into the message buffer at the current position. len bytes are written, taken from offset off in the array b. writeBoolean
public void writeBoolean(boolean v)
Throws IOException. Writes a boolean into the message buffer at the current position. writeByte
public void writeByte(int v)
Throws IOException. Writes a byte into the message buffer at the current position. writeBytes
public void writeBytes(String s)
Throws IOException. Writes the string to the message buffer as a sequence of bytes. Each character in the string is written in sequence by discarding its high eight bits. writeChar
public void writeChar(int v)
Throws IOException. Writes a Unicode character into the message buffer at the current position. writeChars
public void writeChars(String s)
Throws IOException.
140
Using Java
MQMessage
Writes a string as a sequence of Unicode characters into the message buffer at the current position. writeDecimal2
public void writeDecimal2(short v)
Throws IOException. Writes a 2-byte packed decimal format number into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_DECIMAL_NORMAL writes a big-endian packed decimal; a value of MQC.MQENC_DECIMAL_REVERSED writes a little-endian packed decimal. Parameters v writeDecimal4
public void writeDecimal4(int v)
Throws IOException. Writes a 4-byte packed decimal format number into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_DECIMAL_NORMAL writes a big-endian packed decimal; a value of MQC.MQENC_DECIMAL_REVERSED writes a little-endian packed decimal. Parameters v writeDecimal8
public void writeDecimal8(long v)
Throws IOException. Writes an 8-byte packed decimal format number into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_DECIMAL_NORMAL writes a big-endian packed decimal; a value of MQC.MQENC_DECIMAL_REVERSED writes a little-endian packed decimal. Parameters: v writeDouble
public void writeDouble(double v)
Throws IOException
141
MQMessage
Writes a double into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. Values of MQC.MQENC_FLOAT_IEEE_NORMAL and MQC.MQENC_FLOAT_IEEE_REVERSED write IEEE standard floats in big-endian and little-endian formats respectively. A value of MQC.MQENC_FLOAT_S390 writes a System/390 format floating point number. Note that the range of IEEE doubles is greater than the range of S/390 double precision floating point numbers, so very large numbers cannot be converted. writeFloat
public void writeFloat(float v)
Throws IOException. Writes a float into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. Values of MQC.MQENC_FLOAT_IEEE_NORMAL and MQC.MQENC_FLOAT_IEEE_REVERSED write IEEE standard floats in big-endian and little-endian formats respectively. A value of MQC.MQENC_FLOAT_S390 writes a System/390 format floating point number. writeInt
public void writeInt(int v)
Throws IOException. Writes an integer into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL writes a big-endian integer; a value of MQC.MQENC_INTEGER_REVERSED writes a little-endian integer. writeInt2
public void writeInt2(int v)
Throws IOException. Synonym for writeShort(), provided for cross-language WebSphere MQ API compatibility. writeInt4
public void writeInt4(int v)
Throws IOException. Synonym for writeInt(), provided for cross-language WebSphere MQ API compatibility. writeInt8
public void writeInt8(long v)
142
Using Java
MQMessage
Throws IOException. Synonym for writeLong(), provided for cross-language WebSphere MQ API compatibility. writeLong
public void writeLong(long v)
Throws IOException. Writes a long into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL writes a big-endian long; a value of MQC.MQENC_INTEGER_REVERSED writes a little-endian long. writeObject
public void writeObject(Object obj)
Throws IOException. Writes the specified object to the message buffer. The class of the object, the signature of the class, and the values of the non-transient and non-static fields of the class and all its supertypes are all written. writeShort
public void writeShort(int v)
Throws IOException. Writes a short into the message buffer at the current position. The value of the encoding member variable determines the behavior of this method. A value of MQC.MQENC_INTEGER_NORMAL writes a big-endian short; a value of MQC.MQENC_INTEGER_REVERSED writes a little-endian short. writeString
public void writeString(String str)
Throws IOException. Writes a string into the message buffer at the current position, converting it to the codeset identified by the characterSet member variable. writeUTF
public void writeUTF(String str)
Throws IOException. Writes a UTF string, prefixed by a 2-byte length field, into the message buffer at the current position.
143
MQMessageTracker
MQMessageTracker
java.lang.Object com.ibm.mq.MQMessageTracker
public abstract class MQMessageTracker extends Object Note: You can use this class only when connected to a WebSphere MQ queue manager. This class is inherited by MQDistributionListItem (on page 109) where it is used to tailor message parameters for a given destination in a distribution list.
Variables
accountingToken public byte accountingToken[] Part of the identity context of the message. It allows an application to charge for work done as a result of the message. The default value is MQC.MQACT_NONE. correlationId public byte correlationId[] The correlation identifier to use when the message is put. The default value is MQC.MQCI_NONE. feedback public int feedback Used with a message of type MQC.MQMT_REPORT to indicate the nature of the report. The following feedback codes are defined by the system: v MQC.MQFB_BUFFER_OVERFLOW v MQC.MQFB_COA v MQC.MQFB_COD v MQC.MQFB_DATA_LENGTH_NEGATIVE v MQC.MQFB_DATA_LENGTH_TOO_BIG v MQC.MQFB_DATA_LENGTH_ZERO v MQC.MQFB_EXPIRATION v MQC.MQFB_IIH_ERROR v MQC.MQFB_LENGTH_OFF_BY_ONE v MQC.MQFB_NAN v MQC.MQFB_NONE v MQC.MQFB_PAN v MQC.MQFB_QUIT Application-defined feedback values in the range MQC.MQFB_APPL_FIRST to MQC.MQFB_APPL_LAST can also be used. The default value of this field is MQC.MQFB_NONE, indicating that no feedback is provided. groupId public byte[] groupId
144
Using Java
MQMessageTracker
A byte string that identifies the message group to which the physical message belongs. The default value is MQC.MQGI_NONE. messageId public byte messageId[] The message identifier to use when the message is put. If MQC.MQMI_NONE is specified, the queue manager generates a unique message identifier when the message is put. The value of this member variable is updated after the put to indicate the message identifier that was used. The default value is MQC.MQMI_NONE.
145
MQPoolServices
MQPoolServices
java.lang.Object com.ibm.mq.MQPoolServices
public class MQPoolServices extends Object Note: Normally, applications do not use this class. The MQPoolServices class can be used by implementations of ConnectionManager that are intended for use as the default ConnectionManager for WebSphere MQ connections. A ConnectionManager can construct an MQPoolServices object and, through it, register a listener. This listener receives events that relate to the set of MQPoolTokens that MQEnvironment manages. The ConnectionManager can use this information to perform any necessary startup or cleanup work. See also MQPoolServicesEvent on page 147 and MQPoolServicesEventListener on page 180.
Constructors
MQPoolServices
public MQPoolServices()
Methods
addMQPoolServicesEventListener
public void addMQPoolServicesEventListener (MQPoolServicesEventListener listener)
Adds an MQPoolServicesEventListener. The listener receives an event whenever a token is added or removed from the set of MQPoolTokens that MQEnvironment controls, or whenever the default ConnectionManager changes. getTokenCount
public int getTokenCount()
Returns the number of MQPoolTokens that are currently registered with MQEnvironment. removeMQPoolServicesEventListener
public void removeMQPoolServicesEventListener (MQPoolServicesEventListener listener)
Removes an MQPoolServicesEventListener.
146
Using Java
MQPoolServicesEvent
MQPoolServicesEvent
java.lang.Object java.util.EventObject com.ibm.mq.MQPoolServicesEvent
Note: Normally, applications do not use this class. An MQPoolServicesEvent is generated whenever an MQPoolToken is added to, or removed from, the set of tokens that MQEnvironment controls. An event is also generated when the default ConnectionManager is changed. See also MQPoolServices on page 146 and MQPoolServicesEventListener on page 180.
Variables
DEFAULT_POOL_CHANGED public static final int DEFAULT_POOL_CHANGED The event ID used when the default ConnectionManager changes. ID protected int ID The event ID. Valid values are: TOKEN_ADDED TOKEN_REMOVED DEFAULT_POOL_CHANGED TOKEN_ADDED public static final int TOKEN_ADDED The event ID used when an MQPoolToken is added to the set. TOKEN_REMOVED public static final int TOKEN_REMOVED The event ID used when an MQPoolToken is removed from the set. token protected MQPoolToken token The token. When the event ID is DEFAULT_POOL_CHANGED, this is null.
Constructors
MQPoolServicesEvent
public MQPoolServicesEvent(Object source, int eid)
147
MQPoolServicesEvent
Methods
getId public int getId() Gets the event ID. Returns The event ID, with one of the following values: DEFAULT_POOL_CHANGED TOKEN_ADDED TOKEN_REMOVED getToken public MQPoolToken getToken() Returns the token that was added to, or removed from, the set. If the event ID is DEFAULT_POOL_CHANGED, this is null.
148
Using Java
MQPoolToken
MQPoolToken
java.lang.Object com.ibm.mq.MQPoolToken
public class MQPoolToken extends Object Use an MQPoolToken to enable the default connection pool. MQPoolTokens are registered with the MQEnvironment class before an application component connects to WebSphere MQ. Later, they are deregistered when the component has finished using WebSphere MQ. Typically, the default ConnectionManager is active while the set of registered MQPoolTokens is not empty. MQPoolToken provides no methods or variables. ConnectionManager providers can choose to extend MQPoolToken so that hints can be passed to the ConnectionManager. See MQEnvironment.addConnectionPoolToken on page 114 and MQEnvironment.removeConnectionPoolToken on page 115.
Constructors
MQPoolToken
public MQPoolToken()
149
MQProcess
MQProcess
java.lang.Object com.ibm.mq.MQManagedObject com.ibm.mq.MQProcess
public class MQProcess extends MQManagedObject. (See page 123.) MQProcess provides inquire operations for WebSphere MQ processes.
Constructors
MQProcess
public MQProcess(MQQueueManager qMgr, String processName, int openOptions, String queueManagerName, String alternateUserId) throws MQException
Access a process on the queue manager qMgr. See accessProcess in the MQQueueManager on page 163 for details of the remaining parameters.
Methods
close
public synchronized void close()
Throws MQException. Overrides MQManagedObject.close on page 124. getApplicationId public String getApplicationId() A character string that identifies the application to be started. This information is for use by a trigger monitor application that processes messages on the initiation queue; the information is sent to the initiation queue as part of the trigger message. Throws MQException if you call this method after you have closed the process. getApplicationType public int getApplicationType() Throws MQException (see page 117). Identifies the nature of the program to be started in response to the receipt of a trigger message. The application type can take any value, but the following values are recommended for standard types: v MQC.MQAT_AIX v MQC.MQAT_CICS v MQC.MQAT_DOS v MQC.MQAT_IMS v MQC.MQAT_MVS v MQC.MQAT_OS2
150
Using Java
MQProcess
MQC.MQAT_OS400 MQC.MQAT_UNIX MQC.MQAT_WINDOWS MQC.MQAT_WINDOWS_NT MQC.MWQAT_USER_FIRST (lowest value for user-defined application type) v MQC.MQAT_USER_LAST (highest value for user-defined application type) v v v v v getEnvironmentData
public String getEnvironmentData()
Throws MQException. A string containing environment-related information pertaining to the application to be started. getUserData
public String getUserData()
Throws MQException. A string containing user information relevant to the application to be started.
151
MQPutMessageOptions
MQPutMessageOptions
java.lang.Object com.ibm.mq.MQPutMessageOptions
public class MQPutMessageOptions extends Object This class contains options that control the behavior of MQQueue.put(). Note: The behavior of some of the options available in this class depends on the environment in which they are used. These elements are marked with a *. See Chapter 8, Environment-dependent behavior, on page 95 for more details.
Variables
contextReference public MQQueue ContextReference An input field that indicates the source of the context information. If the options field includes MQC.MQPMO_PASS_IDENTITY_CONTEXT, or MQC.MQPMO_PASS_ALL_CONTEXT, set this field to refer to the MQQueue from which to take the context information. The initial value of this field is null. invalidDestCount * public int invalidDestCount An output field set by the queue manager to the number of messages that could not be sent to queues in a distribution list. The count includes queues that failed to open as well as queues that were opened successfully, but for which the put operation failed. This field is also set when opening a single queue that is not part of a distribution list. knownDestCount * public int knownDestCount An output field set by the queue manager to the number of messages that the current call has sent successfully to queues that resolve to local queues. This field is also set when opening a single queue that is not part of a distribution list. options public int options Options that control the action of MQQueue.put. Any or none of the following values can be specified. If more than one option is required, the values can be added together or combined using the bitwise OR operator. MQC.MQPMO_DEFAULT_CONTEXT Associate default context with the message. MQC.MQPMO_FAIL_IF_QUIESCING Fail if the queue manager is quiescing. MQC.MQPMO_LOGICAL_ORDER* Put logical messages and segments in message groups into their logical order.
152
Using Java
MQPutMessageOptions
MQC.MQPMO_NEW_CORREL_ID* Generate a new correlation id for each sent message. MQC.MQPMO_NEW_MSG_ID* Generate a new message id for each sent message. MQC.MQPMO_NONE No options specified. Do not use in conjunction with other options. MQC.MQPMO_NO_CONTEXT No context is to be associated with the message. MQC.MQPMO_NO_SYNCPOINT Put a message without syncpoint control. Note that, if the syncpoint control option is not specified, a default of no syncpoint is assumed. This applies to all supported platforms. MQC.MQPMO_PASS_ALL_CONTEXT Pass all context from an input queue handle. MQC.MQPMO_PASS_IDENTITY_CONTEXT Pass identity context from an input queue handle. MQC.MQPMO_SET_ALL_CONTEXT Set all context from the application. MQC.MQPMO_SET_IDENTITY_CONTEXT Set identity context from the application. MQC.MQPMO_SYNCPOINT Put a message with syncpoint control. The message is not visible outside the unit of work until the unit of work is committed. If the unit of work is backed out, the message is deleted. recordFields * public int recordFields Flags indicating which fields are to be customized in each queue when putting a message to a distribution list. One or more of the following flags can be specified: MQC.MQPMRF_ACCOUNTING_TOKEN Use the accountingToken attribute in the MQDistributionListItem. MQC.MQPMRF_CORREL_ID Use the correlationId attribute in the MQDistributionListItem. MQC.MQPMRF_FEEDBACK Use the feedback attribute in the MQDistributionListItem. MQC.MQPMRF_GROUP_ID Use the groupId attribute in the MQDistributionListItem. MQC.MQPMRF_MSG_ID Use the messageId attribute in the MQDistributionListItem. The special value MQC.MQPMRF_NONE indicates that no fields are to be customized. resolvedQueueManagerName public String resolvedQueueManagerName An output field set by the queue manager to the name of the queue manager that owns the queue specified by the remote queue name. This
153
MQPutMessageOptions
might be different from the name of the queue manager from which the queue was accessed if the queue is a remote queue. resolvedQueueName public String resolvedQueueName An output field that is set by the queue manager to the name of the queue on which the message is placed. This might be different from the name used to open the queue if the opened queue was an alias or model queue. unknownDestCount * public int unknownDestCount An output field set by the queue manager to the number of messages that the current call has sent successfully to queues that resolve to remote queues. This field is also set when opening a single queue that is not part of a distribution list.
Constructors
MQPutMessageOptions public MQPutMessageOptions() Construct a new MQPutMessageOptions object with no options set, and a blank resolvedQueueName and resolvedQueueManagerName.
154
Using Java
MQQueue
MQQueue
java.lang.Object com.ibm.mq.MQManagedObject com.ibm.mq.MQQueue
public class MQQueue extends MQManagedObject. (See page 123.) MQQueue provides inquire, set, put, and get operations for WebSphere MQ queues. The inquire and set capabilities are inherited from MQ.MQManagedObject. See also MQQueueManager.accessQueue on page 168.
Constructors
MQQueue
public MQQueue(MQQueueManager qMgr, String queueName, int openOptions, String queueManagerName, String dynamicQueueName, String alternateUserId ) throws MQException
Access a queue on the queue manager qMgr. See MQQueueManager.accessQueue on page 168 for details of the remaining parameters.
Methods
close
public synchronized void close()
Throws MQException. Retrieves a message from the queue, up to a maximum specified message size. This method takes an MQMessage object as a parameter. It uses some of the fields in the object as input parameters, in particular the messageId and correlationId, so it is important to ensure that these are set as required. (See Message on page 349.) If the get fails, the MQMessage object is unchanged. If it succeeds, the message descriptor (member variables) and message data portions of the MQMessage are completely replaced with the message descriptor and message data from the incoming message.
Chapter 9. The WebSphere MQ base Java classes and interfaces
155
MQQueue
All calls to WebSphere MQ from a given MQQueueManager are synchronous. Therefore, if you perform a get with wait, all other threads using the same MQQueueManager are blocked from making further WebSphere MQ calls until the get completes. If you need multiple threads to access WebSphere MQ simultaneously, each thread must create its own MQQueueManager object. Parameters message An input/output parameter containing the message descriptor information and the returned message data. getMessageOptions Options controlling the action of the get. (See MQGetMessageOptions on page 119.) Using option MQC.MQGMO_CONVERT might result in an exception with reason code MQException.MQRC_CONVERTED_STRING_TOO_BIG when converting from single byte character codes to double byte codes. In this case, the message is copied into the buffer but remains encoded using its original character set. MaxMsgSize The largest message this call can receive. If the message on the queue is larger than this size, one of two things occurs: 1. If the MQC.MQGMO_ACCEPT_TRUNCATED_MSG flag is set in the options member variable of the MQGetMessageOptions object, the message is filled with as much of the message data as will fit in the specified buffer size, and an exception is thrown with completion code MQException.MQCC_WARNING and reason code MQException.MQRC_TRUNCATED_MSG_ACCEPTED. 2. If the MQC.MQGMO_ACCEPT_TRUNCATED_MSG flag is not set, the message is left on the queue and an MQException is raised with completion code MQException.MQCC_WARNING and reason code MQException.MQRC_TRUNCATED_MSG_FAILED. Throws MQException if the get fails. get
public synchronized void get(MQMessage message, MQGetMessageOptions getMessageOptions)
Throws MQException. Retrieves a message from the queue, regardless of the size of the message. For large messages, the get method might have to issue two calls to WebSphere MQ on your behalf, one to establish the required buffer size and one to get the message data itself. This method takes an MQMessage object as a parameter. It uses some of the fields in the object as input parameters, in particular the messageId and correlationId, so it is important to ensure that these are set as required. (See Message on page 349.)
156
Using Java
MQQueue
If the get fails, the MQMessage object is unchanged. If it succeeds, the message descriptor (member variables) and message data portions of the MQMessage are completely replaced with the message descriptor and message data from the incoming message. All calls to WebSphere MQ from a given MQQueueManager are synchronous. Therefore, if you perform a get with wait, all other threads using the same MQQueueManager are blocked from making further WebSphere MQ calls until the get completes. If you need multiple threads to access WebSphere MQ simultaneously, each thread must create its own MQQueueManager object. Parameters message An input/output parameter containing the message descriptor information and the returned message data. getMessageOptions Options controlling the action of the get. (See MQGetMessageOptions on page 119 for details.) Throws MQException if the get fails. get
public synchronized void get(MQMessage message)
A simplified version of the get method previously described. Parameters MQMessage An input/output parameter containing the message descriptor information and the returned message data. This method uses a default instance of MQGetMessageOptions to do the get. The message option used is MQGMO_NOWAIT. getCreationDateTime
public GregorianCalendar getCreationDateTime()
Throws MQException. The date and time that this queue was created. getQueueType public int getQueueType() Throws MQException Returns The type of this queue with one of the following values: v MQC.MQQT_ALIAS v MQC.MQQT_LOCAL v MQC.MQQT_REMOTE v MQC.MQQT_CLUSTER getCurrentDepth
public int getCurrentDepth()
157
MQQueue
Throws MQException. Gets the number of messages currently on the queue. This value is incremented during a put call, and during backout of a get call. It is decremented during a non-browse get and during backout of a put call. getDefinitionType
public int getDefinitionType()
Throws MQException. How the queue was defined. Returns One of the following: v MQC.MQQDT_PREDEFINED v MQC.MQQDT_PERMANENT_DYNAMIC v MQC.MQQDT_TEMPORARY_DYNAMIC getInhibitGet
public int getInhibitGet()
Throws MQException. Whether get operations are allowed for this queue. Returns The possible values are: v MQC.MQQA_GET_INHIBITED v MQC.MQQA_GET_ALLOWED getInhibitPut
public int getInhibitPut()
Throws MQException. Whether put operations are allowed for this queue. Returns One of the following: v MQC.MQQA_PUT_INHIBITED v MQC.MQQA_PUT_ALLOWED getMaximumDepth
public int getMaximumDepth()
Throws MQException. The maximum number of messages that can exist on the queue at any one time. An attempt to put a message to a queue that already contains this many messages fails with reason code MQException.MQRC_Q_FULL. getMaximumMessageLength
public int getMaximumMessageLength()
Throws MQException.
158
Using Java
MQQueue
The maximum length of the application data that can exist in each message on this queue. An attempt to put a message larger than this value fails with reason code MQException.MQRC_MSG_TOO_BIG_FOR_Q. getOpenInputCount
public int getOpenInputCount()
Throws MQException. The number of handles that are currently valid for removing messages from the queue. This is the total number of such handles known to the local queue manager, not just those created by the WebSphere MQ classes for Java (using accessQueue). getOpenOutputCount
public int getOpenOutputCount()
Throws MQException. The number of handles that are currently valid for adding messages to the queue. This is the total number of such handles known to the local queue manager, not just those created by the WebSphere MQ classes for Java (using accessQueue). getShareability
public int getShareability()
Throws MQException. Whether the queue can be opened for input multiple times. Returns One of the following: v MQC.MQQA_SHAREABLE v MQC.MQQA_NOT_SHAREABLE getTriggerControl
public int getTriggerControl()
Throws MQException. Whether trigger messages are written to an initiation queue, to start an application to service the queue. Returns The possible values are: v MQC.MQTC_OFF v MQC.MQTC_ON getTriggerData
public String getTriggerData()
Throws MQException. The free-format data that the queue manager inserts into the trigger message when a message arriving on this queue causes a trigger message to be written to the initiation queue. getTriggerDepth
Chapter 9. The WebSphere MQ base Java classes and interfaces
159
MQQueue
public int getTriggerDepth()
Throws MQException. The number of messages that have to be on the queue before a trigger message is written when trigger type is set to MQC.MQTT_DEPTH. getTriggerMessagePriority
public int getTriggerMessagePriority()
Throws MQException. The message priority below which messages do not contribute to the generation of trigger messages (that is, the queue manager ignores these messages when deciding whether to generate a trigger). A value of zero causes all messages to contribute to the generation of trigger messages. getTriggerType
public int getTriggerType()
Throws MQException. The conditions under which trigger messages are written as a result of messages arriving on this queue. Returns The possible values are: v MQC.MQTT_NONE v MQC.MQTT_FIRST v MQC.MQTT_EVERY v MQC.MQTT_DEPTH put
public synchronized void put(MQMessage message, MQPutMessageOptions putMessageOptions)
Throws MQException. Places a message onto the queue. Note: For simplicity and performance, if you want to put just a single message to a queue, use the put() method on your MQQueueManager object. For this you do not need to have an MQQueue object. See MQQueueManager.put on page 174. This method takes an MQMessage object as a parameter. The message descriptor properties of this object can be altered as a result of this method. The values that they have immediately after the completion of this method are the values that were put onto the WebSphere MQ queue. Modifications to the MQMessage object after the put has completed do not affect the actual message on the WebSphere MQ queue. A put updates the messageId and correlationId. Consider this when making further calls to put/get using the same MQMessage object. Also, calling put does not clear the message data, so:
160
Using Java
MQQueue
msg.writeString("a"); q.put(msg,pmo); msg.writeString("b"); q.put(msg,pmo);
puts two messages. The first contains a and the second ab. Parameters message Message Buffer containing the Message Descriptor data and message to be sent. putMessageOptions Options controlling the action of the put. (See MQPutMessageOptions on page 152) Throws MQException if the put fails. put
public synchronized void put(MQMessage message)
A simplified version of the put method previously described. Parameters MQMessage Message Buffer containing the Message Descriptor data and message to be sent. This method uses a default instance of MQPutMessageOptions to do the put. setInhibitGet
public void setInhibitGet(int inhibit)
Throws MQException. Controls whether get operations are allowed for this queue. The permissible values are: v MQC.MQQA_GET_INHIBITED v MQC.MQQA_GET_ALLOWED setInhibitPut
public void setInhibitPut(int inhibit)
Throws MQException. Controls whether put operations are allowed for this queue. The permissible values are: v MQC.MQQA_PUT_INHIBITED v MQC.MQQA_PUT_ALLOWED setTriggerControl
public void setTriggerControl(int trigger)
Throws MQException.
161
MQQueue
Controls whether trigger messages are written to an initiation queue to start an application to service the queue. The permissible values are: v MQC.MQTC_OFF v MQC.MQTC_ON setTriggerData
public void setTriggerData(String data)
Throws MQException. Sets the free-format data that the queue manager inserts into the trigger message when a message arriving on this queue causes a trigger message to be written to the initiation queue. The maximum permissible length of the string is given by MQC.MQ_TRIGGER_DATA_LENGTH. setTriggerDepth
public void setTriggerDepth(int depth)
Throws MQException. Sets the number of messages that have to be on the queue before a trigger message is written when trigger type is set to MQC.MQTT_DEPTH. setTriggerMessagePriority
public void setTriggerMessagePriority(int priority)
Throws MQException. Sets the message priority below which messages do not contribute to the generation of trigger messages (that is, the queue manager ignores these messages when deciding whether a trigger should be generated). A value of zero causes all messages to contribute to the generation of trigger messages. setTriggerType
public void setTriggerType(int type)
Throws MQException. Sets the conditions under which trigger messages are written as a result of messages arriving on this queue. The possible values are: v MQC.MQTT_NONE v MQC.MQTT_FIRST v MQC.MQTT_EVERY v MQC.MQTT_DEPTH
162
Using Java
MQQueueManager
MQQueueManager
java.lang.Object com.ibm.mq.MQManagedObject com.ibm.mq.MQQueueManager
public class MQQueueManager extends MQManagedObject. (See page 123.) Note: The behavior of some of the options available in this class depends on the environment in which they are used. These elements are marked with a *. See Chapter 8, Environment-dependent behavior, on page 95 for details.
Variables
isConnected public boolean isConnected True if the connection to the queue manager is still open.
Constructors
MQQueueManager
public MQQueueManager(String queueManagerName)
Throws MQException. Creates a connection to the named queue manager. Note: When using WebSphere MQ classes for Java, the hostname, channel name, and port to use during the connection request are specified in the MQEnvironment class. This must be done before calling this constructor. The following example shows a connection to a queue manager MYQM, running on a machine with hostname fred.mq.com.
MQEnvironment.hostname = "fred.mq.com"; // host to connect to MQEnvironment.port = 1414; // port to connect to. // If I dont set this, // it defaults to 1414 // (the default WebSphere MQ port) MQEnvironment.channel = "channel.name"; // the CASE-SENSITIVE // name of the // SVR CONN channel on // the queue manager MQQueueManager qMgr = new MQQueueManager("MYQM");
If the queue manager name is left blank (null or ), a connection is made to the default queue manager. See also MQEnvironment on page 110.
163
MQQueueManager
MQQueueManager
public MQQueueManager(String queueManagerName, MQConnectionManager cxManager)
Throws MQException. Connects to the specified Queue Manager, using the properties in MQEnvironment. The specified MQConnectionManager manages the connection. MQQueueManager
public MQQueueManager(String queueManagerName, ConnectionManager cxManager)
Throws MQException. Connects to the specified Queue Manager, using the properties in MQEnvironment. The specified ConnectionManager manages the connection. If the value of cxManager is null, then the default ConnectionManger is used. This constructor requires a JVM at at least Java 2 v1.3, with at least JAAS 1.0 installed. MQQueueManager
public MQQueueManager(String queueManagerName, int options)
| |
Throws MQException. This version of the constructor is intended for use only in bindings mode. It uses the extended connection API (MQCONNX) to connect to the queue manager. The options parameter allows you to choose fast or normal bindings. Possible values are: v MQC.MQCNO_FASTPATH_BINDING for fast bindings *. v MQC.MQCNO_STANDARD_BINDING for normal bindings. MQQueueManager
public MQQueueManager(String queueManagerName, int options, MQConnectionManager cxManager)
Throws MQException. Performs an MQCONNX, passing the supplied options. The specified MQConnectionManager manages the connection. MQQueueManager
public MQQueueManager(String queueManagerName, int options, ConnectionManager cxManager)
Throws MQException. Performs an MQCONNX, passing the supplied options. The specified ConnectionManager manages the connection.
164
Using Java
MQQueueManager
This constructor requires a JVM at at least Java 2 v1.3, with at least JAAS 1.0 installed. MQQueueManager
public MQQueueManager(String queueManagerName, java.util.Hashtable properties)
The properties parameter takes a series of key/value pairs that describe the WebSphere MQ environment for this particular queue manager. These properties, where specified, override the values set by the MQEnvironment class, and allow the individual properties to be set on a queue manager by queue manager basis. See MQEnvironment.properties on page 111. MQQueueManager
public MQQueueManager(String queueManagerName, Hashtable properties, MQConnectionManager cxManager)
Throws MQException. This constructor connects to the named Queue Manager, using the supplied hash table of properties to override those in MQEnvironment. The specified MQConnectionManager manages the connection. MQQueueManager
public MQQueueManager(String queueManagerName, Hashtable properties, ConnectionManager cxManager)
Throws MQException. Connects to the named Queue Manager, using the supplied hash table of properties to override those in MQEnvironment. The specified ConnectionManager manages the connection. This constructor requires a JVM at at least Java 2 v1.3, with at least JAAS 1.0 installed.
165
MQQueueManager
Methods
accessDistributionList
public synchronized MQDistributionList accessDistributionList (MQDistributionListItem[] litems, int openOptions, String alternateUserId)
Throws MQException. Parameters litems The items to be included in the distribution list.
openOptions Options that control the opening of the distribution list. alternateUserId If MQOO_ALTERNATE_USER_AUTHORITY is specified in the openOptions parameter, specifies the alternate user identifier that is used to check the authorization for the open. If MQOO_ALTERNATE_USER_AUTHORITY is not specified, this parameter can be left blank (or null). Returns A newly-created MQDistributionList, which is open and ready for put operations. Throws MQException if the open fails. See also MQQueueManager.accessQueue on page 168. accessDistributionList This is a simplified version of the AccessDistributionList method previously described.
public synchronized MQDistributionList accessDistributionList (MQDistributionListItem[] litems, int openOptions)
Throws MQException. Parameters litems The items to be included in the distribution list.
openOptions Options that control the opening of the distribution list. See the full description of accessDistributionList above for details of the other parameters. alternateUserId is set to .
166
Using Java
MQQueueManager
accessProcess
public synchronized MQProcess accessProcess (String processName, int openOptions, String queueManagerName, String alternateUserId)
Throws MQException. Establishes access to a WebSphere MQ process on this queue manager to inquire about the process attributes. Parameters processName Name of process to open. openOptions Options that control the opening of the process. Inquire is automatically added to the options specified, so there is no need to specify it explicitly. Valid options are: MQC.MQOO_ALTERNATE_USER_AUTHORITY Validate with the specified user ID MQC.MQOO_FAIL_IF_QUIESCING Fail if the queue manager is quiescing If more than one option is required, the values can be added together or combined using the bitwise OR operator. See the WebSphere MQ Application Programming Reference for a fuller description of these options. queueManagerName Name of the queue manager on which the process is defined. Applications should leave this parameter blank or null. alternateUserId If MQOO_ALTERNATE_USER_AUTHORITY is specified in the openOptions parameter, this parameter specifies the alternate user identifier that is used to check the authorization for the open. If MQOO_ALTERNATE_USER_AUTHORITY is not specified, this parameter can be left blank (or null). accessProcess This is a simplified version of the AccessProcess method previously described.
public synchronized MQProcess accessProcess (String processName, int openOptions)
167
MQQueueManager
Parameters processName The name of the process to open. openOptions Options that control the opening of the process. See the full description of accessProcess on page 167 above for details of the other options. queueManagerName and alternateUserId are set to . accessQueue
public synchronized MQQueue accessQueue (String queueName, int openOptions, String queueManagerName, String dynamicQueueName, String alternateUserId)
Throws MQException. Establishes access to a WebSphere MQ queue on this queue manager to get or browse messages, put messages, inquire about the attributes of the queue or set the attributes of the queue. If the queue named is a model queue, a dynamic local queue is created. The name of the created queue can be determined from the name attribute of the returned MQQueue object. Parameters queueName Name of queue to open. openOptions Options that control the opening of the queue. Valid options are: MQC.MQOO_ALTERNATE_USER_AUTHORITY Validate with the specified user identifier. MQC.MQOO_BIND_AS_QDEF Use default binding for queue. MQC.MQOO_BIND_NOT_FIXED Do not bind to a specific destination. MQC.MQOO_BIND_ON_OPEN Bind handle to destination when queue is opened. MQC.MQOO_BROWSE Open to browse message. MQC.MQOO_FAIL_IF_QUIESCING Fail if the queue manager is quiescing. MQC.MQOO_INPUT_AS_Q_DEF Open to get messages using queue-defined default. MQC.MQOO_INPUT_SHARED Open to get messages with shared access.
168
Using Java
MQQueueManager
MQC.MQOO_INPUT_EXCLUSIVE Open to get messages with exclusive access. MQC.MQOO_INQUIRE Open for inquiry - required if you wish to query properties. MQC.MQOO_OUTPUT Open to put messages. MQC.MQOO_PASS_ALL_CONTEXT Allow all context to be passed. MQC.MQOO_PASS_IDENTITY_CONTEXT Allow identity context to be passed. MQC.MQOO_SAVE_ALL_CONTEXT Save context when message retrieved*. MQC.MQOO_SET Open to set attributes. MQC.MQOO_SET_ALL_CONTEXT Allows all context to be set. MQC.MQOO_SET_IDENTITY_CONTEXT Allows identity context to be set. If more than one option is required, the values can be added together or combined using the bitwise OR operator. See the WebSphere MQ Application Programming Reference for a fuller description of these options. queueManagerName Name of the queue manager on which the queue is defined. A name that is entirely blank or null denotes the queue manager to which this MQQueueManager object is connected. dynamicQueueName This parameter is ignored unless queueName specifies the name of a model queue. If it does, this parameter specifies the name of the dynamic queue to be created. A blank or null name is not valid if queueName specifies the name of a model queue. If the last non-blank character in the name is an asterisk (*), the queue manager replaces the asterisk with a string of characters that guarantees that the name generated for the queue is unique on this queue manager. alternateUserId If MQOO_ALTERNATE_USER_AUTHORITY is specified in the openOptions parameter, this parameter specifies the alternate user identifier that is used to check the authorization for the open. If MQOO_ALTERNATE_USER_AUTHORITY is not specified, this parameter can be left blank (or null). Returns MQQueue that has been successfully opened. Throws MQException if the open fails.
169
MQQueueManager
accessQueue
public synchronized MQQueue accessQueue (String queueName, int openOptions)
Throws MQException if you call this method after disconnecting from the queue manager. Parameters queueName Name of queue to open openOptions Options that control the opening of the queue See the description of MQQueueManager.accessQueue on page 168 for details of the parameters. For this version of the method, queueManagerName, dynamicQueueName, and alternateUserId are set to . Returns MQProcess that has been successfully opened. Throws MQException if the open fails. backout
public synchronized void backout()
Throws MQException. Calling this method indicates to the queue manager that all the message gets and puts that have occurred since the last syncpoint are to be backed out. Messages put as part of a unit of work (with the MQC.MQPMO_SYNCPOINT flag set in the options field of MQPutMessageOptions) are deleted; messages retrieved as part of a unit of work (with the MQC.MQGMO_SYNCPOINT flag set in the options field of MQGetMessageOptions) are reinstated on the queue. See also the description of the commit method. begin* (bindings connection only) public synchronized void begin() Throws MQException. This method is supported only by the WebSphere MQ classes for Java in bindings mode. It signals to the queue manager that a new unit of work is starting. For a complete description of using this method, see JTA/JDBC coordination using WebSphere MQ base Java on page 87. Do not use this method for applications that use local one-phase transactions.
170
Using Java
MQQueueManager
commit
public synchronized void commit()
Throws MQException. Calling this method indicates to the queue manager that the application has reached a syncpoint, and that all the message gets and puts that have occurred since the last syncpoint are to be made permanent. Messages put as part of a unit of work (with the MQC.MQPMO_SYNCPOINT flag set in the options field of MQPutMessageOptions) are made available to other applications. Messages retrieved as part of a unit of work (with the MQC.MQGMO_SYNCPOINT flag set in the options field of MQGetMessageOptions) are deleted. See also the description of the backout method. disconnect
public synchronized void disconnect()
Throws MQException. Terminates the connection to the queue manager. All open queues and processes accessed by this queue manager are closed, and become unusable. When you have disconnected from a queue manager, the only way to reconnect is to create a new MQQueueManager object. Normally, any work performed as part of a unit of work is committed. However, if this connection is managed by a ConnectionManager, rather than an MQConnectionManager, the unit of work might be rolled back. getCharacterSet
public int getCharacterSet()
Throws MQException. Returns the CCSID (Coded Character Set Identifier) of the queue managers codeset. This defines the character set used by the queue manager for all character string fields in the application programming interface. Throws MQException if you call this method after disconnecting from the queue manager. getCommandInputQueueName
public String getCommandInputQueueName()
Throws MQException. Returns the name of the command input queue defined on the queue manager. This is a queue to which applications can send commands, if authorized to do so. Throws MQException if you call this method after disconnecting from the queue manager.
171
MQQueueManager
getCommandLevel
public int getCommandLevel()
Throws MQException. Indicates the level of system control commands supported by the queue manager. The set of system control commands that correspond to a particular command level varies according to the architecture of the platform on which the queue manager is running. See the WebSphere MQ documentation for your platform for further details. Throws MQException if you call this method after disconnecting from the queue manager. Returns One of the MQC.MQCMDL_LEVEL_xxx constants getDistributionListCapable
public boolean getDistributionListCapable()
Returns a Connection object for use with the JTA-JDBC support. This method declares Exception in its throws clause to avoid problems with the JVM verifier for customers who are not using the JTA functionality. The actual exception thrown is javax.transaction.xa.XAException, which requires the jta.jar file to be added to the classpath for programs that did not previously require it. Parameters dataSource A database-specific implementation of the XADataSource interface that defines the details of the database to connect to. See the documentation for your database to determine how to create an appropriate XADataSource object to pass into getJDBCConnection. userid The user ID to use for this connection to the database. This is passed to the underlying XADataSource.getXAConnection method.
password The password to use for this connection to the database. This is passed to the underlying XADataSource.getXAConnection method.
172
Using Java
MQQueueManager
getJDBCConnection
public java.sql.Connection getJDBCConnection(javax.sql.XADataSource xads) throws MQException, SQLException, Exception
Returns a Connection object for use with the JTA-JDBC support. This method declares Exception in its throws clause to avoid problems with the JVM verifier for customers who are not using the JTA functionality. The actual exception thrown is javax.transaction.xa.XAException, which requires the jta.jar file to be added to the classpath for programs that did not previously require it. Parameters xads A database-specific implementation of the XADataSource interface that defines the details of the database to connect to. See the documentation for your database to determine how to create an appropriate XADataSource object to pass into getJDBCConnection.
getMaximumMessageLength
public int getMaximumMessageLength()
Throws MQException. Returns the maximum length of a message (in bytes) that can be handled by the queue manager. No queue can be defined with a maximum message length greater than this. Throws MQException if you call this method after disconnecting from the queue manager. getMaximumPriority
public int getMaximumPriority()
Throws MQException. Returns the maximum message priority supported by the queue manager. Priorities range from zero (lowest) to this value. Throws MQException if you call this method after disconnecting from the queue manager. getSyncpointAvailability
public int getSyncpointAvailability()
Throws MQException. Indicates whether the queue manager supports units of work and syncpointing with the MQQueue.get and MQQueue.put methods.
173
MQQueueManager
Returns v MQC.MQSP_AVAILABLE if syncpointing is available. v MQC.MQSP_NOT_AVAILABLE if syncpointing is not available. Throws MQException if you call this method after disconnecting from the queue manager. isConnected
public boolean isConnected()
Throws MQException. Places a single message onto a queue without having to create an MQQueue object first. The qName (queue name) and qmName (queue manager name) parameters identify where the message is placed. If the queue is a model queue, an MQException is thrown. In other respects, this method behaves like the put method on the MQQueue object. It is an implementation of the MQPUT1 MQI call. See MQQueue.put on page 160. Parameters qName The name of the queue onto which to place the message. qmName The name of the queue manager on which the queue is defined. msg pmo The message to send. Options controlling the actions of the put. See MQPutMessageOptions on page 152 for more details.
altUserid Specifies an alternative user identifier used to check authorization when placing the message on a queue. If you do not specify MQPMO_ALTERNATE_USER, this parameter is ignored. put
public synchronized void put(String qName, String qmName, MQMessage msg, MQPutMessageOptions pmo)
Throws MQException. Places a single message onto a queue without having to create an MQQueue object first.
174
Using Java
MQQueueManager
This version of the method allows you to omit the altUserid parameter. See the fully-specified method (MQQueueManager.put on page 174) for details of the parameters. put
public synchronized void put(String qName, String qmName, MQMessage msg)
Throws MQException. Places a single message onto a queue without having to create an MQQueue object first. This version of the method allows you to omit the put message options (pmo) and altUserid parameters. See the fully-specified method (MQQueueManager.put on page 174) for details of the parameters. put
public synchronized void put(String qName, MQMessage msg, MQPutMessageOptions pmo)
Throws MQException. Places a single message onto a queue without having to create an MQQueue object first. This version of the method allows you to omit the qmName and altUserid parameters. See the fully-specified method (MQQueueManager.put on page 174) for details of the parameters. put
public synchronized void put(String qName, MQMessage msg)
Throws MQException. Places a single message onto a queue without having to create an MQQueue object first. This version of the method allows you to omit the qmName, put message options (pmo), and altUserid parameters. See the fully-specified method (MQQueueManager.put on page 174) for details of the parameters.
175
MQSimpleConnectionManager
MQSimpleConnectionManager
java.lang.Object com.ibm.mq.MQConnectionManager com.ibm.mq.MQSimpleConnectionManager
public class MQSimpleConnectionManager implements MQConnectionManager (See page 181.) An MQSimpleConnectionManager provides basic connection pooling function. You can use an MQSimpleConnectionManager either as the default Connection Manager, or as a parameter to an MQQueueManager constructor. When an MQQueueManager is constructed, the most recently used connection in the pool is used. Connections are destroyed by a separate thread when they are unused for a specified period, when there are more than a specified number of unused connections in the pool, or when the maximum number of connections has been reached and room must be made for new connections. You can specify the timeout period, the maximum number of managed connections, and the maximum number of unused connections.
| | |
Variables
MODE_ACTIVE public static final int MODE_ACTIVE. See setActive on page 177. MODE_AUTO public static final int MODE_AUTO. See setActive on page 177. MODE_INACTIVE public static final int MODE_INACTIVE. See setActive on page 177.
Constructors
MQSimpleConnectionManager public MQSimpleConnectionManager() Constructs an MQSimpleConnectionManager.
Methods
getActive public int getActive() Gets the mode of the connection pool. Returns The current active mode of the connection pool, with one of the following values (see setActive on page 177): MODE_ACTIVE MODE_AUTO MODE_INACTIVE | getHighThreshold (deprecated) public int getHighThreshold()
176
Using Java
MQSimpleConnectionManager
| | | | | | | | | | Do not use this method in new applications. It performs the same function as getMaxUnusedConnections and returns the maximum number of unused connections in the pool. getMaxConnections public int getMaxConnections() Returns the maximum number of connections managed by the connection manager. getMaxUnusedConnections public int getMaxUnusedConnections() Returns the maximum number of unused connections in the pool. getTimeout public long getTimeout() Returns the timeout value. setActive public void setActive(int mode) Sets the active mode of the connection pool. Parameters mode The required active mode of the connection pool. Valid values are: MODE_ACTIVE The connection pool is always active. When MQQueueManager.disconnect() is called, the underlying connection is pooled and potentially reused the next time that an MQQueueManager object is constructed. Connections are destroyed by a separate thread if they are unused for longer than the timeout period, if the number of unused connections in the pool exceeds the value set by setMaxUnusedConnections(), or if room must be made for a new connection. MODE_AUTO The connection pool is active while the connection manager is the default connection manager and there is at least one token in the set of MQPoolToken objects held by the MQEnvironment object. This is the default mode. MODE_INACTIVE The connection pool is always inactive. When this mode is entered, the pool of connections to WebSphere MQ is cleared. When MQQueueManager.disconnect() is called, the connection that underlies any active MQQueueManager object ends. | | | | setHighThreshold (deprecated) public void setHighThreshold(int threshold) Do not use this method in new applications. It performs the same function as setMaxUnusedConnections and sets the maximum number of unused connections in the pool. Parameters threshold The maximum number of unused connections in the pool.
Chapter 9. The WebSphere MQ base Java classes and interfaces
| | | |
177
MQSimpleConnectionManager
| | | | | | | | | | | | | | | | | | setMaxConnections public void setMaxConnections(int maxConnections) Sets the maximum number of connections to be managed. To prevent this number from being exceeded, the oldest unused connection in the pool might be destroyed or a request for a new connection might be refused. If the latter event occurs, an MQException is thrown with reason code MQRC_MAX_CONNS_LIMIT_REACHED. Parameters maxConnections The maximum number of connections in the pool. setMaxUnusedConnections public void setMaxUnusedConnections(int maxUnusedConnections) Sets the maximum number of unused connections in the pool. To prevent this number from being exceeded, the oldest unused connection in the pool is destroyed. Parameters maxUnusedConnections The maximum number of unused connections in the pool. setTimeout public void setTimeout(long timeout) Sets the timeout value, where connections that remain unused for this length of time are destroyed by a separate thread. Parameters timeout The value of the timeout in milliseconds.
178
Using Java
MQC
MQC
public interface MQC extends Object The MQC interface defines all the constants used by the WebSphere MQ Java programming interface (except for completion code constants and error code constants). To refer to one of these constants from within your programs, prefix the constant name with MQC.. For example, you can set the close options for a queue as follows:
MQQueue queue; ... queue.closeOptions = MQC.MQCO_DELETE; // delete the // queue when // it is closed ...
A full description of these constants is in the WebSphere MQ Application Programming Reference. Completion code and error code constants are defined in the MQException class. See MQException on page 117.
179
MQPoolServicesEventListener
MQPoolServicesEventListener
public interface extends Object MQPoolServicesEventListener
Note: Normally, applications do not use this interface. MQPoolServicesEventListener is for implementation by providers of default ConnectionManagers. When an MQPoolServicesEventListener is registered with an MQPoolServices object, the event listener receives an event whenever an MQPoolToken is added to, or removed from, the set of MQPoolTokens that MQEnvironment manages. It also receives an event whenever the default ConnectionManager changes. See also MQPoolServices on page 146 and MQPoolServicesEvent on page 147.
Methods
defaultConnectionManagerChanged
public void defaultConnectionManagerChanged(MQPoolServicesEvent event)
Called when the default ConnectionManager is set. The set of MQPoolTokens is cleared. tokenAdded
public void tokenAdded(MQPoolServicesEvent event)
180
Using Java
MQConnectionManager
MQConnectionManager
This is a private interface that cannot be implemented by applications. WebSphere MQ classes for Java supplies an implementation of this interface (MQSimpleConnectionManager), which you can specify on the MQQueueManager constructor, or through MQEnvironment.setDefaultConnectionManager. See MQSimpleConnectionManager on page 176. Applications or middleware that want to provide their own ConnectionManager must implement javax.resource.spi.ConnectionManager. This requires Java 2 v1.3 with JAAS 1.0 installed.
181
MQReceiveExit
MQReceiveExit
public interface MQReceiveExit extends Object The receive exit interface allows you to examine and possibly alter the data received from the queue manager by the WebSphere MQ classes for Java. Note: This interface does not apply when connecting directly to WebSphere MQ in bindings mode. To provide your own receive exit, define a class that implements this interface. Create a new instance of your class and assign the MQEnvironment.receiveExit variable to it before constructing your MQQueueManager object. For example:
// in MyReceiveExit.java class MyReceiveExit implements MQReceiveExit { // you must provide an implementation // of the receiveExit method public byte[] receiveExit( MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte[] agentBuffer) { // your exit code goes here... } } // in your main program... MQEnvironment.receiveExit = new MyReceiveExit(); ... // other initialization MQQueueManager qMgr = new MQQueueManager("");
Methods
receiveExit
public abstract byte[] receiveExit(MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte agentBuffer[])
The receive exit method that your class must provide. This method is invoked whenever the WebSphere MQ classes for Java receives some data from the queue manager. Parameters channelExitParms Contains information regarding the context in which the exit is being invoked. The exitResponse member variable is an output parameter that you use to tell the WebSphere MQ classes for Java what action to take next. See MQChannelExit on page 104 for further details. channelDefinition Contains details of the channel through which all communications with the queue manager take place. agentBuffer If the channelExitParms.exitReason is MQChannelExit.MQXR_XMIT, agentBuffer contains the data received from the queue manager; otherwise agentBuffer is null.
182
Using Java
MQReceiveExit
Returns If the exit response code (in channelExitParms) is set so that the WebSphere MQ classes for Java can now process the data (MQXCC_OK), your receive exit method must return the data to be processed. The simplest receive exit, therefore, consists of the single line return agentBuffer;. See also: v MQC on page 179 v MQChannelDefinition on page 102
183
MQSecurityExit
MQSecurityExit
public interface MQSecurityExit extends Object The security exit interface allows you to customize the security flows that occur when an attempt is made to connect to a queue manager. Note: This interface does not apply when connecting directly to WebSphere MQ in bindings mode. To provide your own security exit, define a class that implements this interface. Create a new instance of your class and assign the MQEnvironment.securityExit variable to it before constructing your MQQueueManager object. For example:
// in MySecurityExit.java class MySecurityExit implements MQSecurityExit { // you must provide an implementation // of the securityExit method public byte[] securityExit( MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte[] agentBuffer) { // your exit code goes here... } } // in your main program... MQEnvironment.securityExit = new MySecurityExit(); ... // other initialization MQQueueManager qMgr = new MQQueueManager("");
Methods
securityExit
public abstract byte[] securityExit(MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte agentBuffer[])
The security exit method that your class must provide. Parameters channelExitParms Contains information regarding the context in which the exit is being invoked. The exitResponse member variable is an output parameter that you use to tell the WebSphere MQ Client for Java what action to take next. See the MQChannelExit on page 104 for further details. channelDefinition Contains details of the channel through which all communications with the queue manager take place. agentBuffer If the channelExitParms.exitReason is MQChannelExit.MQXR_SEC_MSG, agentBuffer contains the security message received from the queue manager; otherwise agentBuffer is null.
184
Using Java
MQSecurityExit
Returns If the exit response code (in channelExitParms) is set so that a message is to be transmitted to the queue manager, your security exit method must return the data to be transmitted. See also: v MQC on page 179 v MQChannelDefinition on page 102
185
MQSendExit
MQSendExit
public interface MQSendExit extends Object The send exit interface allows you to examine and possibly alter the data sent to the queue manager by the WebSphere MQ Client for Java. Note: This interface does not apply when connecting directly to WebSphere MQ in bindings mode. To provide your own send exit, define a class that implements this interface. Create a new instance of your class and assign the MQEnvironment.sendExit variable to it before constructing your MQQueueManager object. For example:
// in MySendExit.java class MySendExit implements MQSendExit { // you must provide an implementation of the sendExit method public byte[] sendExit( MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte[] agentBuffer) { // your exit code goes here... } } // in your main program... MQEnvironment.sendExit = new MySendExit(); ... // other initialization MQQueueManager qMgr = new MQQueueManager("");
Methods
sendExit
public abstract byte[] sendExit(MQChannelExit channelExitParms, MQChannelDefinition channelDefinition, byte agentBuffer[])
The send exit method that your class must provide. This method is invoked whenever the WebSphere MQ classes for Java wishes to transmit some data to the queue manager. Parameters channelExitParms Contains information regarding the context in which the exit is being invoked. The exitResponse member variable is an output parameter that you use to tell the WebSphere MQ classes for Java what action to take next. See MQChannelExit on page 104 for further details. channelDefinition Contains details of the channel through which all communications with the queue manager take place. agentBuffer If the channelExitParms.exitReason is MQChannelExit.MQXR_XMIT, agentBuffer contains the data to be transmitted to the queue manager; otherwise agentBuffer is null.
186
Using Java
MQSendExit
Returns If the exit response code (in channelExitParms) is set so that a message is to be transmitted to the queue manager (MQXCC_OK), your send exit method must return the data to be transmitted. The simplest send exit, therefore, consists of the single line return agentBuffer;. See also: v MQC on page 179 v MQChannelDefinition on page 102
187
ManagedConnection
ManagedConnection
public interface javax.resource.spi.ManagedConnection Note: Normally, applications do not use this class; it is intended for use by implementations of ConnectionManager. WebSphere MQ classes for Java provides an implementation of ManagedConnection that is returned from ManagedConnectionFactory.createManagedConnection. This object represents a connection to a WebSphere MQ Queue Manager. For more details about this interface, see the J2EE Connector Architecture specification (refer to Suns Web site at http://java.sun.com).
Methods
addConnectionEventListener
public void addConnectionEventListener(ConnectionEventListener listener)
Adds a ConnectionEventListener to the ManagedConnection instance. The listener is notified if a severe error occurs on the ManagedConnection, or when MQQueueManager.disconnect() is called on a connection handle that is associated with this ManagedConnection. The listener is not notified about local transaction events (see getLocalTransaction on page 189). associateConnection
public void associateConnection(Object connection)
Throws ResourceException. WebSphere MQ classes for Java does not currently support this method. A javax.resource.NotSupportedException is thrown. cleanup
public void cleanup()
Throws ResourceException. Closes all open connection handles, and resets the physical connection to an initial state ready to be pooled. Any pending local transaction is rolled back. For more details, see getLocalTransaction on page 189. destroy
public void destroy()
Throws ResourceException. Destroys the physical connection to the WebSphere MQ Queue Manager. Any pending local transaction is committed. For more details, see getLocalTransaction on page 189. getConnection
public Object getConnection(javax.security.auth.Subject subject, ConnectionRequestInfo cxRequestInfo)
Throws ResourceException.
188
Using Java
ManagedConnection
Creates a new connection handle for the physical connection represented by the ManagedConnection object. For WebSphere MQ classes for Java, this returns an MQQueueManager object. The ConnectionManager normally returns this object from allocateConnection. The subject parameter is ignored. If the cxRequestInfo parameter is not suitable, a ResourceException is thrown. Multiple connection handles can be used simultaneously for each single ManagedConnection. getLocalTransaction
public LocalTransaction getLocalTransaction()
Throws ResourceException. WebSphere MQ classes for Java does not currently support this method. A javax.resource.NotSupportedException is thrown. Currently, a ConnectionManager cannot manage the WebSphere MQ local transaction, and registered ConnectionEventListeners are not informed about events relating to the local transaction. When cleanup() occurs, any ongoing unit of work is rolled back. When destroy() occurs, any ongoing unit of work is committed. Existing API behavior is that an ongoing unit of work is committed at MQQueueManager.disconnect(). This existing behavior is preserved only when an MQConnectionManager (rather than a ConnectionManager) manages the connection. getLogWriter
public java.io.PrintWriter getLogWriter()
Throws ResourceException. Returns the log writer for this ManagedConnection. WebSphere MQ classes for Java does not currently use the log writer. See MQException.log on page 117 for more information about logging. getMetaData
public ManagedConnectionMetaData getMetaData()
Throws ResourceException. Gets the meta data information for the underlying Queue Manager. See ManagedConnectionMetaData on page 193. getXAResource
public javax.transaction.xa.XAResource getXAResource()
Throws ResourceException. WebSphere MQ classes for Java does not currently support this method. A javax.resource.NotSupportedException is thrown. removeConnectionEventListener
public void removeConnectionEventListener(ConnectionEventListener listener)
189
ManagedConnection
setLogWriter
public void setLogWriter(java.io.PrintWriter out)
Throws ResourceException. Sets the log writer for this ManagedConnection. When a ManagedConnection is created, it inherits the log writer from its ManagedConnectionFactory. WebSphere MQ classes for Java does not currently use the log writer. See MQException.log on page 117 for more information about logging.
190
Using Java
ManagedConnectionFactory
ManagedConnectionFactory
public interface javax.resource.spi.ManagedConnectionFactory Note: Normally, applications do not use this class; it is intended for use by implementations of ConnectionManager. WebSphere MQ classes for Java provides an implementation of this interface to ConnectionManagers. A ManagedConnectionFactory is used to construct ManagedConnections and to select suitable ManagedConnections from a set of candidates. For more details about this interface, see the J2EE Connector Architecture specification (refer to Suns Web site at http://java.sun.com).
Methods
createConnectionFactory
public Object createConnectionFactory()
Throws ResourceException. WebSphere MQ classes for Java does not currently support the createConnectionFactory methods. This method throws a javax.resource.NotSupportedException. createConnectionFactory
public Object createConnectionFactory(ConnectionManager cxManager)
Throws ResourceException. WebSphere MQ classes for Java does not currently support the createConnectionFactory methods. This method throws a javax.resource.NotSupportedException. createManagedConnection
public ManagedConnection createManagedConnection (javax.security.auth.Subject subject, ConnectionRequestInfo cxRequestInfo)
Throws ResourceException. Creates a new physical connection to a WebSphere MQ Queue Manager, and returns a ManagedConnection object that represents this connection. WebSphere MQ ignores the subject parameter. equals
public boolean equals(Object other)
Checks whether this ManagedConnectionFactory is equal to another ManagedConnectionFactory. Returns true if both ManagedConnectionFactories describe the same target Queue Manager. getLogWriter
public java.io.PrintWriter getLogWriter()
191
ManagedConnectionFactory
WebSphere MQ classes for Java does not currently use the log writer. See MQException.log on page 117 for more information about logging. hashCode
public int hashCode()
Throws ResourceException. Searches the supplied set of candidate ManagedConnections for an appropriate ManagedConnection. Returns either null, or a suitable ManagedConnection from the set that meets the criteria for connection. setLogWriter
public void setLogWriter(java.io.PrintWriter out)
Throws ResourceException. Sets the log writer for this ManagedConnectionFactory. When a ManagedConnection is created, it inherits the log writer from its ManagedConnectionFactory. WebSphere MQ classes for Java does not currently use the log writer. See MQException.log on page 117 for more information about logging.
192
Using Java
ManagedConnectionMetaData
ManagedConnectionMetaData
public interface javax.resource.spi.ManagedConnectionMetaData Note: Normally, applications do not use this interface; it is intended for use by implementations of ConnectionManager. A ConnectionManager can use this interface to retrieve meta data that is related to an underlying physical connection to a Queue Manager. An implementation of this interface is returned from ManagedConnection.getMetaData(). For more details about this interface, see the J2EE Connector Architecture specification (refer to Suns Web site at http://java.sun.com).
Methods
getEISProductName
public String getEISProductName()
Throws ResourceException. Returns a string that describes the command level of the WebSphere MQ queue manager to which the ManagedConnection is connected. getUserName
public String getUserName()
Throws ResourceException. If the ManagedConnection represents a client connection to a queue manager, this returns the user ID used for the connection. Otherwise, it returns an empty string.
193
ManagedConnectionMetaData
194
Using Java
| |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
213 213 213 214 214 215 215 217 217 219 219 219 220 220 221 221 223 224 224 224
Chapter 12. Writing WebSphere MQ JMS 1.1 applications . . . . . . . . . . . . . The JMS 1.1 model . . . . . . . . . . . Building a connection . . . . . . . . . . Retrieving a connection factory from JNDI . . Using a connection factory to create a connection . . . . . . . . . . . . . Creating a connection factory at runtime . . . Starting the connection . . . . . . . . Specifying a range of ports for client connections . . . . . . . . . . . . Obtaining a session . . . . . . . . . . . Destinations . . . . . . . . . . . . . . Sending a message . . . . . . . . . . . Message types . . . . . . . . . . . . Receiving a message . . . . . . . . . . . Creating durable topic subscribers . . . . . Message selectors . . . . . . . . . . . Suppressing local publications . . . . . . . Configuring the consumer queue . . . . . . Default configuration . . . . . . . . . Configuring nondurable message consumers Configuring durable topic subscribers . . . Subscription stores . . . . . . . . . . Migration and coexistence considerations . . Asynchronous delivery . . . . . . . . . . Consumer cleanup utility for the publish/subscribe domain . . . . . . . . . . . . . . . Manual cleanup . . . . . . . . . . . Cleanup from within a program . . . . . . Closing down . . . . . . . . . . . . . Java Virtual Machine hangs at shutdown . . . Handling errors . . . . . . . . . . . . Exception listener . . . . . . . . . . . Handling broker reports . . . . . . . . . Other considerations . . . . . . . . . . User exits . . . . . . . . . . . . . . Using Secure Sockets Layer (SSL) . . . . . . . SSL administrative properties . . . . . . .
235 235 236 236 236 237 237 237 238 239 240 241 241 242 243 243 244 244 244 245 246 247 248 248 250 251 252 252 252 252 252 253 253 253 254
195
| | | |
SSLCIPHERSUITE object property SSLPEERNAME object property . SSLCERTSTORES object property. SSLSocketFactory object property .
. . . .
. . . .
. . . .
. . . .
254 254 255 256 257 257 261 262 265 266 268 269 270 271 273 273
Chapter 13. JMS messages . . . . . . . . Message selectors . . . . . . . . . . . . Mapping JMS messages onto WebSphere MQ messages . . . . . . . . . . . . . . . The MQRFH2 header . . . . . . . . . . JMS fields and properties with corresponding MQMD fields . . . . . . . . . . . . Mapping JMS fields onto WebSphere MQ fields (outgoing messages) . . . . . . . . . . Mapping JMS header fields at send() or publish() . . . . . . . . . . . . . Mapping JMS property fields . . . . . . Mapping JMS provider-specific fields . . . Mapping WebSphere MQ fields onto JMS fields (incoming messages) . . . . . . . . . . Mapping JMS to a native WebSphere MQ application . . . . . . . . . . . . . Message body . . . . . . . . . . . .
Chapter 14. WebSphere MQ JMS Application Server Facilities . . . . . . . . . . . . 277 ASF classes and functions . . . . . . . . . 277 ConnectionConsumer . . . . . . . . . . 277 Planning an application . . . . . . . . . 278 General principles for point-to-point messaging . . . . . . . . . . . . 278 General principles for publish/subscribe messaging . . . . . . . . . . . . 279 Handling poison messages . . . . . . . 280 Removing messages from the queue . . . . 281 Error handling . . . . . . . . . . . . 282 Recovering from error conditions . . . . . 282 Reason and feedback codes . . . . . . . 283 Application server sample code . . . . . . . 283 MyServerSession.java . . . . . . . . . . 285 MyServerSessionPool.java . . . . . . . . 285 MessageListenerFactory.java . . . . . . . 286 Examples of ASF use . . . . . . . . . . . 287 Load1.java . . . . . . . . . . . . . 287 CountingMessageListenerFactory.java . . . . 288 ASFClient1.java. . . . . . . . . . . . 289 Load2.java . . . . . . . . . . . . . 290 LoggingMessageListenerFactory.java . . . . . 290 ASFClient2.java. . . . . . . . . . . . 290 TopicLoad.java . . . . . . . . . . . . 291 ASFClient3.java. . . . . . . . . . . . 292 ASFClient4.java. . . . . . . . . . . . 293 ASFClient5.java. . . . . . . . . . . . 294 Chapter 15. JMS interfaces and classes . . . 295 Sun Java Message Service classes and interfaces 295 WebSphere MQ JMS classes . . . . . . . . 298 BytesMessage . . . . . . . . . . . . . 300 Methods . . . . . . . . . . . . . . 300 Cleanup * . . . . . . . . . . . . . . 308 WebSphere MQ constructor. . . . . . . . 308
Methods . . . . . . . Connection . . . . . . . Methods . . . . . . . ConnectionConsumer . . . . Methods . . . . . . . ConnectionFactory. . . . . WebSphere MQ constructor. Methods . . . . . . . ConnectionMetaData . . . . WebSphere MQ constructor. Methods . . . . . . . DeliveryMode . . . . . . Fields . . . . . . . . Destination . . . . . . . WebSphere MQ constructors Methods . . . . . . . ExceptionListener . . . . . Methods . . . . . . . MapMessage . . . . . . Methods . . . . . . . Message . . . . . . . . Fields . . . . . . . . Methods . . . . . . . MessageConsumer . . . . Methods . . . . . . . MessageListener . . . . . Methods . . . . . . . MessageProducer . . . . . WebSphere MQ constructors Methods . . . . . . . MQQueueEnumeration * . . Methods . . . . . . . ObjectMessage . . . . . . Methods . . . . . . . Queue . . . . . . . . . WebSphere MQ constructors Methods . . . . . . . QueueBrowser . . . . . . Methods . . . . . . . QueueConnection . . . . . Methods . . . . . . . QueueConnectionFactory . . WebSphere MQ constructor. Methods . . . . . . . QueueReceiver . . . . . . Methods . . . . . . . QueueRequestor . . . . . Constructors . . . . . . Methods . . . . . . . QueueSender . . . . . . Methods . . . . . . . QueueSession . . . . . . Methods . . . . . . . Session . . . . . . . . Fields . . . . . . . . Methods . . . . . . . StreamMessage . . . . . . Methods . . . . . . . TemporaryQueue . . . . . Methods . . . . . . . TemporaryTopic . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
308 313 313 318 318 319 319 319 335 335 335 337 337 338 338 338 340 340 341 341 349 349 349 363 363 366 366 367 367 367 373 373 374 374 375 375 375 377 377 379 379 381 381 381 384 384 385 385 385 387 387 390 390 393 393 393 405 405 413 413 414
196
Using Java
WebSphere MQ constructor. Methods . . . . . . . TextMessage . . . . . . . Methods . . . . . . . Topic . . . . . . . . . WebSphere MQ constructor. Methods . . . . . . . TopicConnection . . . . . Methods . . . . . . . TopicConnectionFactory . . . WebSphere MQ constructor. Methods . . . . . . . TopicPublisher . . . . . . Methods . . . . . . . TopicRequestor . . . . . . Constructors . . . . . . Methods . . . . . . . TopicSession . . . . . . . WebSphere MQ constructor. Methods . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
414 414 415 415 416 416 416 420 420 423 423 423 431 431 434 434 434 436 436 436
| |
TopicSubscriber. . . . . Methods . . . . . . XAConnection . . . . . Methods . . . . . . XAConnectionFactory . . Methods . . . . . . XAQueueConnection . . . Methods . . . . . . XAQueueConnectionFactory Methods . . . . . . XAQueueSession . . . . Methods . . . . . . XASession . . . . . . Methods . . . . . . XATopicConnection . . . Methods . . . . . . XATopicConnectionFactory . Methods . . . . . . XATopicSession . . . . . Methods . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
440 440 441 441 443 443 445 445 446 446 448 448 449 449 451 451 452 452 454 454
197
198
Using Java
| |
199
JMS model
v v v v QueueConnection QueueSession QueueSender QueueReceiver
When using JMS, always write application programs that use only references to the interfaces in javax.jms. All vendor-specific information is encapsulated in implementations of: v QueueConnectionFactory v TopicConnectionFactory v Queue v Topic These are known as administered objects, that is, objects that can be built using a vendor-supplied administration tool and stored in a JNDI namespace. A JMS application can retrieve these objects from the namespace and use them without needing to know which vendor provided the implementation.
Building a connection
Connections are not created directly, but are built using a connection factory. Factory objects can be stored in a JNDI namespace, insulating the JMS application from provider-specific information. Details of how to create and store factory objects are in Chapter 5, Using the WebSphere MQ JMS administration tool, on page 41. If you do not have a JNDI namespace available, see Creating factories at runtime on page 201.
where: icf url defines a factory class for the initial context defines a context specific URL
For more details about JNDI usage, see Suns JNDI documentation. Note: Some combinations of the JNDI packages and LDAP service providers can result in an LDAP error 84. To resolve the problem, insert the following line before the call to InitialDirContext.
environment.put(Context.REFERRAL, "throw");
200
Using Java
Building a connection
Once an initial context is obtained, objects are retrieved from the namespace by using the lookup() method. The following code retrieves a QueueConnectionFactory named ivtQCF from an LDAP-based namespace:
QueueConnectionFactory factory; factory = (QueueConnectionFactory)ctx.lookup("cn=ivtQCF");
(You can omit the com.ibm.mq.jms. prefix if you import the com.ibm.mq.jms package instead.) A connection created from the above factory uses the Java bindings to connect to the default queue manager on the local machine. The set methods shown in Table 14 on page 202 can be used to customize the factory with WebSphere MQ specific information. The only way to create a TopicConnectionFactory object at runtime is to construct it using the MQTopicConnectionFactory constructor. For example:
MQTopicConnectionFactory fact = new MQTopicConnectionFactory();
This creates a default TopicConnectionFactory object with the bindings transportType and all other default settings. It is possible to change the transportType for the TopicConnectionFactory using its setTransportType() method. For example:
fact.setTransportType(JMSC.MQJMS_TP_BINDINGS_MQ); // Bindings mode fact.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); // Client mode fact.setTransportType(JMSC.MQJMS_TP_DIRECT_TCPIP); // Direct TCP/IP mode
The full JMS TopicConnectionFactory interface has been implemented. Refer to TopicConnectionFactory on page 423 for more details. Note that certain combinations of property settings are not valid for TopicConnectionFactory objects. See Properties on page 49 for more details.
201
Building a connection
Table 14. Set methods on MQQueueConnectionFactory Method setCCSID(int) setChannel(String) setFailIfQuiesce(int) Description Used to set the MQEnvironment.CCSID property The name of the channel for a client connection Defines the behavior an application exhibits when making calls (for example, send and receive) against a quiescing queue manager. The options are: v JMSC.MQJMS_FIQ_NO v JMSC.MQJMS_FIQ_YES (the default) setHostName(String) setPort(int) setQueueManager(String) setTemporaryModel(String) The name of the host for a client connection The port for a client connection The name of the queue manager The name of a model queue used to generate a temporary destination as a result of a call to QueueSession.createTemporaryQueue(). Make this the name of a temporary dynamic queue, rather than a permanent dynamic queue. The prefix that is used to form the name of a WebSphere MQ dynamic queue. How to connect to WebSphere MQ. The options are: v JMSC.MQJMS_TP_BINDINGS_MQ (the default) v JMSC.MQJMS_TP_CLIENT_MQ_TCPIP JMSC is in the package com.ibm.mq.jms setReceiveExit(String) setSecurityExit(String) setSendExit(String) setReceiveExitInit(String) setSecurityExitInit(String) setSendExitInit(String) Allow the use of the send, receive, and security exits provided by the underlying WebSphere MQ Classes for Java. The set*Exit methods take the name of a class that implements the relevant exit methods. (See the WebSphere MQ product documentation for details.) The class must implement a constructor with a single String parameter. This string provides any initialization data required by the exit, and is set to the value provided in the corresponding set*ExitInit method.
| |
setTempQPrefix(String) setTransportType(int)
202
Using Java
Building a connection
factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); factory.setQueueManager(QMGRNAME); factory.setHostName(HOSTNAME); factory.setChannel(CHANNEL);
| | | | | | | | | | | | | | | | | | | | | | | | | | |
When the application connects to a queue manager subsequently, the application binds to a local IP address and port number in the range 9.20.0.1(2000) to 9.20.0.1(3000). Connection errors might occur if you restrict the range of ports. If an error occurs, a JMSException is thrown with an embedded MQException that contains the WebSphere MQ reason code, MQRC_Q_MGR_NOT_AVAILABLE. An error might occur if all the ports in the specified range are in use, or if the LOCALADDRESS property contains an IP address, host name, or port number that is not valid; a negative port number, for example. Because the WebSphere MQ JMS client might create connections other than those required by an application, always consider specifying a range of ports. In general, every Session created by an application requires one port and the WebSphere MQ JMS client might require three additional ports. If a connection error does occur, increase the range of ports. JMS connection pooling might have an effect on the speed at which ports can be reused. As a result, a connection error might occur while ports are being freed.
Obtaining a session
Once a connection is made, use the createQueueSession method on the QueueConnection to obtain a session. The method takes two parameters: 1. A boolean that determines whether the session is transacted or non-transacted. 2. A parameter that determines the acknowledge mode.
203
Obtaining a session
The simplest case is that of the non-transacted session with AUTO_ACKNOWLEDGE, as shown in the following code fragment:
QueueSession session; boolean transacted = false; session = connection.createQueueSession(transacted, Session.AUTO_ACKNOWLEDGE);
Note: A connection is thread safe, but sessions (and objects that are created from them) are not. The recommended practice for multithreaded applications is to use a separate session for each thread.
Sending a message
Messages are sent using a MessageProducer. For point-to-point this is a QueueSender that is created using the createSender method on QueueSession. A QueueSender is normally created for a specific queue, so that all messages sent using that sender are sent to the same destination. The destination is specified using a Queue object. Queue objects can be either created at runtime, or built and stored in a JNDI namespace. Queue objects are retrieved from JNDI in the following way:
Queue ioQueue; ioQueue = (Queue)ctx.lookup( qLookup );
WebSphere MQ JMS provides an implementation of Queue in com.ibm.mq.jms.MQQueue. It contains properties that control the details of WebSphere MQ specific behavior, but in many cases it is possible to use the default values. JMS defines a standard way to specify the destination that minimizes the WebSphere MQ specific code in the application. This mechanism uses the QueueSession.createQueue method, which takes a string parameter describing the destination. The string itself is still in a vendor-specific format, but this is a more flexible approach than directly referring to the vendor classes. WebSphere MQ JMS accepts two forms for the string parameter of createQueue(). v The first is the name of the WebSphere MQ queue, as illustrated in the following fragment taken from the IVTRun program in the samples directory:
public static final String QUEUE = "SYSTEM.DEFAULT.LOCAL.QUEUE" ; . . . ioQueue = session.createQueue( QUEUE );
v The second, and more powerful, form is based on uniform resource identifiers (URIs). This form allows you to specify remote queues (queues on a queue manager other than the one to which you are connected). It also allows you to set the other properties contained in a com.ibm.mq.jms.MQQueue object. The URI for a queue begins with the sequence queue://, followed by the name of the queue manager on which the queue resides. This is followed by a further /, the name of the queue, and optionally, a list of name-value pairs that set the remaining Queue properties. For example, the URI equivalent of the previous example is:
ioQueue = session.createQueue("queue:///SYSTEM.DEFAULT.LOCAL.QUEUE");
The name of the queue manager is omitted. This is interpreted as the queue manager to which the owning QueueConnection is connected at the time when the Queue object is used.
204
Using Java
Sending a message
Note: When sending a message to a cluster, leave the Queue Manager field in the JMS Queue object blank. This enables an MQOPEN to be performed in BIND_NOT_FIXED mode, which allows the queue manager to be determined. Otherwise an exception is returned reporting that the queue object cannot be found. This applies when using JNDI or defining queues at runtime. The following example connects to queue Q1 on queue manager HOST1.QM1, and causes all messages to be sent as non-persistent and priority 5:
ioQueue = session.createQueue("queue://HOST1.QM1/Q1?persistence=1&priority=5");
| |
Table 15 lists the names that can be used in the name-value part of the URI. A disadvantage of this format is that it does not support symbolic names for the values, so where appropriate, the table also indicates special values, which might change. (See Setting properties with the set method on page 206 for an alternative way of setting properties.) |
Table 15. Property names for queue and topic URIs Property CCSID Description Character set of the destination Values integers - valid values listed in base WebSphere MQ documentation An integer value as described in the base WebSphere MQ documentation 0 for unlimited, positive integers for timeout (ms) -1=ASCF, 0=DISABLED, 3=NOTR, 5=RELIABLE, 7=ENABLED 1=non-persistent, 2=persistent, -1=QDEF, -2=APP 0 through 9, -1=QDEF, -2=APP 0=JMS, 1=MQ
encoding
expiry
Lifetime of the message in milliseconds Sets multicast mode for direct connections Whether the message should be hardened to disk Priority of the message Whether the receiving application is JMS compliant
| |
The special values are: QDEF APP Determine the property from the configuration of the WebSphere MQ queue. The JMS application can control this property.
Once the Queue object is obtained (either using createQueue as above or from JNDI), it must be passed into the createSender method to create a QueueSender:
QueueSender queueSender = session.createSender(ioQueue);
The resulting queueSender object is used to send messages by using the send method:
queueSender.send(outMessage);
205
Sending a message
Table 16 shows the symbolic property values that are supplied with WebSphere MQ JMS for use with the set methods.
Table 16. Symbolic values for queue properties Property expiry priority persistence Admin tool keyword UNLIM APP APP QDEF APP QDEF PERS NON JMS MQ Integer(N) Integer(R) Decimal(N) Decimal(R) Float(N) Float(R) Native ASCF DISABLED NOTR RELIABLE ENABLED Values JMSC.MQJMS_EXP_UNLIMITED JMSC.MQJMS_EXP_APP JMSC.MQJMS_PRI_APP JMSC.MQJMS_PRI_QDEF JMSC.MQJMS_PER_APP JMSC.MQJMS_PER_QDEF JMSC.MQJMS_PER_PER JMSC.MQJMS_PER_NON JMSC.MQJMS_CLIENT_JMS_COMPLIANT JMSC.MQJMS_CLIENT_NONJMS_MQ JMSC.MQJMS_ENCODING_INTEGER_NORMAL JMSC.MQJMS_ENCODING_INTEGER_REVERSED JMSC.MQJMS_ENCODING_DECIMAL_NORMAL JMSC.MQJMS_ENCODING_DECIMAL_REVERSED JMSC.MQJMS_ENCODING_FLOAT_IEEE_NORMAL JMSC.MQJMS_ENCODING_FLOAT_IEEE_REVERSED JMSC.MQJMS_ENCODING_NATIVE JMSC.MQJMS_MULTICAST_AS_CF JMSC.MQJMS_MULTICAST_DISABLED JMSC.MQJMS_MULTICAST_NOT_RELIABLE JMSC.MQJMS_MULTICAST_RELIABLE JMSC.MQJMS_MULTICAST_ENABLED
targetClient encoding
| | | | |
multicast
Message types
JMS provides several message types, each of which embodies some knowledge of its content. To avoid referring to the vendor-specific class names for the message types, methods are provided on the Session object for message creation. In the sample program, a text message is created in the following manner:
206
Using Java
Sending a message
System.out.println( "Creating a TextMessage" ); TextMessage outMessage = session.createTextMessage(); System.out.println("Adding Text"); outMessage.setText(outString);
The message types that can be used are: v BytesMessage v MapMessage v ObjectMessage v StreamMessage v TextMessage Details of these types are in Chapter 15, JMS interfaces and classes, on page 295.
Receiving a message
Messages are received using a QueueReceiver. This is created from a Session by using the createReceiver() method. This method takes a Queue parameter that defines from where the messages are received. See Sending a message on page 204 for details of how to create a Queue object. The sample program creates a receiver and reads back the test message with the following code:
QueueReceiver queueReceiver = session.createReceiver(ioQueue); Message inMessage = queueReceiver.receive(1000);
The parameter in the receive call is a timeout in milliseconds. This parameter defines how long the method should wait if there is no message available immediately. You can omit this parameter, in which case, the call blocks indefinitely. If you do not want any delay, use the receiveNoWait() method. The receive methods return a message of the appropriate type. For example, if a TextMessage is put on a queue, when the message is received the object that is returned is an instance of TextMessage. To extract the content from the body of the message, it is necessary to cast from the generic Message class (which is the declared return type of the receive methods) to the more specific subclass, such as TextMessage. If the received message type is not known, you can use the instanceof operator to determine which type it is. It is good practice always to test the message class before casting, so that unexpected errors can be handled gracefully. The following code illustrates the use of instanceof, and extraction of the content from a TextMessage:
if (inMessage instanceof TextMessage) { String replyString = ((TextMessage) inMessage).getText(); . . . } else { // Print error message if Message was not a TextMessage. System.out.println("Reply message was not a TextMessage"); }
Message selectors
JMS provides a mechanism to select a subset of the messages on a queue so that this subset is returned by a receive call. When creating a QueueReceiver, you can
Chapter 10. Writing WebSphere MQ JMS applications
207
Receiving a message
provide a string that contains an SQL (Structured Query Language) expression to determine which messages to retrieve. The selector can refer to fields in the JMS message header as well as fields in the message properties (these are effectively application-defined header fields). Details of the header field names, as well as the syntax for the SQL selector, are in Chapter 13, JMS messages, on page 257. The following example shows how to select for a user-defined property named myProp:
queueReceiver = session.createReceiver(ioQueue, "myProp = blue");
Note: The JMS specification does not permit the selector associated with a receiver to be changed. Once a receiver is created, the selector is fixed for the lifetime of that receiver. This means that, if you require different selectors, you must create new receivers.
Asynchronous delivery
An alternative to making calls to QueueReceiver.receive() is to register a method that is called automatically when a suitable message is available. The following fragment illustrates the mechanism:
import javax.jms.*; public class MyClass implements MessageListener { // The method that will be called by JMS when a message // is available. public void onMessage(Message message) { System.out.println("message is "+message); // application specific processing here . . . } } . . . // In Main program (possibly of some other class) MyClass listener = new MyClass(); queueReceiver.setMessageListener(listener); // main program can now continue with other application specific // behavior.
Note: Use of asynchronous delivery with a QueueReceiver marks the entire Session as asynchronous. It is an error to make an explicit call to the receive methods of a QueueReceiver that is associated with a Session that is using asynchronous delivery.
Closing down
Garbage collection alone cannot release all WebSphere MQ resources in a timely manner, especially if the application needs to create many short-lived JMS objects at the Session level or lower. It is therefore important to call the close() methods of the various classes (QueueConnection, QueueSession, QueueSender, and QueueReceiver) when the resources are no longer required.
208
Using Java
Closing down
Handling errors
Any runtime errors in a JMS application are reported by exceptions. The majority of methods in JMS throw JMSExceptions to indicate errors. It is good programming practice to catch these exceptions and display them on a suitable output. A JMSException can contain a further exception embedded in it. For JMS, this can be a valuable way to pass important detail from the underlying transport. In the case of WebSphere MQ JMS, when WebSphere MQ raises an MQException, this exception is usually included as the embedded exception in a JMSException. The implementation of JMSException does not include the embedded exception in the output of its toString() method. Therefore, it is necessary to check explicitly for an embedded exception and print it out, as shown in the following fragment:
try { . . code which may throw a JMSException . } catch (JMSException je) { System.err.println("caught "+je); Exception e = je.getLinkedException(); if (e != null) { System.err.println("linked exception: "+e); } }
Exception listener
For asynchronous message delivery, the application code cannot catch exceptions raised by failures to receive messages. This is because the application code does not make explicit calls to receive() methods. To cope with this situation, it is possible to register an ExceptionListener, which is an instance of a class that implements the onException() method. When a serious error occurs, this method is called with the JMSException passed as its only parameter. Further details are in Suns JMS documentation.
User exits
WebSphere MQ JMS allows you to code and use implementations of the WebSphere MQ base Java send, receive, and security exits. For WebSphere MQ JMS, ensure that your exit has a constructor that takes a single string argument. See the description of exit-related set methods in Table 14 on page 202 and Property dependencies on page 56.
209
Using SSL
This can also be set from a program, using the setSSLCipherSuite() method on MQConnectionFactory. For convenience, if a CipherSpec is specified on the SSLCIPHERSUITE property, JMSAdmin attempts to map the CipherSpec to an appropriate CipherSuite and issues a warning. This attempt to map is not made if the property is specified by a program.
210
Using Java
Using SSL
the queue manager presents a DN that matches the pattern. For more details of the format of this pattern, refer to WebSphere MQ Security or the WebSphere MQ Script (MQSC) Command Reference. The DN is set using the SSLPEERNAME property of ConnectionFactory. For example, the following JMSAdmin command sets the ConnectionFactory to expect the queue manager to identify itself with a Common Name beginning QMGR. with at least two Organizational Unit names, the first of which must be IBM and the second WEBSPHERE:
ALTER QCF(my.qcf) SSLPEERNAME(CN=QMGR.*, OU=IBM, OU=WEBSPHERE)
Checking is case-insensitive, and semicolons can be used in place of the commas. This can also be set from a program, using the setSSLPeerName() method on MQConnectionFactory. If this property is not set, no checking is performed on the Distinguished Name supplied by the queue manager. This property is ignored if no CipherSuite is set.
Note: To use a CertStore successfully with a CRL hosted on an LDAP server, make sure that your Java Software Development Kit (SDK) is compatible with the CRL. Some SDKs require that the CRL conforms to RFC 2587, which defines a schema for LDAP v2. Most LDAP v3 servers use RFC 2256 instead. If your LDAP server is not running on the default port of 389, the port can be specified by appending a colon and the port number to the host name. If the certificate presented by the queue manager is present in the CRL hosted on crl1.ibm.com, the connection does not complete. To avoid single-point-of-failure, JMS allows multiple LDAP servers to be supplied, by supplying a space-delimited list of LDAP servers. For example:
ALTER QCF(my.qcf) SSLCRL(ldap://crl1.ibm.com ldap://crl2.ibm.com)
When multiple LDAP servers are specified, JMS tries each one in turn until it finds a server with which it can successfully verify the queue managers certificate. Each server must contain identical information. A string of this format can be supplied by a program on the MQConnectionFactory.setSSLCertStores() method. Alternatively, the application can create one or more java.security.cert.CertStore objects, place these in a suitable Collection object, and supply this Collection to the setSSLCertStores() method. In this way, the application can customize CRL checking. Refer to your JSSE documentation for details on constructing and using CertStore objects. The certificate presented by the queue manager when a connection is being set up is validated as follows: 1. The first CertStore object in the Collection identified by sslCertStores is used to identify a CRL server. 2. An attempt is made to contact the CRL server. 3. If the attempt is successful, the server is searched for a match for the certificate.
Chapter 10. Writing WebSphere MQ JMS applications
211
Using SSL
a. If the certificate is found to be revoked, the search process is over and the connection request fails with reason code MQRC_SSL_CERTIFICATE_REVOKED. b. If the certificate is not found, the search process is over and the connection is allowed to proceed. 4. If the attempt to contact the server is unsuccessful, the next CertStore object is used to identify a CRL server and the process repeats from step 2. If this was the last CertStore in the Collection, or if the Collection contains no CertStore objects, the search process has failed and the connection request fails with reason code MQRC_SSL_CERT_STORE_ERROR. The Collection object determines the order in which CertStores are used. If your application uses setSSLCertStores() to set a Collection of CertStore objects, the MQConnectionFactory can no longer be bound into a JNDI namespace. Attempting to do so causes an exception. If the sslCertStores property is not set, no revocation checking is performed on the certificate provided by the queue manager. This property is ignored if no CipherSuite is set.
212
Using Java
| | |
Introduction
With publish/subscribe messaging, one message producer can send messages to many message consumers at one time. The message producer need know nothing about the consumers receiving its messages, it needs to know only about the common destination. Similarly, the message consumers need to know only about the common destination. This common destination is called a topic. A message producer that sends messages to a topic is a publisher and a message consumer that receives messages from a topic is a subscriber. A message consumer receives messages on all topics to which it has subscribed. To receive messages from a topic, a message consumer must first subscribe to that topic. All messages sent to a topic are forwarded to all the message consumers subscribed to that topic at that time. Each consumer receives its own copy of each message. JMS clients can establish durable subscriptions that allow consumers to disconnect and later reconnect and collect messages published while they were disconnected. The connection between messages issued by publishers and the subscribers is made, in WebSphere MQ, by the publish/subscribe broker. The broker (sometimes referred to as the message broker) has a record of all the subscribers registered to a topic. When a message is published to a topic, the broker manages the forwarding of that message to the topics subscribers. To run a WebSphere MQ JMS publish/subscribe application, you must be able to connect to a message broker.
Choosing a broker
WebSphere MQ offers a choice of three brokers: v The MQSeries Publish/Subscribe broker uses WebSphere MQ and a SupportPac. The SupportPac MA0C is available for download from:
http://www.ibm.com/software/ts/mqseries/txppacs
213
214
Using Java
// Pub/Sub objects used by this program private TopicConnectionFactory fact = null; private Topic topic = null; public static void main(String args[]) { // Initialise JNDI properties Hashtable env = new Hashtable(); env.put( Context.INITIAL_CONTEXT_FACTORY, icf ); env.put( Context.PROVIDER_URL, url ); env.put( Context.REFERRAL, "throw" );
Chapter 11. Writing WebSphere MQ JMS publish/subscribe applications
215
Context ctx = null; try { System.out.print( "Initialising JNDI... " ); ctx = new InitialDirContext( env ); System.out.println( "Done!" ); } catch ( NamingException nx ) { System.out.println( "ERROR: " + nx ); System.exit(-1); } // Lookup TCF try { System.out.print( "Obtaining TCF from JNDI... " ); fact = (TopicConnectionFactory)ctx.lookup( tcfLookup ); System.out.println( "Done!" ); } catch ( NamingException nx ) { System.out.println( "ERROR: " + nx ); System.exit(-1); } // Lookup Topic try { System.out.print( "Obtaining topic T from JNDI... " ); topic = (Topic)ctx.lookup( tLookup ); System.out.println( "Done!" ); } catch ( NamingException nx ) { System.out.println( "ERROR: " + nx ); System.exit(-1); } try { ctx.close(); } catch ( NamingException nx ) { // Just ignore an exception on closing the context } try { // Create connection TopicConnection conn = fact.createTopicConnection(); // Start connection conn.start(); // Session TopicSession sess = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); // Create a topic dynamically Topic t = sess.createTopic("myTopic"); // Publisher TopicPublisher pub = sess.createPublisher(t); // Subscriber TopicSubscriber sub = sess.createSubscriber(t); // Publisher TopicPublisher pubA = sess.createPublisher(topic); // Subscriber TopicSubscriber subA = sess.createSubscriber(topic); // Publish "Hello World" TextMessage hello = sess.createTextMessage(); hello.setText("Hello World"); pub.publish(hello); hello.setText("Hello World 2"); pubA.publish(hello);
216
Using Java
Many of these processes are similar to those that are used for point-to-point, as shown in the following: Obtain a TopicConnectionFactory The preferred way to do this is to use JNDI lookup, to maintain portability of the application code. The following code initializes a JNDI context:
String icf = "com.sun.jndi.ldap.LdapCtxFactory"; // initial context factory String url = "ldap://server.company.com/o=company_us,c=us"; // url // Initialise JNDI properties Java.util.Hashtable env = new Hashtable(); env.put( Context.INITIAL_CONTEXT_FACTORY, icf ); env.put( Context.PROVIDER_URL, url ); env.put( Context.REFERRAL, "throw" ); Context ctx = null; try {
Chapter 11. Writing WebSphere MQ JMS publish/subscribe applications
217
Note: Change the icf and url variables to suit your installation and your JNDI service provider. The properties required by JNDI initialization are in a Hashtable, which is passed to the InitialDirContext constructor. If this connection fails, an exception is thrown to indicate that the administered objects required later in the application are not available. Obtain a TopicConnectionFactory using a lookup key that the administrator has defined:
// LOOKUP TCF try { System.out.print( "Obtaining TCF from JNDI... " ); fact = (TopicConnectionFactory)ctx.lookup( tcfLookup ); System.out.println( "Done!" ); } catch ( NamingException nx ) { System.out.println( "ERROR: " + nx ); System.exit(-1); }
If a JNDI namespace is not available, you can create a TopicConnectionFactory at runtime. You create a new com.ibm.mq.jms.MQTopicConnectionFactory as described in Creating factories at runtime on page 201. Create a TopicConnection This is created from the TopicConnectionFactory object. Connections are always initialized in a stop state and must be started with the following code:
// create connection TopicConnection conn = fact.createTopicConnection(); //start connection conn.start();
Create a TopicSession This is created using the TopicConnection. This method takes two parameters: one to signify whether the session is transacted, and one to specify the acknowledgement mode:
TopicSession sess = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
Obtain a Topic This object can be obtained from JNDI, for use with TopicPublishers and TopicSubscribers that are created later. The following code retrieves a Topic:
Topic topic = null; try { System.out.print( "Obtaining topic T from JNDI... " ); topic = (Topic)ctx.lookup( tLookup ); System.out.println( "Done!" ); }
218
Using Java
If a JNDI namespace is not available, you can create a Topic at runtime, as described in Creating topics at runtime on page 223. The following code creates a Topic at runtime:
// topic Topic t = sess.createTopic("myTopic");
Create consumers and producers of publications Depending on the nature of the JMS client application that you write, a subscriber, a publisher, or both must be created. Use the createPublisher and createSubscriber methods as follows:
// publisher TopicPublisher pub = sess.createPublisher(t); // subscriber TopicSubscriber sub = sess.createSubscriber(t); // publisher TopicPublisher pubA = sess.createPublisher(topic); // subscriber TopicSubscriber subA = sess.createSubscriber(topic);
Publish messages
The TopicPublisher object, pub, is used to publish messages, rather like a QueueSender is used in the point-to-point domain. The following fragment creates a TextMessage using the session, and then publishes the message:
// publish "hello world" TextMessage hello = sess.createTextMessage(); hello.setText("Hello World"); pub.publish(hello); hello.setText("Hello World 2"); pubA.publish(hello);
Receive subscriptions
Subscribers must be able to read the subscriptions that are delivered to them, as in the following code:
// receive message TextMessage m = (TextMessage) sub.receive(); System.out.println("Message Text = " + m.getText()); m = (TextMessage) subA.receive(); System.out.println("Message Text = " + m.getText());
This fragment of code performs a get-with-wait, which means that the receive call blocks until a message is available. Alternative versions of the receive call are available (such as receiveNoWait). For details, see TopicSubscriber on page 440.
219
or, because this is the default transport type for TopicConnectionFactory objects:
InitCtx> def tcf(testTCF)
This creates a TopicConnectionFactory with default settings for bindings transport, connecting to the default queue manager. Client connection
InitCtx> def tcf(testTCF) transport(client)
This creates a TopicConnectionFactory with default settings for the client transport type, connecting to localhost, on port 1414, using channel SYSTEM.DEF.SVRCONN. Direct TCP/IP connection to WebSphere MQ Event Broker
InitCtx> def tcf(testTCF) transport(direct)
This creates a TopicConnectionFactory to make direct connections to a WebSphere MQ Event Broker, connecting to localhost on port 1506.
220
Using Java
Using topics
This section discusses the use of JMS Topic objects in WebSphere MQ classes for Java Message Service applications.
Topic names
This section describes the use of topic names within WebSphere MQ classes for Java Message Service. Note: The JMS specification does not specify exact details about the use and maintenance of topic hierarchies. Therefore, this area can vary from one provider to the next. Topic names in WebSphere MQ JMS are arranged in a tree-like hierarchy, an example of which is shown in Figure 3.
Sport
Rugby
Football
Tennis
Spurs
Arsenal
Results
Signings
Results
Figure 3. WebSphere MQ classes for Java Message Service topic name hierarchy
In a topic name, levels in the tree are separated by the / character. This means that the Signings node in Figure 3 is identified by the topic name:
Sport/Football/Spurs/Signings
A powerful feature of the topic system in WebSphere MQ classes for Java Message Service is the use of wildcards. These allow subscribers to subscribe to more than one topic at a time. Different brokers use different wildcard characters and different rules for their substitution. Use the broker version property of the topic (BROKERVER) to define which type of wildcards apply. Note: The broker version of a topic must match the broker version of the topic connection factory you are using. Broker Version 1 wildcards The * wildcard matches zero or more characters; the ? wildcard matches a single character.
221
Using topics
If a subscriber subscribes to the topic represented by the following topic name:
Sport/Football/*/Results
it receives publications on topics including: v Sport/Football/Spurs/Results v Sport/Football/Arsenal/Results If the subscription topic is:
Sport/Football/Spurs/*
it receives publications on topics including: v Sport/Football/Spurs/Results v Sport/Football/Spurs/Signings If the subscription topic is:
Sport/Football/*
it v v v
Broker Version 2 wildcards The # wildcard matches multiple levels in a topic; the + wildcard matches a single level. These wildcards can be used only to stand for complete levels within a topic; that is they can be preceded only by / or start-of-string, and they can be followed only by / or end-of-string. If a subscriber subscribes to the topic represented by the following topic name:
Sport/Football/+/Results
it receives publications on topics including: v Sport/Football/Spurs/Results v Sport/Football/Arsenal/Results If a subscriber subscribes to the topic represented by the following topic name:
Sport/#/Results
it receives publications on topics including: v Sport/Football/Spurs/Results v Sport/Football/Arsenal/Results Although Sport/Football/Spur?/Results works with broker Version 1, there is no equivalent for broker Version 2, which does not support single character substitutions. There is no need to administer the topic hierarchies that you use on the broker-side of your system explicitly. When the first publisher or subscriber on a given topic comes into existence, the broker automatically creates the state of the topics currently being published on, and subscribed to.
222
Using Java
Using topics
| Unicode characters are supported. Note: A publisher cannot publish on a topic whose name contains wildcards.
For further details on URIs and the permitted name-value pairs, see Sending a message on page 204. The following code creates a topic for non-persistent, priority 5 messages:
// Create a Topic using the one-argument MQTopic constructor String tSpec = "Sport/Football/Spurs/Results?persistence=1&priority=5"; Topic rtTopic = new MQTopic( "topic://" + tSpec );
Method 2: Using MQTopic(), then setBaseTopicName(..) This method uses the default MQTopic constructor, and therefore renders the code non-portable. After the object is created, set the baseTopicName property using the setBaseTopicName method, passing in the required topic name. Note: The topic name used here is the non-URI form, and cannot include name-value pairs. Set these by using the set methods, as described in Setting properties with the set method on page 206. The following code uses this method to create a topic:
// Create a Topic using the default MQTopic constructor Topic rtTopic = new MQTopic(); // Set the object properties using the setter methods ((MQTopic)rtTopic).setBaseTopicName( "Sport/Football/Spurs/Results" ); ((MQTopic)rtTopic).setPersistence(1); ((MQTopic)rtTopic).setPriority(5);
Method 3: Using session.createTopic(..) You can also create a Topic object using the createTopic method of TopicSession, which takes a topic URI as follows:
// Create a Topic using the session factory method Topic rtTopic = session.createTopic( "topic://Sport/Football/Spurs/Results" );
Although the createTopic method is in the JMS specification, the format of the string argument is vendor-specific. Therefore, using this method might make your code non-portable.
223
Using topics
Method 4: Using session.createTemporaryTopic() A TemporaryTopic is a Topic that can be consumed only by subscribers that are created by the same TopicConnection. A TemporaryTopic is created as follows:
// Create a TemporaryTopic using the session factory method Topic rtTopic = session.createTemporaryTopic();
Subscriber options
There are a number of different ways to use JMS subscribers. This section describes some examples of their use. JMS provides two types of subscribers: Non-durable subscribers These subscribers receive messages on their chosen topic, only if the messages are published while the subscriber is active. Durable subscribers These subscribers receive all the messages published on a topic, including those that are published while the subscriber is inactive.
Non-durable subscribers automatically deregister themselves when their close() method is called (or when they fall out of scope). However, if you want to terminate a durable subscription, you must explicitly notify the system. To do this, use the sessions unsubscribe() method and pass in the unique name that created the subscriber:
// Unsubscribe the durable subscriber created above session.unsubscribe( "D_SUB_000001" );
A durable subscriber is created at the queue manager specified in the MQTopicConnectionFactory queue manager parameter. If there is a subsequent attempt to create a durable subscriber with the same name at a different queue manager, a new and completely independent durable subscriber is returned.
224
Using Java
Subscriber options
// Associate a message selector with a non-durable subscriber String selector = "company = IBM"; TopicSubscriber sub = session.createSubscriber( topic, selector, false );
| | | | | |
You can control whether the JMS client or the broker performs message filtering by setting the MessageSelection property on the TopicConnectionFactory. If the broker is capable of performing message selection, it is generally preferable to let the broker do it because it reduces the number of messages sent to your client. However, if the broker is very heavily loaded, it might be preferable to let the client perform message selection instead.
225
Subscriber options
the lifetime of a durable subscriber is usually much longer than that of a non-durable subscriber. Therefore, more messages might accumulate for a durable subscriber. v External administration of subscription queues is easier. For certain application types, administrators might want to monitor the state and depth of particular subscriber queues. This task is much simpler when there is one to one mapping between a subscriber and a queue.
Default configuration
The default configuration uses the following shared subscription queues: v SYSTEM.JMS.ND.SUBSCRIBER.QUEUE for non-durable subscriptions v SYSTEM.JMS.D.SUBSCRIBER.QUEUE for durable subscriptions These are created for you when you run the MQJMS_PSQ.MQSC script. If required, you can specify alternative physical queues. You can also change the configuration to use the multiple queue approach.
226
Using Java
Subscriber options
Therefore, the durable subscriber queue name property is set in the Topic object (that is, at a more manageable level than TopicConnectionFactory). This enables you to specify a number of different subscriber queue names, without needing to re-create multiple objects starting from the TopicConnectionFactory. You can set the durable subscriber queue name in either of the following ways: v Use the WebSphere MQ JMS administration tool (for JNDI retrieved objects) to set the BROKERDURSUBQ property v Use the setBrokerDurSubQueue() method in your program:
// Set the MQTopic durable subscriber queue name using // the multi-queue approach sportsTopic.setBrokerDurSubQueue("SYSTEM.JMS.D.FOOTBALL.*");
Once the Topic object is initialized, it is passed into the TopicSession createDurableSubscriber() method to create the specified subscription:
// Create a durable subscriber using our earlier Topic TopicSubscriber sub = new session.createDurableSubscriber (sportsTopic, "D_SUB_SPORT_001");
For durable subscriptions, the queue name you provide must start with the following characters: SYSTEM.JMS.D. To select a shared queue approach, specify an explicit queue name, where the named queue is the one to use for the shared queue. The queue that you specify must already physically exist before you create the subscription. To select the multiple queue approach, specify a queue name that ends with the * character. Subsequently, each subscriber that is created with this queue name creates an appropriate dynamic queue, for exclusive use by that subscriber. MQ JMS uses its own internal model queue to create such queues. Therefore, with the multiple queue approach, all required queues are created dynamically. When you use the multiple queue approach, you cannot specify an explicit queue name. However, you can specify the queue prefix. This enables you to create different subscriber queue domains. For example, you could use: SYSTEM.JMS.D.MYDOMAIN.* The characters that precede the * character are used as the prefix, so that all dynamic queues that are associated with this subscription have queue names that start with SYSTEM.JMS.D.MYDOMAIN. You cannot change the queue used by a durable subscriber. To do so, for example to move from the multiple queue approach to the single queue approach, first delete the old subscriber (using the unsubscribe() method) and create the subscription again from new. This removes any unconsumed messages on the durable subscription.
Subscription stores
There is no subscription store with a direct connection to WebSphere MQ Event Broker. WebSphere MQ JMS maintains a persistent store of subscription information, used to resume durable subscriptions and cleanup after failed non-durable subscribers. This information can be managed by the publish/subscribe broker.
Chapter 11. Writing WebSphere MQ JMS publish/subscribe applications
227
Subscriber options
See the README provided with WebSphere MQ JMS for information about suitable levels of queue manager and broker. The choice of subscription store is based on the SUBSTORE property of the TopicConnectionFactory. This takes one of three values: QUEUE, BROKER, or MIGRATE. SUBSTORE(QUEUE) Subscription information is stored on SYSTEM.JMS.ADMIN.QUEUE and SYSTEM.JMS.PS.STATUS.QUEUE on the local queue manager. WebSphere MQ JMS maintains an extra connection for a long-running transaction used to detect failed subscribers. There is a connection to each queue manager in use. In a busy system, this might cause the queue manager logs to fill up, resulting in errors from both the queue manager and its applications. If you experience these problems, the system administrator can add extra log files or datasets to the queue manager. Alternatively, reduce the STATREFRESHINT property on the TopicConnectionFactory. This causes the long-running transaction to be refreshed more frequently, allowing the logs to reset themselves. After a non-durable subscriber has failed: v Information is left on the two SYSTEM.JMS queues, which allows a later JMS application to clean up after the failed subscriber. See Subscriber cleanup utility on page 230 for more information. v Messages continue to be delivered to the subscriber until a later JMS application is executed. SUBSTORE(QUEUE) is provided for compatibility with versions of MQSeries JMS. SUBSTORE(BROKER) Subscription information is stored by the publish/subscribe broker used by the application. This option requires recent levels of queue manager and publish/subscribe broker. See the README provided with WebSphere MQ JMS for information about suitable levels of queue manager and broker. This subscription store requires recent levels of both queue manager and publish/subscribe broker. It is designed to provide improved resilience. When a non-durable subscriber fails, the subscription is deregistered from the broker as soon as possible. The broker adds a response to this deregistration onto the SYSTEM.JMS.REPORT.QUEUE, which is used to clean up after the failed subscriber. With SUBSTORE(BROKER), a separate cleanup thread is run regularly in the background of each JMS publish/subscribe application. Cleanup is run once every 10 minutes by default, but you can change this using the CLEANUPINT property on the TopicConnectionFactory. To customize the actions performed by cleanup, use the CLEANUP property on the TopicConnectionFactory. See Subscriber cleanup utility on page 230 for more information about the different behaviors of cleanup with SUBSTORE(BROKER). SUBSTORE(MIGRATE) MIGRATE is the default value for SUBSTORE.
228
Using Java
Subscriber options
This option dynamically selects the queue-based or broker-based subscription store based on the levels of queue manager and publish/subscribe broker installed. If both queue manager and broker are capable of supporting SUBSTORE(BROKER), this behaves as SUBSTORE(BROKER); otherwise it behaves as SUBSTORE(QUEUE). Additionally, SUBSTORE(MIGRATE) transfers durable subscription information from the queue-based subscription store to the broker-based store. This provides an easy migration path from older versions of WebSphere MQ JMS, WebSphere MQ, and publish/subscribe broker. This migration occurs the first time the durable subscription is opened when both queue manager and broker are capable of supporting the broker-based subscription store. Only information relating to the subscription being opened is migrated; information relating to other subscriptions is left in the queue-based subscription store.
229
Publish/subscribe problems
230
Using Java
Publish/subscribe problems
Note: Close all subscriber objects gracefully whenever possible, to avoid a buildup of subscriber problems. The exact behavior of the utility depends on the subscription store in use: Subscriber cleanup with SUBSTORE(QUEUE) When using the queue-based subscription store, cleanup runs on a queue manager when the first TopicConnection to use that physical queue manager initializes. If all the TopicConnections on a given queue manager close, when the next TopicConnection initializes for that queue manager, the utility runs again. The cleanup utility uses information found on the SYSTEM.JMS.ADMIN.QUEUE and SYSTEM.JMS.PS.STATUS.QUEUE to detect previously failed subscribers. If any are found, it cleans up associated resources by deregistering the subscriber from the broker, and cleaning up any unconsumed messages or temporary queues associated with the subscription. Subscriber cleanup with SUBSTORE(BROKER) With the broker-based subscription store, cleanup runs regularly on a background thread while there is an open TopicConnection to a particular physical queue manager. One instance of the cleanup thread is created for each physical queue manager to which a TopicConnection exists within the JVM. The cleanup utility uses information found on the SYSTEM.JMS.REPORT.QUEUE (typically responses from the publish/subscribe broker) to remove unconsumed messages and temporary queues associated with a failed subscriber. It can be a few seconds after the subscriber fails before the cleanup routine can remove the messages and queues. Two properties on the TopicConnectionFactory control behavior of this cleanup thread: CLEANUP and CLEANUPINT. CLEANUPINT determines how often (in milliseconds) cleanup is executed against any given queue manager. CLEANUP takes one of four possible values: CLEANUP(SAFE) This is the default value. The cleanup thread tries to remove unconsumed subscription messages or temporary queues for failed subscriptions. This mode of cleanup does not interfere with the operation of other JMS applications. CLEANUP(STRONG) The cleanup thread performs as CLEANUP(SAFE), but also clears the SYSTEM.JMS.REPORT.QUEUE of any unrecognized messages. This mode of cleanup can interfere with the operation of JMS applications running with later versions of WebSphere MQ JMS. If multiple JMS applications are using the same queue manager, but using different versions of WebSphere MQ JMS, only clients using the most recent version of WebSphere MQ JMS must use this option. CLEANUP(NONE) In this special mode, no cleanup is performed, and no cleanup
231
Publish/subscribe problems
thread exists. Additionally, if the application is using the single-queue approach, unconsumed messages can be left on the queue. This option can be useful if the application is distant from the queue manager, and especially if it only publishes rather than subscribes. However, one application must clean up the queue manager to deal with any unconsumed messages. This can be a JMS application with CLEANUP(SAFE) or CLEANUP(STRONG), or the manual cleanup utility described in Manual cleanup. CLEANUP(ASPROP) The style of cleanup to use is determined by the system property com.ibm.mq.jms.cleanup, which is queried at JVM startup. This property can be set on the Java command-line using the -D option, to NONE, SAFE, or STRONG. Any other value causes an exception. If not set, the property defaults to SAFE. This allows easy JVM-wide change to the cleanup level without updating every TopicConnectionFactory used by the system. This is useful for applications or application servers that use multiple TopicConnectionFactory objects. Where multiple TopicConnections exist within a JVM against the same queue manager, but with differing values for CLEANUP and CLEANUPINT, the following rules are used to determine behavior: 1. A TopicConnection with CLEANUP(NONE) does not attempt to clean up immediately after its subscription has closed. However, if another TopicConnection is using SAFE or STRONG cleanup, the cleanup thread eventually cleans up after the subscription. 2. If any TopicConnection is using STRONG Cleanup, the cleanup thread operates at STRONG level. Otherwise, if any TopicConnection uses SAFE Cleanup, the cleanup thread operates at SAFE level. Otherwise, there is no cleanup thread. 3. The smallest value of CLEANUPINT for those TopicConnections with SAFE or STRONG Cleanup is used.
Manual cleanup
If you use the broker-based subscription store, you can operate cleanup manually from the command-line. The syntax for bindings attach is:
Cleanup [-m <qmgr>] [-r <interval>] [SAFE | STRONG | FORCE | NONDUR] [-t]
Where: v qmgr, hostname, port, and channel determine connection settings for the queue manager to clean up. v -r sets the interval between executions of cleanup, in minutes. If not set, cleanup is performed once. v -t enables tracing, to the mqjms.trc file. v SAFE, STRONG, FORCE, and NONDUR set the cleanup level, as follows:
232
Using Java
Publish/subscribe problems
SAFE and STRONG cleanup behave like the CLEANUP(SAFE) and CLEANUP(STRONG) options discussed in Subscriber cleanup utility on page 230. FORCE cleanup behaves like STRONG Cleanup. However, STRONG cleanup leaves messages that could not be processed on the SYSTEM.JMS.REPORT.QUEUE; FORCE cleanup removes all messages even if it encounters an error during processing.
Warning This is a dangerous option that can leave an inconsistent state between the queue manager and the broker. It cannot be run while any WebSphere MQ JMS publish/subscribe application is running against the queue manager; doing so causes the cleanup utility to abort. NONDUR behaves like FORCE cleanup. After clearing the SYSTEM.JMS.REPORT.QUEUE, it attempts to remove any remaining unconsumed messages sent to non-durable subscribers. If the queue managers command server is running on any queue beginning SYSTEM.JMS.ND.*, messages are cleared and the queue itself might be deleted. Otherwise, only SYSTEM.JMS.ND.SUBSCRIBER.QUEUE and SYSTEM.JMS.ND.CC.SUBSCRIBER.QUEUE are cleared of messages.
This class allows complete customization of publish/subscribe Cleanup, but it is intended for use by system administration programs rather than application programs. For more details, refer to Cleanup * on page 308.
233
Publish/subscribe problems
The compiled form of the tool is installed in the <MQ_JAVA_INSTALL_PATH>/bin directory. To invoke the tool, change to this directory, then use the following command:
java PSReportDump [-m queueManager] [-clear]
where: -m queueManager The name of the queue manager to use -clear Clear the queue of messages after dumping its contents Attention: Do not use this option if you are using the broker-based subscription store. Instead, run the manual cleanup utility at FORCE level. Output is sent to the screen, or you can redirect it to a file. | | | | | |
Other considerations
If a large number of JMS clients connect directly to a WebSphere MQ Event Broker broker on Windows, and the connections happen almost simultaneously, a java.net.BindException address in use exception might be thrown in response to a TopicConnection call. You can try to avoid this by catching the exception and retrying, or by pacing the connections.
234
Using Java
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
JMS 1.1 retains all the domain specific interfaces in JMS 1.0.2b, and so existing applications can still use these interfaces. For new applications, however, consider using the JMS 1.1 domain independent interfaces. In the WebSphere MQ JMS implementation of JMS 1.1, the administered objects are the following: v ConnectionFactory v Queue v Topic Destination is an abstract superclass of Queue and Topic, and so an instance of Destination is either a Queue or a Topic object. The domain independent interfaces
235
Building a connection
Connections are not created directly, but are built using a connection factory. ConnectionFactory objects can be stored in a JNDI namespace, insulating the JMS application from provider specific information. For information about how to create and store ConnectionFactory objects, see Chapter 5, Using the WebSphere MQ JMS administration tool, on page 41.
In this code: icf url Defines a factory class for the initial context Defines a context specific URL
For more details about using a JNDI namespace, see Suns JNDI documentation. Note: Some combinations of the JNDI packages and LDAP service providers can result in an LDAP error 84. To resolve the problem, insert the following line before the call to InitialDirContext:
environment.put(Context.REFERRAL, "throw");
After an initial context is obtained, you can retrieve a ConnectionFactory object from the JNDI namespace by using the lookup() method. The following code retrieves a ConnectionFactory object named CF from an LDAP based namespace:
ConnectionFactory factory; factory = (ConnectionFactory)ctx.lookup("cn=CF");
Both QueueConnectionFactory and TopicConnectionFactory inherit the createConnection() method from ConnectionFactory. You can therefore use createConnection() to create a domain specific object, as shown in the following code:
236
Using Java
Building a connection
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
QueueConnectionFactory QCF; Connection connection; connection = QCF.createConnection();
This code creates a QueueConnection object. An application can now perform a domain independent operation on this object, or an operation that is applicable only to the point-to-point domain. If the application attempts to perform an operation that is applicable only to the publish/subscribe domain, an IllegalStateException is thrown with the message MQJMS1112: JMS 1.1 Invalid operation for a domain specific object. This is because the connection was created from a domain specific connection factory.
The default transport type is bindings. You can change the transport type for a connection factory by using the setTransportType() method. Here are some examples:
fact.setTransportType(JMSC.MQJMS_TP_BINDINGS_MQ); // Bindings mode fact.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); // Client mode fact.setTransportType(JMSC.MQJMS_TP_DIRECT_TCPIP); // Direct TCP/IP mode
For information about transport types in each of the specific messaging domains, see Choosing client or bindings transport on page 202, for the point-to-point domain, and TopicConnectionFactory administered objects on page 220, for the publish/subscribe domain. Note that you cannot use the point-to-point style of messaging if the transport type is direct. If an application uses Connection and Session objects that are created from a ConnectionFactory object whose transport type is direct, the application can perform only publish/subscribe operations. A ConnectionFactory object has the same properties as those of a QueueConnectionFactory object and a TopicConnectionFactory object combined. However, certain combinations of property settings are not valid for a ConnectionFactory object. See Properties on page 49 for more details.
237
Building a connection
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | LOCALADDRESS property of a ConnectionFactory, QueueConnectionFactory, or TopicConnectionFactory object to specify a port, or a range of points, that the application can bind to. You can set the LOCALADDRESS property by using the WebSphere MQ JMS administration tool, or by calling the setLocalAddress() method in a JMS application. Here is an example of setting the property from within an application:
mqConnectionFactory.setLocalAddress("9.20.0.1(2000,3000)");
When the application connects to a queue manager subsequently, the application binds to a local IP address and port number in the range 9.20.0.1(2000) to 9.20.0.1(3000). Connection errors might occur if you restrict the range of ports. If an error occurs, a JMSException is thrown with an embedded MQException that contains the WebSphere MQ reason code, MQRC_Q_MGR_NOT_AVAILABLE. An error might occur if all the ports in the specified range are in use, or if the LOCALADDRESS property contains an IP address, host name, or port number that is not valid; a negative port number, for example. Because the WebSphere MQ JMS client might create connections other than those required by an application, always consider specifying a range of ports. In general, every Session created by an application requires one port and the WebSphere MQ JMS client might require three additional ports. If a connection error does occur, increase the range of ports. JMS connection pooling, which is used by default, might have an effect on the speed at which ports can be reused. As a result, a connection error might occur while ports are being freed.
Obtaining a session
After a connection is made, use the createSession() method on the Connection object to obtain a session. The method has two parameters: 1. A boolean parameter that determines whether the session is transacted or non-transacted. 2. A parameter that determines the acknowledge mode. The simplest case is obtaining a non-transacted session with an acknowledge mode of AUTO_ACKNOWLEDGE, as shown in the following code:
Session session; . . . boolean transacted = false; session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);
Note: A connection is thread safe, but sessions (and the objects that are created from them) are not. The recommended practice for multithreaded applications is to use a separate session for each thread.
238
Using Java
Destinations
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Destinations
The Destination interface is the abstract superclass of Queue and Topic. In the WebSphere MQ JMS implementation of JMS 1.1, Queue and Topic objects encapsulate addresses in WebSphere MQ and the broker. For example, a Queue object encapsulates the name of a WebSphere MQ queue. For information about using Queue objects in the point-to-point domain, see Sending a message on page 204 and, for information about using Topic objects in the publish/subscribe domain, see Using topics on page 221. The following is a overview from a domain independent perspective. Queue and Topic objects are retrieved from a JNDI namespace in the following way:
Queue ioQueue; ioQueue = (Queue)ctx.lookup( qLookup ); . . . Topic ioTopic; ioTopic = (Topic)ctx.lookup( tLookup );
The WebSphere MQ JMS implementation of Queue and Topic interfaces are in the com.ibm.mq.jms.MQQueue and com.ibm.qm.jms.MQTopic classes respectively. These classes contain properties that control the behavior of WebSphere MQ and the broker but, in many cases, it is possible to use the default values. As well as being able to administer Queue and Topic objects in a JNDI namespace, JMS defines a standard way of specifying a destination at runtime that minimizes the WebSphere MQ specific code in the application. This mechanism uses the Session.createQueue() and Session.createTopic() methods, which take a string parameter that specifies the destination. The string is still in a provider specific format, but this approach is more flexible than referring directly to the provider classes. WebSphere MQ JMS accepts two forms for the string parameter of createQueue(): v The first is the name of a WebSphere MQ queue:
public static final String QUEUE = "SYSTEM.DEFAULT.LOCAL.QUEUE" ; . . . ioQueue = session.createQueue( QUEUE );
v The second, and more powerful, form is a uniform resource identifier (URI). This form allows you to specify a remote queue, which is a queue on a queue manager other than the one to which you are connected. It also allows you to set the other properties of a com.ibm.mq.jms.MQQueue object. The URI for a queue begins with the sequence queue://, followed by the name of the queue manager on which the queue resides. This is followed by a further forward slash (/), the name of the queue, and, optionally, a list of name-value pairs that set the remaining queue properties. For example, the URI equivalent of the previous example is the following:
ioQueue = session.createQueue("queue:///SYSTEM.DEFAULT.LOCAL.QUEUE");
The name of the queue manager is omitted. This is interpreted to mean as the queue manager to which the owning Connection object is connected at the time when the Queue object is used.
239
Destinations
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Note: When sending a message to a cluster, leave the queue manager field in the Queue object blank. This enables an MQOPEN call to be performed in BIND_NOT_FIXED mode, which allows the queue manager to be determined. Otherwise an exception is returned reporting that the Queue object cannot be found. This applies when using JNDI or defining a queue at runtime. WebSphere MQ JMS accepts a topic URI for the string parameter of createTopic(), as shown in the following example:
Topic topic = session.createTopic( "topic://Sport/Football/Spurs/Results" );
Although the createTopic() method is in the JMS specification, the format of the string argument is provider specific. Therefore, using this method can make your code non-portable. Other ways of creating a Topic object at runtime are as follows: Using MQTopic(..) This way requires a reference to the WebSphere MQ JMS implementation of the Topic interface, and therefore renders the code non-portable. The constructor takes one argument, which must be a URI. For a WebSphere MQ JMS topic, this must be of the form:
topic://TopicName[?property=value[&property=value]*]
For example, the following code creates a topic for nonpersistent messages with a priority of 5:
// Create a Topic using the one-argument MQTopic constructor String tSpec = "Sport/Football/Spurs/Results?persistence=1&priority=5"; Topic rtTopic = new MQTopic( "topic://" + tSpec );
Using MQTopic(), then setBaseTopicName(..) This way uses the default MQTopic constructor, and therefore renders the code non-portable. Here is an example:
// Create a Topic using the default MQTopic constructor Topic rtTopic = new MQTopic(); . . . // Set the object properties using the setter methods ((MQTopic)rtTopic).setBaseTopicName( "Sport/Football/Spurs/Results" ); ((MQTopic)rtTopic).setPersistence(1); ((MQTopic)rtTopic).setPriority(5);
Using session.createTemporaryTopic() A temporary topic is created by a session, and only message consumers created by the same session can consume messages from the topic. A TemporaryTopic object is created as follows:
// Create a TemporaryTopic using the session factory method Topic rtTopic = session.createTemporaryTopic();
Sending a message
An application sends messages using a MessageProducer object. A MessageProducer object is normally created for a specific destination so that all messages sent using that message producer are sent to the same destination. The destination is specified using either a Queue or a Topic object. Queue and Topic objects can be created at runtime, or built and stored in a JNDI namespace, as described in Destinations on page 239.
240
Using Java
Sending a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After a Queue or a Topic object is obtained, an application can pass the object to the createProducer() method to create a MessageProducer object, as shown in the following example:
MessageProducer messageProducer = session.createProducer(ioDestination);
The parameter ioDestination can be either a Queue or a Topic object. The application can then use the send() method on the MessageProducer object to send messages. Here is an example:
messageProducer.send(outMessage);
You can use the send() method to send messages in either messaging domain. The nature of the destination determines the actual domain used. However, TopicPublisher, the sub-interface for MessageProducer that is specific to the publish/subscribe domain, uses a publish() method instead. An application can create a MessageProducer object with no specified destination. In this case, the application must specify the destination in the send() method.
Message types
JMS provides several message types, each of which embodies some knowledge of its content. To avoid referring to the provider specific class names for the message types, methods for creating messages are provided on a Session object. For example, a text message can be created in the following manner:
System.out.println( "Creating a TextMessage" ); TextMessage outMessage = session.createTextMessage(); System.out.println("Adding Text"); outMessage.setText(outString);
Here are the message types you can use: v BytesMessage v MapMessage v ObjectMessage v StreamMessage v TextMessage Details of these types are in Chapter 15, JMS interfaces and classes, on page 295.
Receiving a message
An application receives messages using a MessageConsumer object. The application creates a MessageConsumer object by using the createConsumer() method on a Session object. This method has a destination parameter that defines where the messages are received from. See Destinations on page 239 for details of how to create a destination, which is either a Queue or a Topic object. In the point-to-point domain, the following code creates a MessageConsumer object and then uses the object to receive a message:
MessageConsumer messageConsumer = session.createConsumer(ioQueue); Message inMessage = messageConsumer.receive(1000);
The parameter on the receive() call is a timeout in milliseconds. This parameter defines how long the method must wait if no message is available immediately.
Chapter 12. Writing WebSphere MQ JMS 1.1 applications
241
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | You can omit this parameter; in which case, the call blocks until a suitable message arrives. If you do not want any delay, use the receiveNoWait() method. The receive() methods return a message of the appropriate type. For example, suppose a text message is put on a queue. When the message is received, the object that is returned is an instance of TextMessage. To extract the content from the body of the message, it is necessary to cast from the generic Message class (which is the declared return type of the receive() methods) to the more specific subclass, such as TextMessage. If the received message type is not known, you can use the instanceof operator to determine which type it is. It is good practice always to test the message class before casting so that unexpected errors can be handled gracefully. The following code uses the instanceof operator and shows how to extract the content of a text message:
if (inMessage instanceof TextMessage) { String replyString = ((TextMessage) inMessage).getText(); . . . } else { // Print error message if Message was not a TextMessage. System.out.println("Reply message was not a TextMessage"); }
JMS provides two types of message consumer: Nondurable message consumer A nondurable message consumer receives messages from its chosen destination only if the messages are available while the consumer is active. In the point-to-point domain, whether a consumer receives messages that are sent while the consumer is inactive depends on how WebSphere MQ is configured to support that consumer. In the publish/subscribe domain, a consumer does not receive messages that are sent while the consumer is inactive. Durable topic subscriber A durable topic consumer receives all the messages sent to a destination, including those sent while the consumer is inactive. The following sections describe how to create a durable topic subscriber, and how to configure WebSphere MQ and the broker to support either type of message consumer.
242
Using Java
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A durable topic subscriber is created for the queue manager specified by the QMANAGER property of the MQTopicConnectionFactory object. If there is a subsequent attempt to create a durable topic subscriber with the same name for a different queue manager, a new and completely independent durable topic subscriber is returned. Nondurable message consumers in the publish/subscribe domain automatically deregister themselves when their close() method is called, or when they fall out of scope. However, if you want to terminate a durable subscription, you must explicitly notify the broker. To do this, use the unsubscribe() method of the session and pass in the name that uniquely identifies the subscription:
// Unsubscribe the durable subscriber created above session.unsubscribe( "D_SUB_000001" );
Message selectors
JMS allows an application to specify that only messages that satisfy certain criteria are returned by successive receive() calls. When creating a MessageConsumer object, you can provide a string that contains an SQL (Structured Query Language) expression, which determines which messages are retrieved. This SQL expression is called a selector. The selector can refer to fields in the JMS message header as well as fields in the message properties (these are effectively application defined header fields). Details of the header field names, as well as the syntax for an SQL selector, are in Chapter 13, JMS messages, on page 257. The following example shows how to select messages based on a user defined property called myProp:
messageConsumer = session.createConsumer(ioQueue, "myProp = blue");
Note: The JMS specification does not permit the selector associated with a message consumer to be changed. After a message consumer is created, the selector is fixed for the lifetime of that consumer. This means that, if you require different selectors, you must create new message consumers. In the publish/subscribe domain, you can control whether the JMS client or the broker performs message filtering by setting the MSGSELECTION property on the ConnectionFactory object. If the broker is capable of performing message selection, it is generally preferable to let the broker do it because it reduces the amount of work done by the client. However, if the broker is very heavily loaded, it might be preferable to let the client perform message selection instead.
The example that follows shows how to create a durable topic subscriber that applies a selector and ignores local publications:
// Create a durable, noLocal subscriber with a selector applied String selector = "company = IBM"; TopicSubscriber sub = session.createDurableSubscriber( topic, "D_SUB_000001", selector, true );
243
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Default configuration
The default WebSphere MQ JMS configuration for the publish/subscribe domain uses the following shared consumer queues: v SYSTEM.JMS.ND.SUBSCRIBER.QUEUE for nondurable message consumers v SYSTEM.JMS.D.SUBSCRIBER.QUEUE for durable topic subscribers These are created for you when you run the MQJMS_PSQ.MQSC script. If required, you can specify alternative WebSphere MQ queues. You can also change the configuration to use the multiple queue approach.
244
Using Java
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To use the shared queue approach, specify the complete name of the shared queue. The queue must exist before you can create a subscription. To use the multiple queue approach, specify a queue name that ends with an asterisk (*). Subsequently, when an application creates a nondurable message consumer specifying this queue name, WebSphere MQ JMS creates a temporary dynamic queue for exclusive use by that consumer. With the multiple queue approach, therefore, all the required queues are created dynamically. If you use the multiple queue approach, you cannot specify the complete name of a queue, only a prefix. This allows you to create different domains of consumer queues. For example, you can use: SYSTEM.JMS.ND.MYDOMAIN.* The characters that precede the asterisk (*) are used as the prefix, so that all dynamic queues for nondurable message consumers specifying this prefix have queue names that start with SYSTEM.JMS.ND.MYDOMAIN.
After the Topic object is initialized, it can be passed into the createDurableSubscriber() method of a Session object to create a durable topic subscriber:
Chapter 12. Writing WebSphere MQ JMS 1.1 applications
245
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
// Create a durable subscriber using our earlier Topic TopicSubscriber sub = session.createDurableSubscriber(sportsTopic, "D_SUB_SPORT_001");
If you use the multiple queue approach, you cannot specify the complete name of a queue, only a prefix. This allows you to create different domains of consumer queues. For example, you can use: SYSTEM.JMS.D.MYDOMAIN.* The characters that precede the asterisk (*) are used as the prefix, so that all dynamic queues for durable topic subscribers specifying this prefix have queue names that start with SYSTEM.JMS.D.MYDOMAIN. You cannot change the consumer queue of a durable topic subscriber. If, for example, you want to move from the multiple queue approach to the single queue approach, you must first delete the old subscriber using the unsubscribe() method and then create a new subscriber. Deleting the old subscriber also deletes any unconsumed messages for that subscriber.
Subscription stores
A subscription store is not used if the transport type is direct. When an application creates a message consumer in the publish/subscribe domain, information about the subscription is created at the same time. WebSphere MQ JMS maintains a persistent store of subscription information called a subscription store. A subscription store is used to reopen durable topic subscribers and to clean up after a nondurable message consumer fails. A subscription store can be managed by the local queue manager or by the publish/subscribe broker. The SUBSTORE property of a ConnectionFactory object determines the location of a subscription store. SUBSTORE has three possible values: SUBSTORE(QUEUE) Subscription information is stored in the queues, SYSTEM.JMS.ADMIN.QUEUE and SYSTEM.JMS.PS.STATUS.QUEUE, on the local queue manager. WebSphere MQ JMS maintains an extra connection to each queue manager used by applications. This connection is used to detect an application that fails and to clean up after the application. In a busy system, this might cause the queue manager logs to fill up resulting in errors from both the queue manager and the applications connected to it. If you experience these problems, the system administrator can add extra log files or data sets to the queue manager. Alternatively, you can reduce the STATREFRESHINT property of the ConnectionFactory object. This causes the long running transaction to be refreshed more frequently allowing the logs to reset themselves. After a nondurable message consumer fails, the following occurs: v Subscription information related to the failed consumer remains on the two queues implementing the subscription store. This information can be removed by a cleanup utility supplied with WebSphere MQ JMS. See Consumer cleanup utility for the publish/subscribe domain on page 248 for more information. v Messages continue to be delivered to the consumer until the cleanup utility runs.
246
Using Java
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This option is provided for compatibility with versions of MQSeries JMS. SUBSTORE(BROKER) Subscription information is stored by the publish/subscribe broker used by the application, not in WebSphere MQ queues. This means that, if a JMS client fails, the broker can clean up the resources associated with the JMS client without having to wait for the JMS client to reconnect. See the README provided with WebSphere MQ JMS for information about which release levels of WebSphere MQ and the broker support this option. If a nondurable message consumer fails, the subscription is de-registered from the broker as soon as possible. In response to the de-registration, the broker puts a report message on the queue, SYSTEM.JMS.REPORT.QUEUE. This message is used to clean up after the failed consumer. If you use this option, a separate cleanup thread is run in the background. By default, the cleanup utility runs once every 10 minutes, but you can change this interval by setting the CLEANUPINT property of the ConnectionFactory object. To customize the actions performed by the cleanup utility, use the CLEANUP property of the ConnectionFactory object. For more information about how the cleanup utility works, see Consumer cleanup utility for the publish/subscribe domain on page 248. SUBSTORE(MIGRATE) This is the default value. This option dynamically selects a queue based or a broker based subscription store depending on the release levels of WebSphere MQ and the publish/subscribe broker that are installed. If both WebSphere MQ and the broker are capable of supporting the SUBSTORE(BROKER) option, this option behaves like the SUBSTORE(BROKER) option; otherwise, it behaves like the SUBSTORE(QUEUE) option. If this option behaves like the SUBSTORE(BROKER) option, the option additionally migrates durable subscription information from the queue based subscription store to the broker based store. This migration occurs the first time a durable subscription is opened when both WebSphere MQ and the broker are capable of supporting a broker based subscription store. Only information related to the subscription being opened is migrated. Information related to other subscriptions is left in the queue based subscription store. This option therefore provides an easy migration path from older versions of WebSphere MQ JMS, WebSphere MQ, and the publish/subscribe broker.
247
Receiving a message
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After a subscription is migrated, it is important not to access the subscription from an application using an older version of WebSphere MQ JMS, or from an application running with the SUBSTORE(QUEUE) option. Doing either of these creates a subscription in the queue based subscription store and prevents an application running with the SUBSTORE(MIGRATE) option from using the subscription. To recover from this situation if it occurs, run your application with the SUBSTORE(BROKER) option, or unsubscribe from the subscription that is held in the queue based subscription store.
Asynchronous delivery
An application can call the MessageConsumer.receive() method to receive messages. As an alternative, an application can register a method that is called automatically when a suitable message is available. This is called asynchronous delivery of messages. The following code illustrates the mechanism:
import javax.jms.*; public class MyClass implements MessageListener { // The method that will be called by JMS when a message // is available. public void onMessage(Message message) { System.out.println("message is "+message); // application specific processing here . . . } } . . . // In Main program (possibly of some other class) MyClass listener = new MyClass(); messageConsumer.setMessageListener(listener); // main program can now continue with other application specific // behavior.
Note: Using asynchronous delivery with a message consumer marks the entire session as using asynchronous delivery. An application cannot call the receive() methods of a message consumer if the message consumer is associated with a session that is using asynchronous delivery.
248
Using Java
249
Manual cleanup
If you use a broker based subscription store, you can operate the cleanup utility manually from the command line. Here is the syntax of the command: For a bindings connection:
Cleanup [-m <qmgr>] [-r <interval>] [SAFE | STRONG | FORCE | NONDUR] [-t]
250
Using Java
The parameters of the command are as follows: v qmgr, hostname, port, and channel enable the cleanup utility to connect to a queue manager. v -r sets the interval, in minutes, between each run of the cleanup utility. If the parameter is not set, the cleanup utility runs once only. v -t enables tracing. The output is sent to the file mqjms.trc. v SAFE, STRONG, FORCE, or NONDUR sets the cleanup level as follows: SAFE and STRONG behave like the CLEANUP(SAFE) and CLEANUP(STRONG) modes discussed in Consumer cleanup utility for the publish/subscribe domain on page 248. FORCE behaves like STRONG mode. But, whereas STRONG mode leaves any messages that cannot be processed on the queue, SYSTEM.JMS.REPORT.QUEUE, FORCE mode deletes all the messages even if it encounters an error during processing.
Warning This is a dangerous mode that can leave an inconsistent state between the queue manager and the broker. You cannot run the cleanup utility in this mode while any WebSphere MQ JMS publish/subscribe applications are connected to the queue manager. If you try to do so, the cleanup utility ends. NONDUR behaves like FORCE mode but, in addition, this mode deletes all the messages on queues whose names begin with the characters SYSTEM.JMS.ND. To do this successfully, the command server of the queue manager must be running.
This class allows complete customization of the publish/subscribe cleanup utility, but it is intended for use by system administration programs rather than application programs. For more details, see Cleanup * on page 308.
251
Closing down
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Closing down
Garbage collection alone cannot release all WebSphere MQ resources in a timely manner, especially if an application creates many short lived JMS objects at the session level or lower. It is therefore important for an application to call the appropriate close() method to close a Connection, Session, MessageConsumer, or MessageProducer object when it is no longer required.
Handling errors
Any runtime errors in a JMS application are reported by exceptions. The majority of JMS methods throw a JMSException to indicate an error. It is good programming practice to catch these exceptions and display them on a suitable output device. A JMSException can contain a further exception embedded within it. For JMS, this can be a valuable way to pass important information about the error from the underlying transport. In the case of WebSphere MQ JMS, an MQException is thrown in WebSphere MQ base Java whenever an error occurs in WebSphere MQ, and this exception is usually included as the embedded exception in a JMSException. The implementation of JMSException does not include the embedded exception in the output of its toString() method. Therefore, you must check explicitly for an embedded exception and print it out, as shown in the following example:
try { . . code which may throw a JMSException . } catch (JMSException je) { System.err.println("caught "+je); Exception e = je.getLinkedException(); if (e != null) { System.err.println("linked exception: "+e); } }
Exception listener
For asynchronous message delivery, the application code cannot catch exceptions raised by failures to receive messages. This is because the application code does not make explicit calls to receive() methods. To cope with this situation, you can register an ExceptionListener, which is an instance of a class that implements the onException() method. When a serious error occurs, this method is called with the JMSException passed as its only parameter. Further details are in Suns JMS documentation.
252
Using Java
Handling errors
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the local queue manager and are normally consumed by the WebSphere MQ JMS. Under some error conditions, however, they might remain on the queue. WebSphere MQ JMS supplies a Java application, PSReportDump, which dumps the contents of the queue, SYSTEM.JMS.REPORT.QUEUE, in plain text format. The information in the dump can be analyzed by you or by IBM support staff. You can also use the application to delete all the messages in the queue after a problem is diagnosed or fixed. The compiled form of the application is in the <MQ_JAV A_INSTALL_PATH>/bin directory. To start the application, change to this directory and use the following command:
java PSReportDump [-m queueManager] [-clear]
where: -m queueManager is the name of the queue manager to use -clear causes all the messages on the queue to be deleted after their contents have been dumped Attention: Do not use this option if you are using a broker based subscription store. Instead, run the manual cleanup utility in FORCE mode. The output from the application is sent to the screen, or you can redirect it to a file.
Other considerations
If a large number of JMS clients connect directly to a WebSphere MQ Event Broker broker on Windows, and the connections happen almost simultaneously, a java.net.BindException address in use exception might be thrown in response to a request to connect to the broker. You can try to avoid this by catching the exception and retrying, or by pacing the connections.
User exits
WebSphere MQ JMS allows you to implement send, receive, and security exits using interfaces supplied by WebSphere MQ base Java. For WebSphere MQ JMS, ensure that your exit has a constructor that takes a single string argument. See the description of exit related set methods in Table 14 on page 202 and Property dependencies on page 56.
253
Using SSL
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This section assumes that your JSSE provider is correctly installed and configured, and that suitable certificates have been installed and made available to your JSSE provider.
This can also be set from an application, using the setSSLCipherSuite() method on an MQConnectionFactory object. For convenience, if a CipherSpec is specified on the SSLCIPHERSUITE property, JMSAdmin attempts to map the CipherSpec to an appropriate CipherSuite and issues a warning. This attempt to map is not made if the property is specified by an application.
Checking is not case sensitive and semicolons can be used in place of commas. This can also be set from an application using the setSSLPeerName() method on an MQConnectionFactory object. If this property is not set, no checking is performed on the Distinguished Name supplied by the queue manager. This property is ignored if no CipherSuite is set.
254
Using Java
Using SSL
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Note: To use a CertStore successfully with a CRL hosted on an LDAP server, make sure that your Java Software Development Kit (SDK) is compatible with the CRL. Some SDKs require that the CRL conforms to RFC 2587, which defines a schema for LDAP v2. Most LDAP v3 servers use RFC 2256 instead. If your LDAP server is not running on the default port of 389, the port can be specified by appending a colon (:) and the port number to the host name. If the certificate presented by the queue manager is present in the CRL hosted on crl1.ibm.com, the connection does not complete. To avoid a single point of failure, JMS allows multiple LDAP servers to be supplied by supplying a list of LDAP servers delimited by the space character. Here is an example:
ALTER CF(my.cf) SSLCRL(ldap://crl1.ibm.com ldap://crl2.ibm.com)
When multiple LDAP servers are specified, JMS tries each one in turn until it finds a server with which it can successfully verify the queue managers certificate. Each server must contain identical information. A string in this format can be supplied by an application on the MQConnectionFactory.setSSLCertStores() method. Alternatively, the application can create one or more java.security.cert.CertStore objects, place these in a suitable Collection object, and supply this Collection object to the setSSLCertStores() method. In this way, the application can customize CRL checking. Refer to your JSSE documentation for details on constructing and using CertStore objects. The certificate presented by the queue manager when a connection is being set up is validated as follows: 1. The first CertStore object in the Collection identified by sslCertStores is used to identify a CRL server. 2. An attempt is made to contact the CRL server. 3. If the attempt is successful, the server is searched for a match for the certificate. a. If the certificate is found to be revoked, the search process is over and the connection request fails with reason code MQRC_SSL_CERTIFICATE_REVOKED. b. If the certificate is not found, the search process is over and the connection is allowed to proceed. 4. If the attempt to contact the server is unsuccessful, the next CertStore object is used to identify a CRL server and the process repeats from step 2. If this was the last CertStore in the Collection, or if the Collection contains no CertStore objects, the search process has failed and the connection request fails with reason code MQRC_SSL_CERT_STORE_ERROR. The Collection object determines the order in which CertStores are used. If your application uses setSSLCertStores() to set a Collection of CertStore objects, the MQConnectionFactory can no longer be bound into a JNDI namespace. Attempting to do so causes an exception. If the sslCertStores property is not set, no
Chapter 12. Writing WebSphere MQ JMS 1.1 applications
255
Using SSL
| | | | | | | | | | | | | | | | | | | | | | | | | revocation checking is performed on the certificate provided by the queue manager. This property is ignored if no CipherSuite is set.
256
Using Java
Properties
Body
The JMSCorrelationID header field is used to link one message with another. It typically links a reply message with its requesting message. JMSCorrelationID can hold a provider-specific message ID, an application-specific String, or a provider-native byte[] value.
Message selectors
A message contains a built-in facility to support application-defined property values. In effect, this provides a mechanism to add application-specific header fields to a message. Properties allow an application, using message selectors, to have a JMS provider select or filter messages on its behalf, using application-specific criteria. Application-defined properties must obey the following rules: v Property names must obey the rules for a message selector identifier. v Property values can be boolean, byte, short, int, long, float, double, and string. v The JMSX and JMS_ name prefixes are reserved. Property values are set before sending a message. When a client receives a message, the message properties are read-only. If a client attempts to set properties at this point, a MessageNotWriteableException is thrown. If clearProperties is called, the properties can now be both read from, and written to.
257
Message selectors
A property value might duplicate a value in a messages body. JMS does not define a policy for what should or should not be made into a property. However, application developers must be aware that JMS providers probably handle data in a messages body more efficiently than data in a messages properties. For best performance, applications must use message properties only when they need to customize a messages header. The primary reason for doing this is to support customized message selection. A JMS message selector allows a client to specify the messages that it is interested in by using the message header. Only messages whose headers match the selector are delivered. Message selectors cannot refer to message body values. A message selector matches a message when the selector evaluates to true when the messages header field and property values are substituted for their corresponding identifiers in the selector. A message selector is a String, whose syntax is based on a subset of the SQL92 conditional expression syntax. The order in which a message selector is evaluated is from left to right within a precedence level. You can use parentheses to change this order. Predefined selector literals and operator names are written here in upper case; however, they are not case-sensitive. A selector can contain: v Literals A string literal is enclosed in single quotes. A doubled single quote represents a single quote. Examples are literal and literals. Like Java string literals, these use the Unicode character encoding. An exact numeric literal is a numeric value without a decimal point, such as 57, -957, and +62. Numbers in the range of Java long are supported. An approximate numeric literal is a numeric value in scientific notation, such as 7E3 or -57.9E2, or a numeric value with a decimal, such as 7., -95.7, or +6.2. Numbers in the range of Java double are supported. The boolean literals TRUE and FALSE. v Identifiers: An identifier is an unlimited length sequence of Java letters and Java digits, the first of which must be a Java letter. A letter is any character for which the method Character.isJavaLetter returns true. This includes _ and $. A letter or digit is any character for which the method Character.isJavaLetterOrDigit returns true. Identifiers cannot be the names NULL, TRUE, or FALSE. Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, or IS. Identifiers are either header field references or property references. Identifiers are case-sensitive. Message header field references are restricted to: - JMSDeliveryMode - JMSPriority - JMSMessageID - JMSTimestamp - JMSCorrelationID
258
Using Java
Message selectors
- JMSType JMSMessageID, JMSTimestamp, JMSCorrelationID, and JMSType values can be null, and if so, are treated as a NULL value. Any name beginning with JMSX is a JMS-defined property name. Any name beginning with JMS_ is a provider-specific property name. Any name that does not begin with JMS is an application-specific property name. If there is a reference to a property that does not exist in a message, its value is NULL. If it does exist, its value is the corresponding property value. v White space is the same as it is defined for Java: space, horizontal tab, form feed, and line terminator. v Expressions: A selector is a conditional expression. A selector that evaluates to true matches; a selector that evaluates to false or unknown does not match. Arithmetic expressions are composed of themselves, arithmetic operations, identifiers (whose value is treated as a numeric literal), and numeric literals. Conditional expressions are composed of themselves, comparison operations, and logical operations. v Standard bracketing (), to set the order in which expressions are evaluated, is supported. v Logical operators in precedence order: NOT, AND, OR. v Comparison operators: =, >, >=, <, <=, <> (not equal). Only values of the same type can be compared. One exception is that it is valid to compare exact numeric values and approximate numeric values. (The type conversion required is defined by the rules of Java numeric promotion.) If there is an attempt to compare different types, the selector is always false. String and boolean comparison is restricted to = and <>. Two strings are equal only if they contain the same sequence of characters. v Arithmetic operators in precedence order: +, - unary. *, /, multiplication, and division. +, -, addition, and subtraction. Arithmetic operations on a NULL value are not supported. If they are attempted, the complete selector is always false. Arithmetic operations must use Java numeric promotion. v arithmetic-expr1 [NOT] BETWEEN arithmetic-expr2 and arithmetic-expr3 comparison operator: Age BETWEEN 15 and 19 is equivalent to age >= 15 AND age <= 19. Age NOT BETWEEN 15 and 19 is equivalent to age < 15 OR age > 19. If any of the expressions of a BETWEEN operation are NULL, the value of the operation is false. If any of the expressions of a NOT BETWEEN operation are NULL, the value of the operation is true. v identifier [NOT] IN (string-literal1, string-literal2,...) comparison operator where identifier has a String or NULL value. Country IN (UK, US, France) is true for UK and false for Peru. It is equivalent to the expression (Country = UK) OR (Country = US) OR (Country = France). Country NOT IN (UK, US, France) is false for UK and true for Peru. It is equivalent to the expression NOT ((Country = UK) OR (Country = US) OR (Country = France)).
Chapter 13. JMS messages
259
Message selectors
If the identifier of an IN or NOT IN operation is NULL, the value of the operation is unknown. v identifier [NOT] LIKE pattern-value [ESCAPE escape-character] comparison operator, where identifier has a string value. pattern-value is a string literal, where _ stands for any single character and % stands for any sequence of characters (including the empty sequence). All other characters stand for themselves. The optional escape-character is a single character string literal, whose character is used to escape the special meaning of the _ and % in pattern-value. phone LIKE 12%3 is true for 123 and 12993 and false for 1234. word LIKE l_se is true for lose and false for loose. underscored LIKE \_% ESCAPE \ is true for _foo and false for bar. phone NOT LIKE 12%3 is false for 123 and 12993 and true for 1234. If the identifier of a LIKE or NOT LIKE operation is NULL, the value of the operation is unknown. v identifier IS NULL comparison operator tests for a null header field value, or a missing property value. prop_name IS NULL. v identifier IS NOT NULL comparison operator tests for the existence of a non-null header field value or a property value. prop_name IS NOT NULL. The following message selector selects messages with a message type of car, color of blue, and weight greater than 2500 lbs:
"JMSType = car AND color = blue AND weight > 2500"
As noted above, property values can be NULL. The evaluation of selector expressions that contain NULL values is defined by SQL 92 NULL semantics. The following is a brief description of these semantics: v SQL treats a NULL value as unknown. v Comparison or arithmetic with an unknown value always yields an unknown value. v The IS NULL and IS NOT NULL operators convert an unknown value into the respective TRUE and FALSE values. Although SQL supports fixed decimal comparison and arithmetic, JMS message selectors do not. This is why exact numeric literals are restricted to those without a decimal. It is also why there are numerics with a decimal as an alternate representation for an approximate numeric value. SQL comments are not supported.
260
Using Java
MQMD Data
JMS Client
Mapping
Properties
Copying
Data
Figure 4. How messages are transformed between JMS and WebSphere MQ using the MQRFH2 header
The structures are transformed in two ways: Mapping Where the MQMD includes a field that is equivalent to the JMS field, the JMS field is mapped onto the MQMD field. Additional MQMD fields are exposed as JMS properties, because a JMS application might need to get or set these fields when communicating with a non-JMS application. Copying Where there is no MQMD equivalent, a JMS header field or property is passed, possibly transformed, as a field inside the MQRFH2.
261
262
Using Java
Variable portion The variable portion follows the fixed portion. The variable portion contains a variable number of MQRFH2 folders. Each folder contains a variable number of elements or properties. Folders group together related properties. The MQRFH2 headers created by JMS can contain up to three folders: The <mcd> folder This contains properties that describe the shape or format of the message. For example, the Msd property identifies the message as being Text, Bytes, Stream, Map, Object, or null. This folder is always present in a JMS MQRFH2. The <jms> folder This is used to transport JMS header fields, and JMSX properties that cannot be fully expressed in the MQMD. This folder is always present in a JMS MQRFH2. The <usr> folder This is used to transport any application-defined properties associated with the message. This folder is only present if the application has set some application-defined properties. Table 19 shows a full list of property names.
Table 19. MQRFH2 folders and properties used by JMS JMS field name JMSDestination JMSExpiration JMSPriority JMSDeliveryMode JMSCorrelationID JMSReplyTo JMSTimestamp JMSType JMSXGroupID JMSXGroupSeq xxx (user defined) Java type Destination long int int String Destination long String String int Any MQRFH2 folder name jms jms jms jms jms jms jms mcd jms jms usr Property name Type/values Dst Exp Pri Dlv Cid Rto Tms Type, Set, Fmt Gid Seq xxx string i8 i4 i4 string string i8 string string i4 any
263
The syntax used to express the properties in the variable portion is as follows: NameValueLength (MQLONG) Length in bytes of the NameValueData string that immediately follows this length field (it does not include its own length). The value set into NameValueLength is always a multiple of 4 (the NameValueData field is padded with space characters to achieve this). NameValueData (MQCHARn) A single character string, whose length in bytes is given by the preceding NameValueLength field. It contains a folder holding a sequence of properties. Each property is a name/type/value triplet, contained within an XML element whose name is the folder name, as follows:
<foldername> triplet1 triplet2 ..... tripletn </foldername>
The closing </foldername> tag can be followed by spaces as padding characters. Each triplet is encoded using an XML-like syntax:
<name dt=datatype>value</name>
The dt=datatype element is optional and is omitted for many properties, because the datatype is predefined. If it is included, one or more space characters must be included before the dt= tag. name is the name of the property; see Table 19 on page 263.
datatype must match, after folding, one of the literal datatype values in Table 20. value is a string representation of the value to be conveyed, using the definitions in Table 20.
264
Using Java
int
r4
r8
A string value can contain spaces. You must use the following escape sequences in a string value: & for the & character < for the < character You can use the following escape sequences, but they are not required: > for the > character ' for the character " for the " character
265
Table 23. JMS provider specific properties mapping to MQMD fields JMS provider specific property JMS_IBM_Report_Exception JMS_IBM_Report_Expiration JMS_IBM_Report_COA JMS_IBM_Report_COD JMS_IBM_Report_PAN JMS_IBM_Report_NAN JMS_IBM_Report_Pass_Msg_ID JMS_IBM_Report_Pass_Correl_ID JMS_IBM_Report_Discard_Msg JMS_IBM_MsgType JMS_IBM_Feedback JMS_IBM_Format JMS_IBM_PutApplType JMS_IBM_Encoding JMS_IBM_Character_Set JMS_IBM_PutDate JMS_IBM_PutTime JMS_IBM_Last_Msg_In_Group Java type int int int int int int int int int int int String int int String String String MQMD field Report Report Report Report Report Report Report Report Report MsgType Feedback Format PutApplType Encoding CodedCharacterSetId PutDate PutTime C type MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQLONG MQCHAR8 MQLONG MQLONG MQLONG MQCHAR8 MQCHAR8 MQLONG
boolean MsgFlags
266
Using Java
Table 26. Outgoing message JMS provider specific property mapping JMS provider specific property name JMS_IBM_Report_Exception JMS_IBM_Report_Expiration JMS_IBM_Report_COA/COD JMS_IBM_Report_NAN/PAN JMS_IBM_Report_Pass_Msg_ID JMS_IBM_Report_Pass_Correl_ID JMS_IBM_Report_Discard_Msg JMS_IBM_MsgType JMS_IBM_Feedback JMS_IBM_Format JMS_IBM_PutApplType JMS_IBM_Encoding JMS_IBM_Character_Set JMS_IBM_PutDate JMS_IBM_PutTime MQMD field used for transmission Report Report Report Report Report Report Report MsgType Feedback Format PutApplType Encoding CodedCharacterSetId PutDate PutTime Header Set by Message Object Message Object Message Object Message Object Message Object Message Object Message Object Message Object Message Object Message Object Send Method Message Object Message Object Send Method Send Method
267
268
Using Java
269
270
Using Java
271
272
Using Java
MQMD field retrieved from MsgType Feedback Format PutApplType Encoding CodedCharacterSetId PutDate PutTime MsgFlags
JMS_IBM_Last_Msg_In_Group
WebSphere MQ Message
Mapping
MQMD
Mapping Copying
Data
Message body
This section discusses the encoding of the message body itself. The encoding depends on the type of JMS message:
Chapter 13. JMS messages
273
where datatype can take one of the values described in Table 20 on page 264, and string is the default datatype, so dt=string is omitted. The character set used to encode or interpret the XML string that makes up the MapMessage body is determined following the rules that apply to a TextMessage.
274
Using Java
Every element is sent using the same tag name (elt). The default type is string, so dt=string is omitted for string elements. The character set used to encode or interpret the XML string that makes up the StreamMessage body is determined following the rules that apply to a TextMessage. The MQRFH2.format field is set as follows: MQFMT_NONE for ObjectMessage, BytesMessage, or messages with no body. MQFMT_STRING for TextMessage, StreamMessage, or MapMessage.
275
276
Using Java
ConnectionConsumer
The JMS specification enables an application server to integrate closely with a JMS implementation by using the ConnectionConsumer interface. This feature provides concurrent processing of messages. Typically, an application server creates a pool of threads, and the JMS implementation makes messages available to these threads. A JMS-aware application server can use this feature to provide high-level messaging functionality, such as message processing beans.
277
Planning an application
This section tells you how to plan an application including: v General principles for point-to-point messaging v General principles for publish/subscribe messaging on page 279 v Handling poison messages on page 280 v Removing messages from the queue on page 281
If you do not change this setting, the default is to retain such unwanted messages on the queue. It is possible that ConnectionConsumers that target the same underlying QLOCAL could be created from multiple QueueConnection objects. However, for
278
Using Java
v Your queue manager must have an enabled dead-letter queue. If a ConnectionConsumer experiences a problem when it puts a message on the dead-letter queue, message delivery from the underlying QLOCAL stops. To define a dead-letter queue, use:
ALTER QMGR DEADQ(your.dead.letter.queue.name)
v The user that runs the ConnectionConsumer must have authority to perform MQOPEN with MQOO_SAVE_ALL_CONTEXT and MQOO_PASS_ALL_CONTEXT. For details, see the WebSphere MQ documentation for your specific platform. v If unwanted messages are left on the queue, they degrade the system performance. Therefore, plan your message selectors so that between them, the ConnectionConsumers will remove all messages from the queue. For details about MQSC commands, see the WebSphere MQ Script (MQSC) Command Reference.
279
v The user that runs the ConnectionConsumer must have authority to perform MQOPEN with MQOO_SAVE_ALL_CONTEXT and MQOO_PASS_ALL_CONTEXT. For details, see the WebSphere MQ documentation for your platform. v You can optimize performance for an individual ConnectionConsumer by creating a separate, dedicated, queue for it. This is at the cost of extra resource usage.
For publish/subscribe messaging, if your system creates a dynamic queue for each subscription, these settings are obtained from the WebSphere MQ JMS model queue. To alter these settings, you can use:
ALTER QMODEL(SYSTEM.JMS.MODEL.QUEUE) BOTHRESH(threshold) BOQUEUE(your.requeue.queue.name)
280
Using Java
281
If a ConnectionConsumer cannot follow the disposition options or exception report options in the messages MQMD, its action depends on the persistence of the message. If the message is non-persistent, the message is discarded and no report message is generated. If the message is persistent, delivery of all messages from the QLOCAL stops. It is important to define a dead-letter queue, and to check it regularly to ensure that no problems occur. Particularly, ensure that the dead-letter queue does not reach its maximum depth, and that its maximum message size is large enough for all messages. When a message is requeued to the dead-letter queue, it is preceded by a WebSphere MQ dead-letter header (MQDLH). See the WebSphere MQ Application Programming Reference for details about the format of the MQDLH. You can identify messages that a ConnectionConsumer has placed on the dead-letter queue, or report messages that a ConnectionConsumer has generated, by the following fields: v PutApplType is MQAT_JAVA (0x1C) v PutApplName is MQ JMS ConnectionConsumer These fields are in the MQDLH of messages on the dead-letter queue, and the MQMD of report messages. The feedback field of the MQMD, and the Reason field of the MQDLH, contain a code describing the error. For details about these codes, see Error handling. Other fields are as described in the WebSphere MQ Application Programming Reference.
Error handling
This section covers various aspects of error handling, including Recovering from error conditions and Reason and feedback codes on page 283.
282
Using Java
MQRC_MSG_NOT_MATCHED (0x93B; 2363) Cause In point-to-point messaging, there is a message that does not match any of the selectors for the ConnectionConsumers monitoring the queue. To maintain performance, the message is requeued to the dead-letter queue. To avoid this situation, ensure that ConnectionConsumers using the queue provide a set of selectors that deal with all messages, or set the QueueConnectionFactory to retain messages. Alternatively, investigate the source of the message. MQRC_JMS_FORMAT_ERROR (0x93C; 2364) Cause Action JMS cannot interpret the message on the queue. Investigate the origin of the message. JMS usually delivers messages of an unexpected format as a BytesMessage or TextMessage. Occasionally, this fails if the message is very badly formatted.
Action
Other codes that appear in these fields are caused by a failed attempt to requeue the message to a Backout Queue. In this situation, the code describes the reason that the requeue failed. To diagnose the cause of these errors, refer to the WebSphere MQ Application Programming Reference. If the report message cannot be put on the ReplyToQ, it is put on the dead-letter queue. In this situation, the feedback field of the MQMD is filled in as described above. The reason field in the MQDLH explains why the report message could not be placed on the ReplyToQ.
283
4 6
JMS Session
5 8
ServerSessionPool
A B
SSt
JMS Session
5 8
SSa
C D E
SSu
Server sessions
B C D E
F G
Message queue
1. 2. 3. 4. 5. 6. 7.
8.
The ConnectionConsumers get message references from the queue. Each ConnectionConsumer selects specific message references. The ConnectionConsumer buffer holds the selected message references. The ConnectionConsumer requests one or more ServerSessions from the ServerSessionPool. ServerSessions are allocated from the ServerSessionPool. The ConnectionConsumer assigns message references to the ServerSessions and starts the ServerSession threads running. Each ServerSession retrieves its referenced messages from the queue. It passes them to the onMessage method from the MessageListener that is associated with the JMS Session. After it completes its processing, the ServerSession is returned to the pool.
284
Using Java
These samples enable you to use the WebSphere MQ JMS ASF in a standalone environment (that is, you do not need a suitable application server). Also, they provide examples of how to implement these interfaces and take advantage of the WebSphere MQ JMS ASF. These examples are intended to aid both WebSphere MQ JMS users, and vendors of other application servers.
MyServerSession.java
This class implements the javax.jms.ServerSession interface. It associates a thread with a JMS session. Instances of this class are pooled by a ServerSessionPool (see MyServerSessionPool.java). As a ServerSession, it must implement the following two methods: v getSession(), which returns the JMS Session associated with this ServerSession v start(), which starts this ServerSessions thread and results in the JMS Sessions run() method being invoked MyServerSession also implements the Runnable interface. Therefore, the creation of the ServerSessions thread can be based on this class, and does not need a separate class. The class uses a wait()-notify() mechanism that is based on the values of two boolean flags, ready and quit. This mechanism means that the ServerSession creates and starts its associated thread during its construction. However, it does not automatically execute the body of the run() method. The body of the run() method is executed only when the ready flag is set to true by the start() method. The ASF calls the start() method when it is necessary to deliver messages to the associated JMS session. For delivery, the run() method of the JMS session is called. The WebSphere MQ JMS ASF will have already loaded the run() method with messages. After delivery completes, the ready flag is reset to false, and the owning ServerSessionPool is notified that delivery is complete. The ServerSession then remains in a wait state until either the start() method is called again, or the close() method is invoked and ends this ServerSessions thread.
MyServerSessionPool.java
This class implements the javax.jms.ServerSessionPool interface, creating and controlling access to a pool of ServerSessions. In this implementation, the pool consists of a static array of ServerSession objects that are created during the construction of the pool. The following four parameters are passed into the constructor: v javax.jms.Connection connection The connection used to create JMS sessions. v int capacity The size of the array of MyServerSession objects.
Chapter 14. WebSphere MQ JMS Application Server Facilities
285
MessageListenerFactory.java
In this sample, a message listener factory object is associated with each ServerSessionPool instance. The MessageListenerFactory class represents a very simple interface that is used to obtain an instance of a class that implements the javax.jms.MessageListener interface. The class contains a single method:
javax.jms.MessageListener createMessageListener();
An implementation of this interface is supplied when the ServerSessionPool is constructed. This object is used to create message listeners for the individual JMS sessions that back up the ServerSessions in the pool. This architecture means that each separate implementation of the MessageListenerFactory interface must have its own ServerSessionPool. WebSphere MQ JMS includes a sample MessageListenerFactory implementation, which is discussed in CountingMessageListenerFactory.java on page 288.
286
Using Java
Load1.java
This class is a generic JMS application that loads a given queue with a number of messages, then terminates. It can either retrieve the required administered objects from a JNDI namespace, or create them explicitly, using the WebSphere MQ JMS classes that implement these interfaces. The administered objects that are required are a QueueConnectionFactory and a queue. You can use the command line options to set the number of messages with which to load the queue, and the sleep time between individual message puts. This application has two versions of the command line syntax. For use with JNDI, the syntax is:
java Load1 [-icf jndiICF] [-url jndiURL] [-qcfLookup qcfLookup] [-qLookup qLookup] [-sleep sleepTime] [-msgs numMsgs]
287
qMgrName Name of queue manager to connect to qName sleepTime numMsgs Name of queue to load Time (in milliseconds) to pause between message puts Number of messages to put
If there are any errors, an error message is displayed and the application terminates. You can use this application to simulate message load on a WebSphere MQ queue. In turn, this message load can trigger the ASF-enabled applications described in the following sections. The messages put to the queue are simple JMS TextMessage objects. These objects do not contain user-defined message properties, which could be useful to make use of different message listeners. The source code is supplied so that you can modify this load application if necessary.
CountingMessageListenerFactory.java
This file contains definitions for two classes: v CountingMessageListener v CountingMessageListenerFactory CountingMessageListener is a very simple implementation of the javax.jms.MessageListener interface. It keeps a record of the number of times its onMessage method has been invoked, but does nothing with the messages it is passed. CountingMessageListenerFactory is the factory class for CountingMessageListener. It is an implementation of the MessageListenerFactory interface described in MessageListenerFactory.java on page 286. This factory keeps a record of all the message listeners that it produces. It also includes a method, printStats(), which displays usage statistics for each of these listeners.
288
Using Java
ASFClient1.java
This application acts as a client of the WebSphere MQ JMS ASF. It sets up a single ConnectionConsumer to consume the messages in a single WebSphere MQ queue. It displays throughput statistics for each message listener that is used, and terminates after one minute. The application can either retrieve the required administered objects from a JNDI namespace, or create them explicitly, using the WebSphere MQ JMS classes that implement these interfaces. The administered objects that are required are a QueueConnectionFactory and a queue. This application has two versions of the command line syntax: For use with JNDI, the syntax is:
java ASFClient1 [-icf jndiICF] [-url jndiURL] [-qcfLookup qcfLookup] [-qLookup qLookup] [-poolSize poolSize] [-batchSize batchSize]
qMgrName Name of queue manager to connect to qName poolSize Name of queue to consume from The number of ServerSessions created in the ServerSessionPool being used The maximum number of message that can be assigned to a ServerSession at a time
batchSize
10
The application obtains a QueueConnection from the QueueConnectionFactory. A ServerSessionPool, in the form of a MyServerSessionPool, is constructed using: v The QueueConnection that was created previously v The required poolSize v An acknowledge mode, AUTO_ACKNOWLEDGE v An instance of a CountingMessageListenerFactory, as described in CountingMessageListenerFactory.java on page 288
289
Load2.java
This class is a JMS application that loads a given queue with a number of messages, then terminates, in a similar way to Load1.java. The command line syntax is also similar to that for Load1.java (substitute Load2 for Load1 in the syntax). For details, see Load1.java on page 287. The difference is that each message contains a user property called value, which takes a randomly selected integer value between 0 and 100. This property means that you can apply message selectors to the messages. Consequently, the messages can be shared between the two consumers that are created in the client application described in ASFClient2.java.
LoggingMessageListenerFactory.java
This file contains definitions for two classes: v LoggingMessageListener v LoggingMessageListenerFactory LoggingMessageListener is an implementation of the javax.jms.MessageListener interface. It takes the messages that are passed to it and writes an entry to the log file. The default log file is ./ASFClient2.log. You can inspect this file and check the messages that are sent to the connection consumer that is using this message listener. LoggingMessageListenerFactory is the factory class for LoggingMessageListener. It is an implementation of the MessageListenerFactory interface described in MessageListenerFactory.java on page 286.
ASFClient2.java
ASFClient2.java is a slightly more complicated client application than ASFClient1.java. It creates two ConnectionConsumers that feed off the same queue, but that apply different message selectors. The application uses a CountingMessageListenerFactory for one consumer, and a LoggingMessageListenerFactory for the other. Use of two different message listener factories means that each consumer must have its own server session pool. The application displays statistics that relate to one ConnectionConsumer on screen, and writes statistics that relate to the other ConnectionConsumer to a log file.
290
Using Java
TopicLoad.java
This class is a JMS application that is a publish/subscribe version of the Load2 queue loader described in Load2.java on page 290. It publishes the required number of messages under the given topic, then terminates. Each message contains a user property called value, which takes a randomly selected integer value between 0 and 100. To use this application, ensure that the broker is running and that the required setup is complete. For details, see Additional setup for publish/subscribe mode on page 26. This application has two versions of the command line syntax. For use with JNDI, the syntax is:
java TopicLoad [-icf jndiICF] [-url jndiURL] [-tcfLookup tcfLookup] [-tLookup tLookup] [-sleep sleepTime] [-msgs numMsgs]
291
qMgrName Name of queue manager to connect to, and broker queue manager to publish messages to tName sleepTime numMsgs Name of topic to publish to Time (in milliseconds) to pause between message puts Number of messages to put
If there are any errors, an error message is displayed and the application terminates.
ASFClient3.java
ASFClient3.java is a client application that is a publish/subscribe version of ASFClient1.java on page 289. It sets up a single ConnectionConsumer to consume the messages published on a single Topic. It displays throughput statistics for each message listener that is used, and terminates after one minute. This application has two versions of the command line syntax. For use with JNDI, the syntax is:
java ASFClient3 [-icf jndiICF] [-url jndiURL] [-tcfLookup tcfLookup] [-tLookup tLookup] [-poolsize poolSize] [-batchsize batchSize]
qMgrName Name of queue manager to connect to, and broker queue manager to publish messages to tName poolSize Name of topic to consume from The number of ServerSessions created in the ServerSessionPool being used
MQJMS/ASF/TopicLoad 5
292
Using Java
Like ASFClient1, the client application displays throughput statistics for each message listener that is used, displaying statistics every 10 seconds. After one minute, the connection is closed, the server session pool is stopped, and the application terminates.
ASFClient4.java
ASFClient4.java is a more complex publish/subscribe client application. It creates three ConnectionConsumers that all feed off the same topic, but each one applies different message selectors. The first two consumers use high and normal message selectors, in the same way as described for the application ASFClient2.java on page 290. The third consumer does not use any message selector. The application uses two CountingMessageListenerFactories for the two selector-based consumers, and a LoggingMessageListenerFactory for the third consumer. Because the application uses different message listener factories, each consumer must have its own server session pool. The application displays statistics that relate to the two selector-based consumers on screen. It writes statistics that relate to the third ConnectionConsumer to a log file. The command line syntax is similar to that for ASFClient3.java on page 292 (substitute ASFClient4 for ASFClient3 in the syntax). Each of the three server session pools contains the number of ServerSessions set by the poolSize parameter. When the client application runs, statistics that relate to the normalConnectionConsumer and the highConnectionConsumer, and their associated CountingMessageListenerFactories, are printed to screen every 10 seconds. Statistics that relate to the third ConnectionConsumer, and its associated LoggingMessageListenerFactories, are written to the log file. You can inspect the screen and the log file to see the real destination of the messages. Add the totals for each of the CountingMessageListeners and inspect the number of log file entries. The distribution of messages is different from the distribution obtained by a point-to-point version of the same application (ASFClient2.java). This is because, in the publish/subscribe domain, each consumer of a topic obtains its own copy of each message published on that topic. In this application, for a given topic load, the high and normal consumers receive approximately 25% and 75% of the load, respectively. The third consumer still receives 100% of the load. Therefore, the total number of messages received is greater than 100% of the load originally published on the topic.
293
ASFClient5.java
This sample exercises the durable publish/subscribe ConnectionConsumer functionality in WebSphere MQ JMS. You invoke it with the same command-line options as the ASFClient4 sample, and, as with the other samples, the TopicLoad sample application can be used to trigger the consumer that is created. For details of TopicLoad, see TopicLoad.java on page 291. When invoked, ASFClient5 displays a menu of three options:
1. Create/reactivate a durable ConnectionConsumer 2. Unsubscribe a durable ConnectionConsumer X. Exit
If you choose option 1, and this is the first time this sample has been run, a new durable ConnectionConsumer is created using the given name. It then displays one minutes worth of throughput statistics, rather like the other samples, before closing the connection and terminating. Having created a durable consumer, messages published on the topic in question continues to arrive at the consumers destination even though the consumer is inactive. This can be confirmed by running ASFClient5 again, and selecting option 1. This reactivates the named durable consumer, and the statistics displayed show that any relevant messages published during the period of inactivity were subsequently delivered to the consumer. If you run ASFClient5 again and select option 2, this unsubscribes the named durable ConnectionConsumer and discards any outstanding messages delivered to it. Do this to ensure that the broker does not continue to deliver unwanted messages.
294
Using Java
| | | |
ConnectionMetaData DeliveryMode Destination ExceptionListener* MapMessage Message
| |
295
javax.jms
Table 34. Summary of interfaces in package javax.jms (continued) Interface QueueConnectionFactory QueueReceiver QueueSender QueueSession ServerSession ** ServerSessionPool ** Description Used by a client to create QueueConnections with a JMS point-to-point provider. Used by a client to receive messages that have been delivered to a queue. Used by a client to send messages to a queue. Provides methods to create QueueReceivers, QueueSenders, QueueBrowsers and TemporaryQueues. An object implemented by an application server. An object implemented by an application server to provide a pool of ServerSessions for processing the messages of a ConnectionConsumer. A single-threaded context for producing and consuming messages. Used to send a stream of Java primitives. A unique queue object created for the duration of a QueueConnection. A unique Topic object created for the duration of a TopicConnection. Used to send a message containing a java.lang.String. A provider-specific topic name. An active connection to a JMS Publish/Subscribe provider. Used by a client to create TopicConnections with a JMS Publish/Subscribe provider. Used by a client to publish messages on a topic. Provides methods to create TopicPublishers, TopicSubscribers and TemporaryTopics. Used by a client to receive messages that have been published to a topic. Extends the capability of Connection by providing an XASession. Used by some application servers to provide support for grouping Java Transaction Service (JTS)-capable resource use into a distributed transaction. Provides the same create options as QueueConnection. Provides the same create options as a QueueConnectionFactory. Provides a regular QueueSession that can be used to create QueueReceivers, QueueSenders and QueueBrowsers. Extends the capability of Session by adding access to a JMS providers support for the Java Transaction API (JTA). Provides the same create options as TopicConnection. Provides the same create options as TopicConnectionFactory.
Session StreamMessage TemporaryQueue TemporaryTopic TextMessage Topic TopicConnection TopicConnectionFactory TopicPublisher TopicSession TopicSubscriber XAConnection XAConnectionFactory
XASession
XATopicConnection XATopicConnectionFactory
296
Using Java
javax.jms
Table 34. Summary of interfaces in package javax.jms (continued) Interface XATopicSession Description Provides a regular TopicSession which can be used to create TopicSubscribers and TopicPublishers.
Table 35. Summary of classes in package javax.jms Class QueueRequestor TopicRequestor Description A helper class to simplify making service requests. A helper class to simplify making service requests.
297
Cleanup Connection ConnectionConsumer ConnectionFactory ConnectionMetaData Destination MessageConsumer MessageProducer Queue QueueBrowser QueueConnection QueueConnectionFactory MQConnection MQConnectionConsumer MQConnectionFactory MQConnectionMetaData MQDestination MQMessageConsumer MQMessageProducer MQQueue MQQueueBrowser MQQueueConnection MQQueueConnectionFactory MQQueueEnumeration QueueReceiver QueueSender QueueSession Session TemporaryQueue TemporaryTopic Topic TopicConnection TopicConnectionFactory TopicPublisher TopicSession TopicSubscriber XAConnection XAConnectionFactory XAQueueConnection MQQueueReceiver MQQueueSender MQQueueSession MQSession MQTemporaryQueue MQTemporaryTopic MQTopic MQTopicConnection MQTopicConnectionFactory MQTopicPublisher MQTopicSession MQTopicSubscriber MQXAConnection MQXAConnectionFactory MQXAQueueConnection Y Y Y Y Y Y Y Y Y Y Y
298
Using Java
Table 37. Summary of classes in package com.ibm.jms JMS interface Client or bindings implementation Direct connection to WebSphere MQ Event Broker implementation Y Y Y Y Y Y
Y Y Y Y Y Y
A sample implementation of the following JMS interfaces is supplied in the WebSphere MQ classes for Java Message Service. v ServerSession v ServerSessionPool See Application server sample code on page 283 for more information
299
BytesMessage
BytesMessage
public interface BytesMessage extends Message WebSphere MQ class: JMSBytesMessage
java.lang.Object | +----com.ibm.jms.JMSMessage | +----com.ibm.jms.JMSBytesMessage
Use a BytesMessage to send a message containing a stream of uninterpreted bytes. It inherits Message and adds a bytes message body. The receiver of the message supplies the interpretation of the bytes. Note: This message type is for client encoding of existing message formats. If possible, use one of the other self-defining message types instead. See also: MapMessage, Message, ObjectMessage, StreamMessage, and TextMessage
Methods
| | | | | | | | | | | | | getBodyLength (JMS 1.1 only)
public long getBodyLength() throws JMSException
Get the number of bytes in the message body when the message is in read-only mode. The value returned can be used to allocate a byte array. The value is the entire length of the message body regardless of where the pointer for reading the message is currently located. Returns: The number of bytes in the message Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageNotReadableException if the message is in write-only mode. readBoolean
public boolean readBoolean() throws JMSException
Read a boolean from the bytes message. Returns: The boolean value read. Throws: v MessageNotReadableException if the message is in write-only mode. v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if it is the end of the message bytes.
300
Using Java
BytesMessage
readByte
public byte readByte() throws JMSException
Read a signed 8-bit value from the bytes message. Returns: The next byte from the bytes message as a signed 8-bit byte. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readBytes
public int readBytes(byte[] value) throws JMSException
Read a byte array from the bytes message. If there are sufficient bytes remaining in the stream, the entire buffer is filled; if not, the buffer is partially filled. Parameters: value: the buffer into which the data is read. Returns: The total number of bytes read into the buffer, or -1 if there is no more data because the end of the bytes has been reached. Throws: v MessageNotReadableException if the message is in write-only mode. v JMSException if JMS fails to read the message because of an internal JMS error. readBytes
public int readBytes(byte[] value, int length) throws JMSException
Read a portion of the bytes message. Parameters: v value: the buffer into which the data is read. v length: the number of bytes to read. Returns: The total number of bytes read into the buffer, or -1 if there is no more data because the end of the bytes has been reached. Throws: v MessageNotReadableException if the message is in write-only mode. v IndexOutOfBoundsException if length is negative, or is less than the length of the array value v JMSException if JMS fails to read the message because of an internal JMS error.
301
BytesMessage
readChar
public char readChar() throws JMSException
Read a Unicode character value from the bytes message. Returns: The next two bytes from the bytes message as a Unicode character. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readDouble
public double readDouble() throws JMSException
Read a double from the bytes message. Returns: The next eight bytes from the bytes message, interpreted as a double. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readFloat
public float readFloat() throws JMSException
Read a float from the bytes message. Returns: The next four bytes from the bytes message, interpreted as a float. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readInt
public int readInt() throws JMSException
Read a signed 32-bit integer from the bytes message. Returns: The next four bytes from the bytes message, interpreted as an int. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes.
302
Using Java
BytesMessage
v JMSException if JMS fails to read the message because of an internal JMS error. readLong
public long readLong() throws JMSException
Read a signed 64-bit integer from the bytes message. Returns: The next eight bytes from the bytes message, interpreted as a long. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readShort
public short readShort() throws JMSException
Read a signed 16-bit number from the bytes message. Returns: The next two bytes from the bytes message, interpreted as a signed 16-bit number. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readUnsignedByte
public int readUnsignedByte() throws JMSException
Read an unsigned 8-bit number from the bytes message. Returns: The next byte from the bytes message, interpreted as an unsigned 8-bit number. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error.
303
BytesMessage
readUnsignedShort
public int readUnsignedShort() throws JMSException
Read an unsigned 16-bit number from the bytes message. Returns: The next two bytes from the bytes message, interpreted as an unsigned 16-bit integer. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. readUTF
public java.lang.String readUTF() throws JMSException
Read a string that has been encoded using a modified UTF-8 format from the bytes message. The first two bytes are interpreted as a 2-byte length field. Returns: A Unicode string from the bytes message. Throws: v MessageNotReadableException if the message is in write-only mode. v MessageEOFException if it is the end of the message bytes. v JMSException if JMS fails to read the message because of an internal JMS error. reset
public void reset() throws JMSException
Put the message body in read-only mode, and reposition the stream of bytes to the beginning. Throws: v JMSException if JMS fails to reset the message because of an internal JMS error. v MessageFormatException if message has an incorrect format writeBoolean
public void writeBoolean(boolean value) throws JMSException
Write a boolean to the bytes message as a 1-byte value. The value true is written out as the value (byte)1; the value false is written out as the value (byte)0. Parameters: value: the boolean value to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error.
304
Using Java
BytesMessage
writeByte
public void writeByte(byte value) throws JMSException
Write a byte to the bytes message as a 1-byte value. Parameters: value: the byte value to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeBytes
public void writeBytes(byte[] value) throws JMSException
Write a byte array to the bytes message. Parameters: value: the byte array to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeBytes |
public void writeBytes(byte[] value, int offset, int length) throws JMSException
Write a portion of a byte array to the bytes message. Parameters: v value: the byte array value to be written. v offset: the initial offset within the byte array. v length: the number of bytes to use. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeChar
public void writeChar(char value) throws JMSException
Write a char to the bytes message as a 2-byte value, high byte first. Parameters: value: the char value to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error.
305
BytesMessage
writeDouble
public void writeDouble(double value) throws JMSException
Convert the double argument to a long using doubleToLongBits method in class Double, and then write that long value to the bytes message as an 8-byte quantity. Parameters: value: the double value to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeFloat
public void writeFloat(float value) throws JMSException
Convert the float argument to an int using floatToIntBits method in class Float, and then write that int value to the bytes message as a 4-byte quantity. Parameters: value: the float value to be written. Throws: v MessageNotWriteableException - if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeInt
public void writeInt(int value) throws JMSException
Write an int to the bytes message as four bytes. Parameters: value: the int to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeLong
public void writeLong(long value) throws JMSException
Write a long to the bytes message as eight bytes, Parameters: value: the long to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error.
306
Using Java
BytesMessage
writeObject
public void writeObject(java.lang.Object value) throws JMSException
Write a Java object to the bytes message. Note: This method works only for the primitive object types (such as Integer, Double, and Long), Strings, and byte arrays. Parameters: value: the Java object to be written. Throws: v MessageNotWriteableException if message in read-only mode. v MessageFormatException if object is not a valid type. v JMSException if JMS fails to write the message because of an internal JMS error. writeShort
public void writeShort(short value) throws JMSException
Write a short to the bytes message as two bytes. Parameters: value: the short to be written. Throws: v MessageNotWriteableException - if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error. writeUTF
public void writeUTF(java.lang.String value) throws JMSException
Write a string to the bytes message using UTF-8 encoding in a machine-independent manner. The UTF-8 string written to the buffer starts with a 2-byte length field. Parameters: value: the String value to be written. Throws: v MessageNotWriteableException if message in read-only mode. v JMSException if JMS fails to write the message because of an internal JMS error.
307
Cleanup
Cleanup *
public class Cleanup implements Runnable WebSphere MQ class: Cleanup Cleanup contains utilities for dealing with broken non-durable subscriptions using the SUBSTATE(BROKER) option. It is not applicable if you use a direct connection to WebSphere MQ Event Broker. See also: ConnectionFactory.
WebSphere MQ constructor
Cleanup
public Cleanup()
Methods
cleanup
public void cleanup() throws JMSException
For client only, get the channel that was used. getCleanupInterval
public long getCleanupInterval()
308
Using Java
Cleanup
getCleanupLevel
public int getCleanupLevel()
Get the initialization string that was passed to the receive exit class. getSecurityExit
public String getSecurityExit()
309
Cleanup
getSendExitInit
public String getSendExitInit()
| | run
Invoke the utility from a command line. For details of the invocation options and parameters, see Manual cleanup on page 232. For information specific to JMS 1.1, see Manual cleanup on page 250.
public void run()
Run this utility in the background at intervals, as determined by the cleanupLevel and cleanupInterval properties. setCCSID
public void setCCSID(int x) throws JMSException
Set the character set to be used when connecting to the queue manager. See Table 13 on page 127 for a list of allowed values. We recommend that you use the default value (819) for most situations. setChannel
public void setChannel(String x) throws JMSException
Set the cleanupInterval. Parameters: v interval: length of time in milliseconds between runs of the cleanup utility Throws: JMSException if interval is less than 0
310
Using Java
Cleanup
setCleanupLevel
public void setCleanupLevel(int level) throws JMSException
Set the cleanup level to use. It can be one of JMSC.MQJMS_CLEANUP_NONE JMSC.MQJMS_CLEANUP_SAFE JMSC.MQJMS_CLEANUP_STRONG JMSC.MQJMS_CLEANUP_FORCE JMSC.MQJMS_CLEANUP_NONDUR setExceptionListener
public void setExceptionListener(ExceptionListener el)
Set the ExceptionListener. If set, the ExceptionListener receives any exceptions caused during the run() method. Shortly after issuing the exception to the ExceptionListener, Cleanup terminates. setHostName
public void setHostName(String hostname)
For client connections, the name of the host to connect to. setPort
public void setPort(int port) throws JMSException
Set the port for a client connection. Parameters: port: the new value to use. Throws: JMSException if the port is negative. setQueueManager
public void setQueueManager(String x) throws JMSException
Initialization string that is passed to the constructor of the receive exit class.
311
Cleanup
setSecurityExit
public void setSecurityExit(String securityExit)
Set the transport type to use. It can be one of the following: JMSC.MQJMS_TP_BINDINGS_MQ JMSC.MQJMS_TP_CLIENT_MQ_TCPIP stop
public void stop()
Stop any currently running cleanup thread. Return when cleanup has finished. Do nothing if cleanup is not running.
312
Using Java
Connection
Connection
| public interface Connection Subinterfaces: QueueConnection, TopicConnection, XAConnection, XAQueueConnection, and XATopicConnection WebSphere MQ class: MQConnection
java.lang.Object | +----com.ibm.mq.jms.MQConnection
A JMS Connection is a clients active connection to its JMS provider. | See also: ConnectionFactory, QueueConnection, and TopicConnection
Methods
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a Connection, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. There is no need to close the sessions, producers, and consumers of a closed connection. Closing a connection causes any of its sessions in-process transactions to be rolled back. If a sessions work is coordinated by an external transaction manager, when using XASession, a sessions commit and rollback methods are not used and the result of a closed sessions work is determined later by a transaction manager. Closing a connection does not force an acknowledgement of client acknowledged sessions. WebSphere MQ JMS keeps a pool of WebSphere MQ hConns available for use by sessions. Under some circumstances, Connection.close() clears this pool. If an application uses multiple connections sequentially, you can force the pool to remain active between JMS connections. To do this, register an MQPoolToken with com.ibm.mq.MQEnvironment for the lifetime of your JMS application. For details, see Connection pooling on page 80 and MQEnvironment on page 110. Throws: JMSException if the JMS implementation fails to close the connection because of an internal error. Examples are a failure to release resources or to close a socket connection.
313
Connection
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | createConnectionConsumer (JMS 1.1 only)
public ConnectionConsumer createConnectionConsumer (Destination destination, java.lang.String messageSelector, ServerSessionPool sessionPool, int maxMessages) throws JMSException
Create a connection consumer for this connection. This is an expert facility that is not used by regular JMS clients. Parameters: v destination: the destination to access. v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. v sessionPool: the server session pool to associate with this connection consumer. v maxMessages: the maximum number of messages that can be assigned to a server session at one time. Returns: The connection consumer. Throws: v JMSException if the connection fails to create a connection consumer because of an internal JMS error, or because of incorrect arguments for sessionPool and messageSelector. v InvalidDestinationException if the destination is not valid. v InvalidSelectorException if the message selector is not valid. See also: ConnectionConsumer createDurableConnectionConsumer (JMS 1.1 only)
public ConnectionConsumer createDurableConnectionConsumer (Topic topic, java.lang.String subscriptionName, java.lang.String messageSelector, ServerSessionPool sessionPool, int maxMessages) throws JMSException
Create a durable connection consumer for this connection. This is an expert facility that is not used by regular JMS clients.
Note For a direct connection to WebSphere MQ Event Broker, WebSphere Business Integration Event Broker, or WebSphere Business Integration Message Broker, this method throws a JMSException. Parameters: v topic: the topic to access. v subscriptionName: the name of the durable subscription.
314
Using Java
Connection
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. v sessionPool: the server session pool to associate with this durable connection consumer. v maxMessages: the maximum number of messages that can be assigned to a server session at one time. Returns: The durable connection consumer. Throws: v JMSException if the connection fails to create a connection consumer because of an internal JMS error, or because of incorrect arguments for sessionPool and messageSelector. v InvalidDestinationException if the destination is not valid. v InvalidSelectorException if the message selector is not valid. See also: ConnectionConsumer createSession (JMS 1.1 only)
public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a session. Parameters: v transacted: if true, the session is transacted. v acknowledgeMode: indicates whether the consumer or the client acknowledges any messages it receives. Possible values are: Session.AUTO_ACKNOWLEDGE Session.CLIENT_ACKNOWLEDGE Session.DUPS_OK_ACKNOWLEDGE This parameter is ignored if the session is transacted. Returns: A newly created session. Throws: JMSException if the connection fails to create a session because of an internal JMS error, or because of lack of support for the specific transaction and acknowledgement mode. See also: Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE, Session.DUPS_OK_ACKNOWLEDGE
315
Connection
getClientID
public java.lang.String getClientID() throws JMSException
Get the client identifier for this connection. The client identifier can either be preconfigured by the administrator in a ConnectionFactory, or assigned by calling setClientId. Returns: The unique client identifier. Throws: JMSException if the JMS implementation fails to return the client ID for this connection because of an internal error. getExceptionListener
public ExceptionListener getExceptionListener() throws JMSException
Get the ExceptionListener for this connection. Returns: The ExceptionListener for this connection Throws: JMSException general exception if the JMS implementation fails to get the exception listener for this connection. getMetaData
public ConnectionMetaData getMetaData() throws JMSException
Get the metadata for this connection. Returns: The connection metadata. Throws: JMSException general exception if the JMS implementation fails to get the connection metadata for this connection. See also: ConnectionMetaData on page 335 setClientID
public void setClientID(java.lang.String clientID) throws JMSException
Set the client identifier for this connection. Note: The client identifier is ignored for point-to-point connections.
WebSphere MQ Event Broker note This method always throws an IllegalStateException when you make a direct connection to WebSphere MQ Event Broker. Parameters: clientID: the unique client identifier. Throws:
316
Using Java
Connection
v JMSException if the JMS implementation fails to set the client ID for this Connection because of an internal error. v InvalidClientIDException if the JMS client specifies a non valid or duplicate client ID. v IllegalStateException if attempting to set a connections client identifier at the wrong time, or if it has been configured administratively. setExceptionListener
public void setExceptionListener(ExceptionListener listener) throws JMSException
Set an exception listener for this connection. Parameters: handler: the exception listener. Throws: JMSException general exception if the JMS implementation fails to set the exception listener for this connection. start
public void start() throws JMSException
Start (or restart) a connections delivery of incoming messages. Starting a started session is ignored. Use the stop method to stop delivery. Throws: JMSException if the JMS implementation fails to start the message delivery because of an internal error. stop
public void stop() throws JMSException
Used to stop a connections delivery of incoming messages temporarily. It can be restarted using its start method. When stopped, delivery to all the connections message consumers is inhibited. Synchronous receives are blocked, and messages are not delivered to message listeners. Stopping a session has no affect on its ability to send messages. Stopping a stopped session is ignored. Throws: JMSException if the JMS implementation fails to stop the message delivery because of an internal error.
317
ConnectionConsumer
ConnectionConsumer
public interface ConnectionConsumer WebSphere MQ class: MQConnectionConsumer
java.lang.Object | +----com.ibm.mq.jms.MQConnectionConsumer
For application servers, Connections provide a special facility to create a ConnectionConsumer. A Destination and a Property Selector specify the messages that it is to consume. Also, a ConnectionConsumer must be given a ServerSessionPool to use to process its messages. See also: QueueConnection, and TopicConnection.
Methods
close()
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a ConnectionConsumer, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Throws: JMSException if a JMS implementation fails to release resources on behalf of ConnectionConsumer, or if it fails to close the connection consumer. getServerSessionPool()
public ServerSessionPool getServerSessionPool() throws JMSException
Get the server session associated with this connection consumer. Returns: The server session pool used by this connection consumer. Throws: JMSException if a JMS implementation fails to get the server session pool associated with this connection consumer because of an internal error.
318
Using Java
ConnectionFactory
ConnectionFactory
public interface ConnectionFactory Subinterfaces: QueueConnectionFactory, TopicConnectionFactory, XAQueueConnectionFactory, and XATopicConnectionFactory WebSphere MQ class: MQConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQConnectionFactory
A ConnectionFactory encapsulates a set of connection configuration parameters that has been defined by an administrator. A client uses it to create a Connection with a JMS provider.
Note For direct connections to WebSphere MQ Event Broker, WebSphere Business Integration Event Broker, or WebSphere Business Integration Message Broker, properties accessed by methods marked with a are ignored. | See also: Connection, QueueConnectionFactory, and TopicConnectionFactory
WebSphere MQ constructor
MQConnectionFactory
public MQConnectionFactory()
Methods
| | | | | | | | | | | | createConnection (JMS 1.1 only)
public Connection createConnection() throws JMSException
Create a connection with the default user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Returns: A newly created connection. Throws: v JMSException if JMS fails to create the connection because of an internal JMS error. v JMSSecurityException if client authentication fails because the user name or password is not valid.
319
ConnectionFactory
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | createConnection (JMS 1.1 only)
public Connection createConnection(java.lang.String userName, java.lang.String password) throws JMSException
Create a connection with the specified user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Parameters: v userName: the user name of the caller. v password: the password of the caller. Returns: A newly created connection. Throws: v JMSException if JMS fails to create the connection because of an internal JMS error. v JMSSecurityException if client authentication fails because the user name or password is not valid. getBrokerCCSubQueue *
public String getBrokerCCSubQueue()
Get method for brokerCCSubQueue attribute. Returns: The name of the nondurable subscription queue to use for a connection consumer. getBrokerControlQueue *
public String getBrokerControlQueue()
Get method for brokerControlQueue attribute. Returns: The brokers control queue name getBrokerPubQueue *
public String getBrokerPubQueue()
Get method for brokerPubQueue attribute. Returns: The brokers publish queue name. getBrokerQueueManager *
public String getBrokerQueueManager()
Get method for brokerQueueManager attribute. Returns: The brokers queue manager name.
320
Using Java
ConnectionFactory
| | | | | | | | | | getBrokerSubQueue *
public String getBrokerSubQueue()
Get method for brokerSubQueue attribute. Returns: The name of the nondurable subscription queue to use. getBrokerVersion *
public int getBrokerVersion()
Get method for brokerVersion attribute. Returns: The brokers version number getCCSID *
public int getCCSID()
For client only, get the channel that was used. | | | | | | | | | | getCleanupInterval *
public long getCleanupInterval()
Get method for cleanupInterval attribute. Returns: How often the cleanup utility runs, in milliseconds getCleanupLevel *
public int getCleanupLevel()
Get method for cleanupLevel attribute. Returns: The value of cleanupLevel getClientId *
public String getClientId()
Get the client identifier that is used for all connections that are created using this ConnectionFactory. getDescription *
public String getDescription()
321
ConnectionFactory
| | | | | | | getDirectAuth *
public int getDirectAuth()
Get method for the direct authentication attribute. Returns: The value of the direct authentication attribute See also: setDirectAuth() getFailIfQuiesce *
public int getFailIfQuiesce()
Get the default behavior of applications accessing a quiescing queue manager when using destinations created using this ConnectionFactory object. getHostName *
public String getHostName()
Get method for messageRetention attribute. Returns: v JMSC.MQJMS_MRET_YES: unwanted messages remain on the input queue. v JMSC.MQJMS_MRET_NO: unwanted messages are dealt with according to their disposition options. getMessageSelection *
public int getMessageSelection()
Get method for the message selection attribute. Returns: The value of the message selection attribute See also: setMessageSelection()
322
Using Java
ConnectionFactory
getMsgBatchSize *
public int getMsgBatchSize()
Get method for the multicast attribute. Returns: An integer representing the current multicast setting. See also: setMulticast() getPollingInterval *
public int getPollingInterval()
For client connections or direct TCP/IP connection to WebSphere MQ Event Broker, get the port number. | | | | | | | | | | | | | | | | | getProxyHostName *
public String getProxyHostName()
Get method for the proxy host name attribute. Returns: The host name of the proxy server when establishing a direct connection, or null if no proxy server is used. getProxyPort *
public int getProxyPort()
Get method for the proxy port attribute. Returns: The port number to connect to on the proxy server. getPubAckInterval *
public int getPubAckInterval()
Get method for pubAckInterval attribute. Returns: The interval, in number of messages, between publish requests that require acknowledgement from the broker.
323
ConnectionFactory
getQueueManager *
public String getQueueManager()
Get the initialization string that was passed to the receive exit class. | | | | | | | getReference *
public Reference getReference() throws NamingException
Return a reference for this connection factory. Returns: A reference for this object. Throws: NamingException. getSecurityExit *
public String getSecurityExit()
Get method for the sparse subscriptions attribute. Returns: The value of the sparse subscriptions attribute See also: setSparseSubscriptions()
324
Using Java
ConnectionFactory
getSSLCertStores *
public java.util.Collection getSSLCertStores()
Return a collection of CertStore objects. If setSSLCertStores() was used to set a collection of CertStore objects, the value returned from getSSLCertStores() is a copy of the original collection. If setSSLCertStores() was used to set a string detailing a list of LDAP URIs, this method returns a collection of CertStore objects representing the LDAP CRLs. getSSLCertStoresAsString *
public String getSSLCertStoresAsString() throws JMSException
Return the string of LDAP URIs, set with setSSLCertStores. Throws JMSException if a collection of CertStores was set. getSSLCipherSuite *
public String getSSLCipherSuite()
Return the distinguished name pattern used to validate the queue manager. getSSLSocketFactory *
public javax.net.ssl.SSLSocketFactory getSSLSocketFactory()
Get method for statusRefreshInterval attribute. Returns: The number of milliseconds between transactions to refresh publish/subscribe status. getSubscriptionStore *
public int getSubscriptionStore()
Get method for the SUBSTORE property. Returns: An integer representing the current SUBSTORE property.
325
ConnectionFactory
getSyncpointAllGets *
public boolean getSyncpointAllGets()
getTempQPrefix *
public String getTempQPrefix()
Get the prefix that is used to form the name of a WebSphere MQ dynamic queue. Returns: The prefix that is used to form the name of a WebSphere MQ dynamic queue. getTransportType *
public int getTransportType()
Set method for brokerCCSubQueue attribute. Parameters: brokerSubQueue: the name of the nondurable subscription queue to use for a connection consumer. setBrokerControlQueue *
public void setBrokerControlQueue(String x) throws JMSException
Set method for brokerControlQueue attribute. Parameters: brokerControlQueue: the name of the broker control queue. setBrokerPubQueue *
public void setBrokerPubQueue(String x) throws JMSException
Set method for brokerPubQueue attribute. Parameters: brokerPubQueue: the name of the broker publish queue.
326
Using Java
ConnectionFactory
| | | | | | | | | | | | | | | | | | | setBrokerQueueManager *
public void setBrokerQueueManager(String x) throws JMSException
Set method for brokerQueueManager attribute. Parameters: brokerQueueManager: the name of the brokers queue manager. setBrokerSubQueue *
public void setBrokerSubQueue(String x) throws JMSException
Set method for brokerSubQueue attribute. Parameters: brokerSubQueue: the name of the nondurable subscription queue to use. setBrokerVersion *
public void setBrokerVersion(int x) throws JMSException
Set method for brokerVersion attribute. Parameters: An integer representing one of the valid broker version number values. These are represented by the constants: JMSC.MQJMS_BROKER_V1 JMSC.MQJMS_BROKER_V2 setCCSID *
public void setCCSID(int x) throws JMSException
Set the character set to be used when connecting to the queue manager. See Table 13 on page 127 for a list of allowed values. We recommend that you use the default value (819) for most situations. setChannel *
public void setChannel(String x) throws JMSException
Set method for cleanupInterval attribute. Parameters: How often the cleanup utility runs, in milliseconds setCleanupLevel *
public void setCleanupLevel(int x) throws JMSException
Set method for cleanupLevel attribute. Parameters: An integer representing one of the valid cleanup levels. These are represented by the constants: JMSC.MQJMS_CLEANUP_NONE JMSC.MQJMS_CLEANUP_SAFE JMSC.MQJMS_CLEANUP_STRONG JMSC.MQJMS_CLEANUP_AS_PROPERTY
Chapter 15. JMS interfaces and classes
327
ConnectionFactory
setClientId *
public void setClientId(String x)
Set the client Identifier to be used for all connections created using this connection.
WebSphere MQ Event Broker note This method always throws an IllegalStateException when you make a direct connection to WebSphere MQ Event Broker. setDescription *
public void setDescription(String x)
Set method for the direct authentication attribute. Parameters: x: an integer specifying the type of direct authentication that is required. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_DIRECTAUTH_BASIC JMSC.MQJMS_DIRECTAUTH_CERTIFICATE setFailIfQuiesce *
public void setFailIfQuiesce(int fiqValue) throws JMSException
Set the default behavior of applications accessing a quiescing queue manager when using destinations created using this ConnectionFactory object. Takes values of: v JMSC.MQJMS_FIQ_YES (default) v JMSC.MQJMS_FIQ_NO setHostName *
public void setHostName(String hostname)
For client connections or direct TCP/IP connections to WebSphere MQ Event Broker, the name of the host to connect to. | | | | | | | | | setLocalAddress *
public void setLocalAddress(String localAddress) throws JMSException
Set the local address. Parameters: localAddress: the local address to be used. The format of a local address is [ip-addr][(low-port[,high-port])]. Here are some examples: 9.20.4.98 The channel binds to address 9.20.4.98 locally
328
Using Java
ConnectionFactory
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 9.20.4.98(1000) The channel binds to address 9.20.4.98 locally and uses port 1000 9.20.4.98(1000,2000) The channel binds to address 9.20.4.98 locally and uses a port in the range 1000 to 2000 (1000) The channel binds to port 1000 locally (1000,2000) The channel binds to a port in the range 1000 to 2000 locally You can specify a host name instead of an IP address. Specify a range of ports to allow for connections that are required internally as well as those explicitly used by an application. The number of ports required depends on the application and the facilities it uses. Typically, this is the number of sessions the application uses plus three or four additional ports. If an application is having difficulty making connections, increase the number of ports in the range. Note that connection pooling has an effect on how quickly a port can be reused. In JMS, connection pooling is switched on by default and it might be some minutes before a port can be reused and connection errors may occur in the meantime. For direct connections, the local address determines which of the local network interfaces is used for multicast connections. When specifying a local address for a direct connection, do not include a port number. A port number is not valid for multicast and, if specified, causes a failure at connect time. Throws: JMSException if the format of the local address is incorrect. setMessageRetention *
public void setMessageRetention(int x) throws JMSException
Set method for messageRetention attribute. Parameters: Valid values are: v JMSC.MQJMS_MRET_YES: unwanted messages remain on the input queue. v JMSC.MQJMS_MRET_NO: unwanted messages are dealt with according to their disposition options. For more information on this, see General principles for point-to-point messaging on page 278.
329
ConnectionFactory
| | | | | | | | | setMessageSelection *
public void setMessageSelection(int x)
Set method for the message selection attribute. Parameters: x: an integer indicating whether the client or the broker performs message selection. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_MSEL_CLIENT JMSC.MQJMS_MSEL_BROKER setMsgBatchSize *
public void setMsgBatchSize(int x)
Set the maximum number of messages to be taken at once when using asynchronous delivery. | | | | | | | | | | setMulticast *
public void setMulticast(int x) throws JMSException
Set method for the multicast attribute. Parameters: x: an integer specifying a multicast setting. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_MULTICAST_DISABLED JMSC.MQJMS_MULTICAST_NOT_RELIABLE JMSC.MQJMS_MULTICAST_RELIABLE JMSC.MQJMS_MULTICAST_ENABLED setPollingInterval *
public void setPollingInterval(int x)
Set the interval between scans of all receivers during asynchronous message delivery. The value is a number of milliseconds. setPort *
public void setPort(int port) throws JMSException
Set the port for a client connection or direct TCP/IP connection to WebSphere MQ Event Broker. Parameters: port: the new value to use. Throws: JMSException if the port is negative.
330
Using Java
ConnectionFactory
| | | | | | | | | | | | | | | | | | | | setProxyHostName *
public void setProxyHostName(String proxyHostName) throws JMSException
Set method for the proxy host name attribute. Parameters: proxyHostName: the host name of the proxy server when establishing a direct connection, or null if no proxy server is used. setProxyPort *
public void setProxyPort(int proxyPort) throws JMSException
Set method for the proxy port attribute. Parameters: proxyPort: the port number of the proxy server when establishing a direct connection. setPubAckInterval *
public void setPubAckInterval(int x)
Set method for pubAckInterval attribute. The number of messages to publish between requiring acknowledgement from the broker. The default is 25. Applications do not normally alter this value, and must not rely on this acknowledgement. Parameters: pubAckInterval: the number of messages to use as an interval. setQueueManager *
public void setQueueManager(String x) throws JMSException
Initialization string that is passed to the constructor of the receive exit class. setSecurityExit *
public void setSecurityExit(String securityExit)
331
ConnectionFactory
setSendExit *
public void setSendExit(String sendExit)
Set method for the sparse subscriptions attribute. A sparse subscription is one that receives infrequent matching messages. The default value of this attribute is false. A value of true might be required if an application using sparse subscriptions fails to receive messages because of log overflow. If you set the attribute to true, the application must be able to open the consumer queue for browsing messages. Parameters: x: indicates whether sparse subscriptions are selected. setSSLCertStores *
public void setSSLCertStores(java.util.Collection stores)
Provide a collection of CertStore objects used for CRL checking. The certificate provided by the queue manager is checked against one of the CertStore objects contained within the collection; if the certificate is found, the connection attempt fails. At connect-time, each CertStore in the collection is tried in turn until one is successfully used to verify the queue managers certificate. If set to null (the default), no checking of the queue managers certificate is performed. This property is ignored if sslCipherSuite is null. Use of this property requires Java 2 v1.4. If CertStores are specified using this method, the MQConnectionFactory cannot be bound into a JNDI namespace. Attempting to do so will result in an exception. Note: To use a CertStore successfully with a CRL hosted on an LDAP server, make sure that your Java Software Development Kit (SDK) is compatible with the CRL. Some SDKs require that the CRL conforms to RFC 2587, which defines a schema for LDAP v2. Most LDAP v3 servers use RFC 2256 instead. setSSLCertStores *
public void setSSLCertStores(String storeSpec) throws JMSException
Specify a list of LDAP servers used for CRL checking. This string must consist of a sequence of space-delimited LDAP URIs of the form ldap://host[:port]. If no port is specified, the LDAP default of 389 is assumed. The certificate provided by the queue manager is checked against one of the listed LDAP CRL servers; if found, the connection fails. Each LDAP server is tried in turn until one is successfully used to verify the queue managers certificate. If set to null (the default), no checking of the queue managers certificate is performed. Throws JMSException if the
332
Using Java
ConnectionFactory
supplied list of LDAP URIs is not valid. This property is ignored if sslCipherSuite is null. Use of this property requires Java 2 v1.4. Note: To use a CertStore successfully with a CRL hosted on an LDAP server, make sure that your Java Software Development Kit (SDK) is compatible with the CRL. Some SDKs require that the CRL conforms to RFC 2587, which defines a schema for LDAP v2. Most LDAP v3 servers use RFC 2256 instead. setSSLCipherSuite *
public void setSSLCipherSuite(String cipherSuite)
Set this to the CipherSuite matching the CipherSpec set on the SVRCONN channel. If set to null (the default), no SSL encryption is performed. See Appendix H, SSL CipherSuites supported by WebSphere MQ, on page 487 for a list of CipherSuites and their associated CipherSpecs. setSSLPeerName *
public void setSSLPeerName(String peerName) throws JMSException
Sets sslPeerName to a distinguished name pattern. If sslCipherSuite is set, this variable can be used to ensure the correct queue manager is used. For a description of the format for this value, see Using the distinguished name of the queue manager on page 90. The distinguished name provided by the queue manager must match this pattern, or the connection attempt fails. If set to null (the default), no checking of the queue managers DN is performed. Throws JMSException if the supplied pattern is not valid. This property is ignored if sslCipherSuite is null. setSSLSocketFactory *
public void setSSLSocketFactory(javax.net.ssl.SSLSocketFactory sf)
Set the SSLSocketFactory for use with SSL encryption. Use this to customize all aspects of SSL encryption. For more information on constructing and customizing SSLSocketFactory instances, refer to your JSSE providers documentation. If set to null (default), the JSSE default SSLSocketFactory is used when SSL encryption is requested. This property is ignored if sslCipherSuite is null. If a custom SSLSocketFactory is specified, the MQConnectionFactory cannot be bound into a JNDI namespace. Attempting to do so results in an exception. | | | | | | setStatusRefreshInterval *
public void setStatusRefreshInterval(int x)
Set method for statusRefreshInterval attribute. Parameters: statusRefreshInterval: the number of milliseconds between transactions to refresh publish/subscribe status.
333
ConnectionFactory
| | | | | | | | | | setSubscriptionStore *
public void setSubscriptionStore(int x) throws JMSException
Set method for the SUBSTORE property. Parameters: SubStoretype: an integer representing one of the valid values of the SUBSTORE property. The following symbolic constants represent the valid values: JMSC.MQJMS_SUBSTORE_QUEUE JMSC.MQJMS_SUBSTORE_BROKER JMSC.MQJMS_SUBSTORE_MIGRATE setSyncpointAllGets *
public void setSyncpointAllGets(boolean x)
Choose whether to do all GET operations within a syncpoint. The default setting for this property is false. This allows GET operations not under transaction management to perform more quickly. | | | | | | | | | | | | setTemporaryModel *
public void setTemporaryModel(String x) throws JMSException
setTempQPrefix *
public void setTempQPrefix(java.lang.String tempQPrefix) throws JMSException
Set the prefix to be used to form the name of a WebSphere MQ dynamic queue. Parameters: tempQPrefix: the prefix to be used to form the name of a WebSphere MQ dynamic queue. Throws: JMSException if the string is null, empty, greater than 33 characters in length, or consists solely of a single asterisk (*). setTransportType *
public void setTransportType(int x) throws JMSException
Set the transport type to use. It can be one of the following: JMSC.MQJMS_TP_BINDINGS_MQ JMSC.MQJMS_TP_CLIENT_MQ_TCPIP JMSC.MQJMS_TP_DIRECT_TCPIP JMSC.MQJMS_TP_DIRECT_HTTP setUseConnectionPooling *
public void setUseConnectionPooling(boolean x)
Choose whether to use connection pooling. If you set this to true, JMS enables connection pooling for the lifetime of any connections created through the ConnectionFactory. This also affects connections created with UseConnectionPooling set to false; to disable connection pooling throughout a JVM, ensure that all ConnectionFactories used within the JVM have ConnectionPooling set to false. The default, and recommended, value is true. You can disable connection pooling if, for example, your applications run in an environment that performs its own pooling.
334
Using Java
ConnectionMetaData
ConnectionMetaData
public interface ConnectionMetaData WebSphere MQ class: MQConnectionMetaData
java.lang.Object | +----com.ibm.mq.jms.MQConnectionMetaData
WebSphere MQ constructor
MQConnectionMetaData
public MQConnectionMetaData()
Methods
getJMSMajorVersion
public int getJMSMajorVersion() throws JMSException
Get the JMS major version number. Returns: The JMS major version number. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. getJMSMinorVersion
public int getJMSMinorVersion() throws JMSException
Get the JMS minor version number. Returns: The JMS minor version number. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. getJMSProviderName
public java.lang.String getJMSProviderName() throws JMSException
Get the JMS provider name. Returns: The JMS provider name. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. getJMSVersion
public java.lang.String getJMSVersion() throws JMSException
335
ConnectionMetaData
Returns: The JMS version. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. getJMSXPropertyNames
public java.util.Enumeration getJMSXPropertyNames() throws JMSException
Get an enumeration of the names of the JMSX Properties supported by this connection. Returns: An enumeration of JMSX PropertyNames. Throws: JMSException if an internal error occurs in JMS implementation during the property names retrieval. getProviderMajorVersion
public int getProviderMajorVersion() throws JMSException
Get the JMS provider major version number. Returns: The JMS provider major version number. Throws: JMSException - if an internal error occurs in JMS implementation during the metadata retrieval. getProviderMinorVersion
public int getProviderMinorVersion() throws JMSException
Get the JMS provider minor version number. Returns: The JMS provider minor version number. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. getProviderVersion
public java.lang.String getProviderVersion() throws JMSException
Get the JMS provider version. Returns: The JMS provider version. Throws: JMSException if an internal error occurs in JMS implementation during the metadata retrieval. toString *
public String toString()
336
Using Java
DeliveryMode
DeliveryMode
public interface DeliveryMode Delivery modes supported by JMS.
Fields
NON_PERSISTENT
public static final int NON_PERSISTENT
The lowest overhead delivery mode, because it does not require that the message be logged to stable storage. PERSISTENT
public static final int PERSISTENT
Instruct the JMS provider to log the message to stable storage as part of the clients send operation.
337
Destination
Destination
public interface Destination Subinterfaces: Queue, TemporaryQueue, TemporaryTopic, and Topic WebSphere MQ class: MQDestination
java.lang.Object | +----com.ibm.mq.jms.MQDestination
The Destination object encapsulates provider-specific addresses. See also: Queue, TemporaryQueue, TemporaryTopic, and Topic
WebSphere MQ constructors
MQDestination
public MQDestination()
Methods
getCCSID *
public int getCCSID()
Get the name of the character set that is used by this destination. getDescription *
public String getDescription()
Get the behavior of applications accessing a quiescing queue manager with this destination. getPersistence *
public int getPersistence()
338
Using Java
Destination
public int getTargetClient()
Character set to be used to encode text strings in messages sent to this destination. See Table 13 on page 127 for a list of allowed values. The default value is 1208 (UTF8). setDescription *
public void setDescription(String x)
The encoding to be used for numeric fields in messages sent to this destination. See Table 13 on page 127 for a list of allowed values. setExpiry *
public void setExpiry(int expiry) throws JMSException
Set the behavior of applications accessing a quiescing queue manager with this destination. Takes values of: v JMSC.MQJMS_FIQ_YES (default) v JMSC.MQJMS_FIQ_NO setPersistence *
public void setPersistence(int persistence) throws JMSException
339
ExceptionListener
ExceptionListener
public interface ExceptionListener If a JMS provider detects a serious problem with a connection, it informs the connections ExceptionListener if one has been registered. It does this by calling the listeners onException() method, passing it a JMSException that describes the problem. This allows a client to be asynchronously notified of a problem. Some connections only consume messages, so they have no other way to learn that their Connection has failed. Exceptions are delivered when: v There is a failure in receiving an asynchronous message v A message throws a runtime exception
Methods
onException
public void onException(JMSException exception)
Notify user of a JMS exception. Parameters: exception: the JMS exception. These are exceptions that result from asynchronous message delivery. Typically, they indicate a problem with receiving a message from the queue manager, or possibly an internal error in the JMS implementation.
340
Using Java
MapMessage
MapMessage
public interface MapMessage extends Message WebSphere MQ class: JMSMapMessage
java.lang.Object | +----com.ibm.jms.JMSMessage | +----com.ibm.jms.JMSMapMessage
Use a MapMessage to send a set of name-value pairs where names are strings and values are Java primitive types. The entries can be accessed sequentially or randomly by name. The order of the entries is undefined. See also: BytesMessage, Message, ObjectMessage, StreamMessage, and TextMessage
Methods
getBoolean
public boolean getBoolean(java.lang.String name) throws JMSException
Return the boolean value with the given name. Parameters: name: the name of the boolean Returns: The boolean value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getByte
public byte getByte(java.lang.String name) throws JMSException
Return the byte value with the given name. Parameters: name: the name of the byte. Returns: The byte value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid.
341
MapMessage
getBytes
public byte[] getBytes(java.lang.String name) throws JMSException
Return the byte array value with the given name. Parameters: name: the name of the byte array. Returns: A copy of the byte array value with the given name. If there is no item by this name, a null value is returned. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type of conversion is not valid. getChar
public char getChar(java.lang.String name) throws JMSException
Return the Unicode character value with the given name. Parameters: name: the name of the Unicode character. Returns: The Unicode character value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getDouble
public double getDouble(java.lang.String name) throws JMSException
Return the double value with the given name. Parameters: name: the name of the double. Returns: The double value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid.
342
Using Java
MapMessage
getFloat
public float getFloat(java.lang.String name) throws JMSException
Return the float value with the given name. Parameters: name: the name of the float. Returns: The float value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getInt
public int getInt(java.lang.String name) throws JMSException
Return the integer value with the given name. Parameters: name: the name of the integer. Returns: The integer value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getLong
public long getLong(java.lang.String name) throws JMSException
Return the long value with the given name. Parameters: name: the name of the long. Returns: The long value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getMapNames
public java.util.Enumeration getMapNames() throws JMSException
Return an enumeration of all the map messages names. Returns: An enumeration of all the names in this map message. Throws: JMSException if JMS fails to read the message because of an internal JMS error.
343
MapMessage
getObject
public java.lang.Object getObject(java.lang.String name) throws JMSException
Return the Java object value with the given name. This method returns in object format, a value that has been stored in the map either using the setObject method call, or the equivalent primitive set method. Parameters: name: the name of the Java object. Returns: A copy of the Java object value with the given name, in object format (if it is set as an int, an Integer is returned). If there is no item by this name, a null value is returned. Throws: JMSException if JMS fails to read the message because of an internal JMS error. getShort
public short getShort(java.lang.String name) throws JMSException
Return the short value with the given name. Parameters: name: the name of the short. Returns: The short value with the given name. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getString
public java.lang.String getString(java.lang.String name) throws JMSException
Return the string value with the given name. Parameters: name: the name of the string. Returns: The string value with the given name. If there is no item by this name, a null value is returned. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageFormatException if this type conversion is not valid.
344
Using Java
MapMessage
itemExists
public boolean itemExists(java.lang.String name) throws JMSException
Check if an item exists in this MapMessage. Parameters: name: the name of the item to test. Returns: True if the item exists. Throws: JMSException - if a JMS error occurs. setBoolean
public void setBoolean(java.lang.String name, boolean value) throws JMSException
Set a boolean value with the given name into the map. Parameters: v name: the name of the boolean. v value: the boolean value to set in the Map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setByte
public void setByte(java.lang.String name, byte value) throws JMSException
Set a byte value with the given name into the map. Parameters: v name: the name of the byte. v value: the byte value to set in the Map. Throws: v JMSException if JMS fails to write message due to some internal JMS error v MessageNotWriteableException if the message is in read-only mode. setBytes
public void setBytes(java.lang.String name, byte[] value) throws JMSException
Set a byte array value with the given name into the map. Parameters: v name: the name of the byte array. v value: the byte array value to set in the map. The array is copied, so the value in the map is not altered by subsequent modifications to the array.
Chapter 15. JMS interfaces and classes
345
MapMessage
Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setBytes
public void setBytes(java.lang.String name, byte[] value, int offset, int length) throws JMSException
Set a portion of the byte array value with the given name into the mp. The array is copied, so the value in the map is not altered by subsequent modifications to the array. Parameters: v name: the name of the byte array. v value: the byte array value to set in the Map. v offset: the initial offset within the byte array. v length: the number of bytes to be copied. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setChar
public void setChar(java.lang.String name, char value) throws JMSException
Set a Unicode character value with the given name into the map. Parameters: v name: the name of the Unicode character. v value: the Unicode character value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setDouble
public void setDouble(java.lang.String name, double value) throws JMSException
Set a double value with the given name into the map. Parameters: v name: the name of the double. v value: the double value to set in the Map. Throws:
346
Using Java
MapMessage
v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setFloat
public void setFloat(java.lang.String name, float value) throws JMSException
Set a float value with the given name into the map. Parameters: v name: the name of the float. v value: the float value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setInt
public void setInt(java.lang.String name, int value) throws JMSException
Set an integer value with the given name into the map. Parameters: v name: the name of the integer. v value: the integer value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode. setLong
public void setLong(java.lang.String name, long value) throws JMSException
Set a long value with the given name into the map. Parameters: v name: the name of the long. v value: the long value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode.
347
MapMessage
setObject
public void setObject(java.lang.String name, java.lang.Object value) throws JMSException
Set a Java object value with the given name into the map. This method works only for object primitive types (for example, Integer, Double, and Long), strings and byte arrays. Parameters: v name: the name of the Java object. v value: the Java object value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageFormatException if object is not valid. v MessageNotWriteableException if the message is in read-only mode. setShort
public void setShort(java.lang.String name, short value) throws JMSException
Set a short value with the given name into the map. Parameters: v name: the name of the short. v value: the short value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException - if the message is in read-only mode. setString
public void setString(java.lang.String name, java.lang.String value) throws JMSException
Set a string value with the given name into the map. Parameters: v name: the name of the string. v value: the string value to set in the map. Throws: v JMSException if JMS fails to write message due to some internal JMS error. v MessageNotWriteableException if the message is in read-only mode.
348
Using Java
Message
Message
public interface Message Subinterfaces: BytesMessage, MapMessage, ObjectMessage, StreamMessage, and TextMessage WebSphere MQ class: JMSMessage
java.lang.Object | +----com.ibm.jms.MQJMSMessage
The Message interface is the root interface of all JMS messages. It defines the JMS header and the acknowledge method used for all messages.
Fields
DEFAULT_DELIVERY_MODE
public static final int DEFAULT_DELIVERY_MODE
Methods
acknowledge
public void acknowledge() throws JMSException
Acknowledge this and all previous messages received by the session. Throws: JMSException if JMS fails to acknowledge because of an internal JMS error. clearBody
public void clearBody() throws JMSException
Clear out the message body. All other parts of the message are left untouched. Throws: JMSException if JMS fails to because of an internal JMS error.
349
Message
clearProperties
public void clearProperties() throws JMSException
Clear a messages properties. The header fields and message body are not cleared. Throws: JMSException if JMS fails to clear JMS message properties because of an internal JMS error. getBooleanProperty
public boolean getBooleanProperty(java.lang.String name) throws JMSException
Return the boolean property value with the given name. Parameters: name: the name of the boolean property. Returns: The boolean property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid getByteProperty
public byte getByteProperty(java.lang.String name) throws JMSException
Return the byte property value with the given name. Parameters: name: the name of the byte property. Returns: The byte property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getDoubleProperty
public double getDoubleProperty(java.lang.String name) throws JMSException
Return the double property value with the given name. Parameters: name: the name of the double property. Returns: The double property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid.
350
Using Java
Message
getFloatProperty
public float getFloatProperty(java.lang.String name) throws JMSException
Return the float property value with the given name. Parameters: name: the name of the float property. Returns: The float property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getIntProperty
public int getIntProperty(java.lang.String name) throws JMSException
Return the integer property value with the given name. Parameters: name: the name of the integer property. Returns: The integer property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getJMSCorrelationID
public java.lang.String getJMSCorrelationID() throws JMSException
Get the correlation ID for the message. Returns: The correlation ID of a message as a string. Throws: JMSException if JMS fails to get the correlation ID because of an internal JMS error. See also: setJMSCorrelationID(), getJMSCorrelationIDAsBytes(), setJMSCorrelationIDAsBytes()
351
Message
getJMSCorrelationIDAsBytes
public byte[] getJMSCorrelationIDAsBytes() throws JMSException
Get the correlation ID as an array of bytes for the message. Returns: The correlation ID of a message as an array of bytes. Throws: JMSException if JMS fails to get correlation ID because of an internal JMS error. See also: setJMSCorrelationID(), getJMSCorrelationID(), setJMSCorrelationIDAsBytes() getJMSDeliveryMode
public int getJMSDeliveryMode() throws JMSException
Get the delivery mode for this message. Returns: The delivery mode of this message. Throws: JMSException if JMS fails to get JMS DeliveryMode because of an internal JMS error. See also: setJMSDeliveryMode(), DeliveryMode getJMSDestination
public Destination getJMSDestination() throws JMSException
Get the destination for this message. Returns: The destination of this message. Throws: JMSException if JMS fails to get JMS Destination because of an internal JMS error. See also: setJMSDestination() getJMSExpiration
public long getJMSExpiration() throws JMSException
Get the messages expiration value. Returns: The time that the message expires. It is the sum of the time-to-live value specified by the client, and the GMT at the time of the send. Throws: JMSException if JMS fails to get JMS message expiration because of an internal JMS error. See also: setJMSExpiration()
352
Using Java
Message
getJMSMessageID
public java.lang.String getJMSMessageID() throws JMSException
Get the message ID. Returns: The message ID. Throws: JMSException if JMS fails to get the message ID because of an internal JMS error. See also: setJMSMessageID() getJMSPriority
public int getJMSPriority() throws JMSException
Get the message priority. Returns: The message priority. Throws: JMSException if JMS fails to get JMS message priority because of an internal JMS error. See also: setJMSPriority() for priority levels getJMSRedelivered
public boolean getJMSRedelivered() throws JMSException
Get an indication of whether this message is being redelivered. If a client receives a message with the redelivered indicator set, it is likely, but not guaranteed, that this message was delivered to the client earlier, but that the client did not acknowledge its receipt at that earlier time. Returns: Set to true if this message is being redelivered. Throws: JMSException if JMS fails to get JMS redelivered flag because of an internal JMS error. See also: setJMSRedelivered() getJMSReplyTo
public Destination getJMSReplyTo() throws JMSException
Get where a reply to this message should be sent. Returns: Where to send a response to this message Throws: JMSException if JMS fails to get ReplyTo destination because of an internal JMS error.
353
Message
See also: setJMSReplyTo() getJMSTimestamp
public long getJMSTimestamp() throws JMSException
Get the message timestamp. Returns: The message timestamp. Throws: JMSException if JMS fails to get the timestamp because of an internal JMS error. See also: setJMSTimestamp() getJMSType
public java.lang.String getJMSType() throws JMSException
Get the message type. Returns: The message type. Throws: JMSException if JMS fails to get JMS message type because of an internal JMS error. See also: setJMSType() getLongProperty
public long getLongProperty(java.lang.String name) throws JMSException
Return the long property value with the given name. Parameters: name: the name of the long property. Returns: The long property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getObjectProperty
public java.lang.Object getObjectProperty (java.lang.String name) throws JMSException
Return the Java object property value with the given name. Parameters: name: the name of the Java object property. Returns: The Java object property value with the given name, in object format (for example, if it set as an int, an Integer is returned). If there is no property by this name, a null value is returned.
354
Using Java
Message
Throws: JMSException if JMS fails to get the property because of an internal JMS error. getPropertyNames
public java.util.Enumeration getPropertyNames() throws JMSException
Return an enumeration of all the property names. Returns: An enumeration of all the names of property values. Throws: JMSException if JMS fails to get the property names because of an internal JMS error. getShortProperty
public short getShortProperty(java.lang.String name) throws JMSException
Return the short property value with the given name. Parameters: name: the name of the short property. Returns: The short property value with the given name. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid. getStringProperty
public java.lang.String getStringProperty (java.lang.String name) throws JMSException
Return the string property value with the given name. Parameters: name: the name of the string property Returns: The string property value with the given name. If there is no property by this name, a null value is returned. Throws: v JMSException if JMS fails to get the property because of an internal JMS error. v MessageFormatException if this type conversion is not valid.
355
Message
propertyExists
public boolean propertyExists(java.lang.String name) throws JMSException
Check if a property value exists. Parameters: name: the name of the property to test. Returns: True if the property does exist. Throws: JMSException if JMS fails to check whether a property exists because of an internal JMS error. setBooleanProperty
public void setBooleanProperty(java.lang.String name, boolean value) throws JMSException
Set a boolean property value with the given name into the message. Parameters: v name: the name of the boolean property. v value: the boolean property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setByteProperty
public void setByteProperty(java.lang.String name, byte value) throws JMSException
Set a byte property value with the given name into the message. Parameters: v name: the name of the byte property. v value: the byte property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setDoubleProperty
public void setDoubleProperty(java.lang.String name, double value) throws JMSException
Set a double property value with the given name into the message. Parameters: v name: the name of the double property. v value: the double property value to set in the message.
356
Using Java
Message
Throws: v JMSException if JMS fails to set the property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setFloatProperty
public void setFloatProperty(java.lang.String name, float value) throws JMSException
Set a float property value with the given name into the message. Parameters: v name: the name of the float property. v value: the float property value to set in the message. Throws: v JMSException if JMS fails to set the property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setIntProperty
public void setIntProperty(java.lang.String name, int value) throws JMSException
Set an integer property value with the given name into the message. Parameters: v name: the name of the integer property. v value: the integer property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setJMSCorrelationID
public void setJMSCorrelationID (java.lang.String correlationID) throws JMSException
Set the correlation ID for the message. A client can use the JMSCorrelationID header field to link one message with another. A typical use is to link a response message with its request message. Note: The use of a byte[] value for JMSCorrelationID is non-portable. Parameters: correlationID: the message ID of a message being referred to. Throws: JMSException if JMS fails to set the correlation ID because of an internal JMS error. See also: getJMSCorrelationID(), getJMSCorrelationIDAsBytes(), setJMSCorrelationIDAsBytes()
Chapter 15. JMS interfaces and classes
357
Message
setJMSCorrelationIDAsBytes
public void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException
Set the correlation ID as an array of bytes for the message. A client can use this call to set the correlationID equal either to a messageID from a previous message, or to an application-specific string. Application-specific strings must not start with the characters ID. Parameters: correlationID: the correlation ID as a string, or the message ID of a message being referred to. Throws: JMSException if JMS fails to set the correlation ID because of an internal JMS error. See also: setJMSCorrelationID(), getJMSCorrelationID(), getJMSCorrelationIDAsBytes() setJMSDeliveryMode
public void setJMSDeliveryMode(int deliveryMode) throws JMSException
Set the delivery mode for this message. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. To alter the delivery mode when a message is sent, use the setDeliveryMode method on the QueueSender or TopicPublisher (this method is inherited from MessageProducer). Parameters: deliveryMode: the delivery mode for this message. Throws: JMSException if JMS fails to set JMS DeliveryMode because of an internal JMS error. See also: getJMSDeliveryMode(), DeliveryMode setJMSDestination
public void setJMSDestination(Destination destination) throws JMSexception
Set the destination for this message. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. Parameters: destination: the destination for this message. Throws: JMSException if JMS fails to set JMS destination because of an internal JMS error.
358
Using Java
Message
See also: getJMSDestination() setJMSExpiration
public void setJMSExpiration(long expiration) throws JMSException
Set the messages expiration value. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. Parameters: expiration: the messages expiration time. Throws: JMSException if JMS fails to set JMS message expiration because of an internal JMS error. See also: getJMSExpiration() setJMSMessageID
public void setJMSMessageID(java.lang.String id) throws JMSException
Set the message ID. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. Parameters: id: the ID of the message. Throws: JMSException if JMS fails to set the message ID because of an internal JMS error. See also: getJMSMessageID() setJMSPriority
public void setJMSPriority(int priority) throws JMSException
Set the priority for this message. JMS defines a ten-level priority value, with 0 as the lowest priority, and 9 as the highest. In addition, clients must consider priorities 0-4 as gradations of normal priority, and priorities 5-9 as gradations of expedited priority. Parameters: priority: the priority of this message. Throws: JMSException if JMS fails to set JMS message priority because of an internal JMS error. See also: getJMSPriority()
359
Message
setJMSRedelivered
public void setJMSRedelivered(boolean redelivered) throws JMSException
Set to indicate whether this message is being redelivered. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. Parameters: redelivered: an indication of whether this message is being redelivered. Throws: JMSException if JMS fails to set JMSRedelivered flag because of an internal JMS error. See also: getJMSRedelivered() setJMSReplyTo
public void setJMSReplyTo(Destination replyTo) throws JMSException
Set where a reply to this message should be sent. Parameters: replyTo: where to send a response to this message. A null value indicates that no reply is expected. Throws: JMSException if JMS fails to set ReplyTo destination because of an internal JMS error. See also: getJMSReplyTo() setJMSTimestamp
public void setJMSTimestamp(long timestamp) throws JMSException
Set the message timestamp. Any value set using this method is ignored when the message is sent, but this method can be used to change the value in a received message. Parameters: timestamp: the timestamp for this message. Throws: JMSException if JMS fails to set the timestamp because of an internal JMS error. See also: getJMSTimestamp()
360
Using Java
Message
setJMSType
public void setJMSType(java.lang.String type) throws JMSException
Set the message type. JMS clients must assign a value to type whether the application makes use of it or not. This ensures that it is properly set for those providers that require it. Parameters: type: the class of message. Throws: JMSException if JMS fails to set JMS message type because of an internal JMS error. See also: getJMSType() setLongProperty
public void setLongProperty(java.lang.String name, long value) throws JMSException
Set a long property value with the given name into the message. Parameters: v name: the name of the long property. v value: the long property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setObjectProperty
public void setObjectProperty(java.lang.String name, java.lang.Object value) throws JMSException
Set a property value with the given name into the message. Parameters: v name: the name of the Java object property. v value: the Java object property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageFormatException if the object is not valid. v MessageNotWriteableException - if the properties are read-only.
361
Message
setShortProperty
public void setShortProperty(java.lang.String name, short value) throws JMSException
Set a short property value with the given name into the message. Parameters: v name: the name of the short property. v value: the short property value to set in the message. Throws: v JMSException if JMS fails to set property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only. setStringProperty
public void setStringProperty(java.lang.String name, java.lang.String value) throws JMSException
Set a string property value with the given name into the message. Parameters: v name: the name of the string property. v value: the string property value to set in the message. Throws: v JMSException if JMS fails to set the property because of an internal JMS error. v MessageNotWriteableException if the properties are read-only.
362
Using Java
MessageConsumer
MessageConsumer
public interface MessageConsumer Subinterfaces: QueueReceiver and TopicSubscriber WebSphere MQ class: MQMessageConsumer
java.lang.Object | +----com.ibm.mq.jms.MQMessageConsumer
MessageConsumer is the parent interface for all message consumers. A client uses a message consumer to receive messages from a Destination. | See also: QueueReceiver, Session, and TopicSubscriber
Methods
close
public void close() throws JMSException
Close the message consumer. Because a provider can allocate some resources outside the JVM on behalf of a MessageConsumer, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. This call blocks until a receive or message listener in progress has completed. Throws: JMSException if JMS fails to close the consumer because of an error. getMessageListener
public MessageListener getMessageListener() throws JMSException
Get the message consumers MessageListener. Returns: The listener for the message consumer, or null if a listener is not set. Throws: JMSException if JMS fails to get the message listener because of a JMS error. See also: setMessageListener
363
MessageConsumer
getMessageSelector
public java.lang.String getMessageSelector() throws JMSException
Get this message consumers message selector expression. Returns: The message consumers message selector. Throws: JMSException if JMS fails to get the message selector because of a JMS error. receive
public Message receive() throws JMSException
Receive the next message produced for this message consumer. Returns: The next message produced for this message consumer. Throws: JMSException if JMS fails to receive the next message because of an error. receive
public Message receive(long timeOut) throws JMSException
Receive the next message that arrives within the specified timeout interval. A timeout value of zero causes the call to wait indefinitely until a message arrives. Parameters: timeout: the timeout value (in milliseconds). Returns: The next message produced for this message consumer, or null if one is not available. Throws: JMSException if JMS fails to receive the next message because of an error. receiveNoWait
public Message receiveNoWait() throws JMSException
Receive the next message if one is immediately available. Returns: The next message produced for this message consumer, or null if one is not available. Throws: JMSException if JMS fails to receive the next message because of an error.
364
Using Java
MessageConsumer
setMessageListener
public void setMessageListener(MessageListener listener) throws JMSException
Set the message consumers MessageListener. Parameters: messageListener: the messages are delivered to this listener. Throws: JMSException if JMS fails to set message listener because of a JMS error. See also: getMessageListener
365
MessageListener
MessageListener
public interface MessageListener Use a MessageListener to receive asynchronously delivered messages.
Methods
onMessage
public void onMessage(Message message)
Pass a message to the listener. Parameters: message: the message passed to the listener. See also Session.setMessageListener
366
Using Java
MessageProducer
MessageProducer
public interface MessageProducer Subinterfaces: QueueSender and TopicPublisher WebSphere MQ class: MQMessageProducer
java.lang.Object | +----com.ibm.mq.jms.MQMessageProducer
A client uses a MessageProducer to send messages to a destination. | | See also: QueueSender, TopicPublisher, and Session.createProducer(javax.jms.Destination)
WebSphere MQ constructors
MQMessageProducer
public MQMessageProducer()
Methods
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a MessageProducer, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Throws: JMSException if JMS fails to close the producer because of an error. getDeliveryMode
public int getDeliveryMode() throws JMSException
Get the producers default delivery mode. Returns: The message delivery mode for this message producer. Throws: JMSException if JMS fails to get the delivery mode because of an internal error. See also: setDeliveryMode
367
MessageProducer
| | | | | | | | getDestination (JMS 1.1 only)
public Destination getDestination() throws JMSException
Get the destination associated with the message producer. Returns: The message producers destination. Throws: JMSException if JMS fails to get the destination because of an internal JMS error. getDisableMessageID
public boolean getDisableMessageID() throws JMSException
Get an indication of whether message IDs are disabled. Returns: An indication of whether message IDs are disabled. Throws: JMSException if JMS fails to get the disabled message ID because of an internal error. getDisableMessageTimestamp
public boolean getDisableMessageTimestamp() throws JMSException
Get an indication of whether message timestamps are disabled. Returns: An indication of whether message IDs are disabled. Throws: JMSException if JMS fails to get the disabled message timestamp because of an internal error. getPriority
public int getPriority() throws JMSException
Get the producers default priority. Returns: The message priority for this message producer. Throws: JMSException if JMS fails to get the priority because of an internal error. See also: setPriority
368
Using Java
MessageProducer
getTimeToLive
public long getTimeToLive() throws JMSException
Get the default length of time in milliseconds from its dispatch time that the message system retains a produced message. Returns: The message time-to-live in milliseconds; zero is unlimited. Throws: JMSException if JMS fails to get the time-to-live because of an internal error. See also: setTimeToLive | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | send (JMS 1.1 only)
public void send(Message message) throws JMSException
Send a message using the message producers default delivery mode, default priority, and default time to live. Parameters: message: the message to send. Throws: v JMSException if JMS fails to send the message because of an internal JMS error. v MessageFormatException if the message is not valid. v InvalidDestinationException if a client uses this method with a message producer whose destination is not valid. v java.lang.UnsupportedOperationException if a client uses this method with a message producer for which no destination was specified when it was created. See also: MessageProducer, Session.createProducer send (JMS 1.1 only)
public void send(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Send a message specifying a delivery mode, a priority, and a time to live. Parameters: v message: the message to send. v deliveryMode: the delivery mode to use v priority: the priority for the message v timeToLive: the lifetime of the message in milliseconds. Throws: v JMSException if JMS fails to send the message because of an internal JMS error. v MessageFormatException if the message is not valid. v InvalidDestinationException if a client uses this method with a message producer whose destination is not valid.
369
MessageProducer
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | v java.lang.UnsupportedOperationException if a client uses this method with a message producer for which no destination was specified when the message producer was created. See also: Session.createProducer send (JMS 1.1 only)
public void send(Destination destination, Message message) throws JMSException
Send a message to a destination if you are using a message producer for which no destination was specified when the message producer was created. The method uses the message producers default delivery mode, default priority, and default time to live. Typically, you specify a destination when you create a message producer but, if you do not, you must specify a destination every time you send a message. Parameters: v destination: the destination to send the message to. v message: the message to send. Throws: v JMSException if JMS fails to send the message because of an internal JMS error. v MessageFormatException if the message is not valid. v InvalidDestinationException if the destination is not valid. v java.lang.UnsupportedOperationException if a client uses this method with a message producer for which a destination was specified when the message producer was created. See also: MessageProducer, Session.createProducer send (JMS 1.1 only)
public void send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Send a message to a destination if you are using a message producer for which no destination was specified when the message producer was created. The method specifies a delivery mode, a priority, and a time to live. Typically, you specify a destination when you create a message producer but, if do not, you must specify a destination every time you send a message. Parameters: v destination: the destination to which to send the message. v message: the message to send. v deliveryMode: the delivery mode to use v priority: the priority for the message v timeToLive: the lifetime of the message in milliseconds.
370
Using Java
MessageProducer
| | | | | | | | | | Throws: v JMSException if JMS fails to send the message because of an internal JMS error. v MessageFormatException if the message is not valid. v InvalidDestinationException if the destination is not valid. v java.lang.UnsupportedOperationException if a client uses this method with a message producer for which a destination was specified when the message producer was created. See also: Session.createProducer setDeliveryMode
public void setDeliveryMode(int deliveryMode) throws JMSException
Set the producers default delivery mode; it is set to DeliveryMode.PERSISTENT by default. Parameters: deliveryMode: the message delivery mode for this message producer. Throws: JMSException if JMS fails to set the delivery mode because of an internal error. See also: getDeliveryMode, DeliveryMode.NON_PERSISTENT, DeliveryMode.PERSISTENT, Message.DEFAULT_DELIVERY_MODE setDisableMessageID
public void setDisableMessageID(boolean value) throws JMSException
Set whether message IDs are disabled; they are enabled by default. Note: This method is ignored in the WebSphere MQ classes for Java Message Service implementation. Parameters: value: indicates whether message IDs are disabled. Throws: JMSException if JMS fails to set the disabled message ID because of an internal error. setDisableMessageTimestamp
public void setDisableMessageTimestamp(boolean value) throws JMSException
Set whether message timestamps are disabled; they are enabled by default. Note: This method is ignored in the WebSphere MQ classes for Java Message Service implementation. Parameters: value: indicates whether message timestamps are disabled.
371
MessageProducer
Throws: JMSException if JMS fails to set the disabled message timestamp because of an internal error. setPriority |
public void setPriority(int defaultPriority) throws JMSException
Set the producers default priority (default 4). | Parameters: defaultPriority: the message priority for this message producer. Throws: JMSException if JMS fails to set the priority because of an internal error. | See also: getPriority, Message.DEFAULT_PRIORITY setTimeToLive
public void setTimeToLive(long timeToLive) throws JMSException
Set the default length of time, in milliseconds from its dispatch time, that the message system retains a produced message. Time-to-live is set to zero by default.
WebSphere MQ Event Broker note This method throws a JMSException if set to other than 0 when you make a direct connection to WebSphere MQ Event Broker. Parameters: timeToLive: the message time to live in milliseconds; zero is unlimited. Throws: JMSException if JMS fails to set the time-to-live because of an internal error. | See also: getTimeToLive, Message.DEFAULT_TIME_TO_LIVE
372
Using Java
MQQueueEnumeration
MQQueueEnumeration *
public class MQQueueEnumeration extends Object implements Enumeration
java.lang.Object | +----com.ibm.mq.jms.MQQueueEnumeration
MQQueueEnumeration enumerates messages on a queue. This class is not defined in the JMS specification; it is created by calling the getEnumeration method of MQQueueBrowser. The class contains a base MQQueue instance to hold the browse cursor. The queue is closed once the cursor has moved off the end of the queue. There is no way to reset an instance of this class; it acts as a one-shot mechanism. See also: MQQueueBrowser
Methods
hasMoreElements
public boolean hasMoreElements()
Return the current message. If hasMoreElements() returns true, nextElement() always returns a message. It is possible for the returned message to pass its expiry date between the hasMoreElements() and the nextElement calls.
373
ObjectMessage
ObjectMessage
public interface ObjectMessage extends Message WebSphere MQ class: JMSObjectMessage
java.lang.Object | +----com.ibm.jms.JMSMessage | +----com.ibm.jms.JMSObjectMessage
Use an ObjectMessage to send a message that contains a serializable Java object. It inherits from Message and adds a body containing a single Java reference. Only serializable Java objects can be used. See also: BytesMessage, MapMessage, Message, StreamMessage, and TextMessage
Methods
getObject
public java.io.Serializable getObject() throws JMSException
Get the serializable object containing this messages data. The default value is null. Returns: The serializable object containing this messages data. Throws: v JMSException if JMS fails to get the object because of an internal JMS error. v MessageFormatException if object deserialization fails. setObject
public void setObject(java.io.Serializable object) throws JMSException
Set the serializable object containing this messages data. The ObjectMessage contains a snapshot of the object at the time setObject() is called. Subsequent modifications of the object have no effect on the ObjectMessage body. Parameters: object: the messages data. Throws: v JMSException if JMS fails to set the object because of an internal JMS error. v MessageFormatException if object serialization fails. v MessageNotWriteableException if the message is in read-only mode.
374
Using Java
Queue
Queue
public interface Queue extends Destination Subinterfaces: TemporaryQueue WebSphere MQ class: MQQueue
java.lang.Object | +----com.ibm.mq.jms.MQDestination | +----com.ibm.mq.jms.MQQueue
A Queue object encapsulates a provider-specific queue name. It is the way that a client specifies the identity of a queue to JMS methods.
WebSphere MQ constructors
MQQueue *
public MQQueue()
Create a new MQQueue instance. The string takes a URI format, as described on page 204. MQQueue *
public MQQueue(String queueManagerName, String queueName)
Methods
getBaseQueueManagerName *
public String getBaseQueueManagerName()
Get the name of this queue. Clients that depend upon the name are not portable. Returns: The queue name
375
Queue
Throws: JMSException if JMS implementation for queue fails to return the queue name because of an internal error. getReference *
public Reference getReference() throws NamingException
Create a reference for this queue. Returns: A reference for this object. Throws: NamingException. setBaseQueueManagerName *
public void setBaseQueueManagerName(String x) throws JMSException
Set the value of the WebSphere MQ queue manager name. Note: Only the administration tool can use this method. setBaseQueueName *
public void setBaseQueueName(String x) throws JMSException
Set the value of the WebSphere MQ queue name. Note: Only the administration tool can use this method. It makes no attempt to decode queue:qmgr:queue format strings. toString
public java.lang.String toString()
Return a well-formatted printed version of the queue name. Returns: The provider-specific identity values for this queue. Overrides: toString in class java.lang.Object
376
Using Java
QueueBrowser
QueueBrowser
public interface QueueBrowser WebSphere MQ class: MQQueueBrowser
java.lang.Object | +----com.ibm.mq.jms.MQQueueBrowser
A client uses a QueueBrowser to look at messages on a queue without removing them. Note: The WebSphere MQ class MQQueueEnumeration is used to hold the browse cursor. See also: QueueReceiver
Methods
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a QueueBrowser, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Throws: JMSException if a JMS fails to close this browser because of a JMS error. getEnumeration
public java.util.Enumeration getEnumeration() throws JMSException
Get an enumeration for browsing the current queue messages in the order that they are received. Returns: An enumeration for browsing the messages. Throws: JMSException if JMS fails to get the enumeration for this browser because of a JMS error. Note: If the browser is created for a nonexistent queue, this is not detected until the first call to getEnumeration. getMessageSelector
public java.lang.String getMessageSelector() throws JMSException
Get this queue browsers message selector expression. Returns: This queue browsers message selector. Throws: JMSException if JMS fails to get the message selector for this browser because of a JMS error.
Chapter 15. JMS interfaces and classes
377
QueueBrowser
getQueue
public Queue getQueue() throws JMSException
Get the queue associated with this queue browser. Returns: The queue. Throws: JMSException if JMS fails to get the queue associated with this browser because of a JMS error.
378
Using Java
QueueConnection
QueueConnection
public interface QueueConnection extends Connection Subinterfaces: XAQueueConnection WebSphere MQ class: MQQueueConnection
java.lang.Object | +----com.ibm.mq.jms.MQConnection | +----com.ibm.mq.jms.MQQueueConnection
A QueueConnection is an active connection to a JMS point-to-point provider. A client uses a QueueConnection to create one or more QueueSessions for producing and consuming messages. See also: Connection, QueueConnectionFactory, and XAQueueConnection
Methods
close *
public void close() throws JMSException
Create a connection consumer for this connection. This is an expert facility that is not used by regular JMS clients. Parameters: v queue: the queue to access. v messageSelector: only messages with properties that match the message selector expression are delivered. v sessionPool: the server session pool to associate with this connection consumer. v maxMessages: the maximum number of messages that can be assigned to a server session at one time. Returns: The connection consumer. Throws: v JMSException if the JMS connection fails to create a connection consumer because of an internal error, or incorrect arguments for sessionPool and messageSelector. v InvalidDestinationException if the queue is not valid. v InvalidSelectorException if the message selector is not valid.
379
QueueConnection
See also: ConnectionConsumer createQueueSession
public QueueSession createQueueSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a QueueSession. Parameters: v transacted: if true, the session is transacted. v acknowledgeMode: indicates whether the consumer or the client acknowledges any messages it receives. Possible values are: Session.AUTO_ACKNOWLEDGE Session.CLIENT_ACKNOWLEDGE Session.DUPS_OK_ACKNOWLEDGE This parameter is ignored if the session is transacted. Returns: A newly-created queue session. Throws: JMSException if JMS Connection fails to create a session because of an internal error, or lack of support for specific transaction and acknowledgement mode.
380
Using Java
QueueConnectionFactory
QueueConnectionFactory
public interface QueueConnectionFactory extends ConnectionFactory Subinterfaces: XAQueueConnectionFactory WebSphere MQ class: MQQueueConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQConnectionFactory | +----com.ibm.mq.jms.MQQueueConnectionFactory
A client uses a QueueConnectionFactory to create QueueConnections with a JMS point-to-point provider. See also: ConnectionFactory and XAQueueConnectionFactory
WebSphere MQ constructor
MQQueueConnectionFactory
public MQQueueConnectionFactory()
Methods
createQueueConnection
public QueueConnection createQueueConnection() throws JMSException
Create a queue connection with default user identity. The connection is created in stopped mode. No messages are delivered until Connection.start method is explicitly called. Returns: A newly-created queue connection. Throws: v JMSException if JMS provider fails to create queue connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password. createQueueConnection
public QueueConnection createQueueConnection (java.lang.String userName, java.lang.String password) throws JMSException
Create a queue connection with specified user identity. Note: Use this method only with transport type JMSC.MQJMS_TP_CLIENT_MQ_TCPIP (see ConnectionFactory). The connection is created in stopped mode. No messages are delivered until Connection.start method is explicitly called. Parameters: v userName: the callers user name.
Chapter 15. JMS interfaces and classes
381
QueueConnectionFactory
v password: the callers password. Returns: A newly-created queue connection. Throws: v JMSException if JMS Provider fails to create queue connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password. getMessageRetention *
public int getMessageRetention()
Get method for messageRetention attribute. Returns: v JMSC.MQJMS_MRET_YES: unwanted messages remain on the input queue. v JMSC.MQJMS_MRET_NO: unwanted messages are dealt with according to their disposition options. getReference *
public Reference getReference() throws NamingException
Return a reference for this queue connection factory. Returns: A reference for this object. Throws: NamingException. getTemporaryModel *
public String getTemporaryModel()
| | | | | | |
getTempQPrefix *
public String getTempQPrefix()
Get the prefix that is used to form the name of a WebSphere MQ dynamic queue. Returns: The prefix that is used to form the name of a WebSphere MQ dynamic queue. setMessageRetention *
public void setMessageRetention(int x) throws JMSException
Set method for messageRetention attribute. Parameters: Valid values are: v JMSC.MQJMS_MRET_YES: unwanted messages remain on the input queue. v JMSC.MQJMS_MRET_NO: unwanted messages are dealt with according to their disposition options. For more information on this, see General principles for point-to-point messaging on page 278.
382
Using Java
QueueConnectionFactory
setTemporaryModel *
public void setTemporaryModel(String x) throws JMSException
| | | | | | | | | |
setTempQPrefix *
public void setTempQPrefix(java.lang.String tempQPrefix) throws JMSException
Set the prefix to be used to form the name of a WebSphere MQ dynamic queue. Parameters: tempQPrefix: the prefix to be used to form the name of a WebSphere MQ dynamic queue. Throws: JMSException if the string is null, empty, greater than 33 characters in length, or consists solely of a single asterisk (*).
383
QueueReceiver
QueueReceiver
public interface QueueReceiver extends MessageConsumer WebSphere MQ class: MQQueueReceiver
java.lang.Object | +----com.ibm.mq.jms.MQMessageConsumer | +----com.ibm.mq.jms.MQQueueReceiver
A client uses a QueueReceiver to receive messages that have been delivered to a queue. See also: MessageConsumer This class inherits the following methods from MQMessageConsumer. v receive v receiveNoWait v close v getMessageListener v setMessageListener
Methods
getQueue
public Queue getQueue() throws JMSException
Get the queue associated with this queue receiver. Returns: The queue. Throws: JMSException if JMS fails to get queue for this queue receiver because of an internal error.
384
Using Java
QueueRequestor
QueueRequestor
public class QueueRequestor extends java.lang.Object
java.lang.Object | +----javax.jms.QueueRequestor
The QueueRequestor helper class simplifies making service requests. The QueueRequestor constructor is given a non-transacted QueueSession and a destination Queue. It creates a TemporaryQueue for the responses, and provides a request() method that sends the request message and waits for its reply. Users are free to create more sophisticated versions. See also: TopicRequestor
Constructors
QueueRequestor
public QueueRequestor(QueueSession session, Queue queue) throws JMSException
This implementation assumes that the session parameter is non-transacted and either AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE. Parameters: v session: the queue session the queue belongs to. v queue: the queue to perform the request/reply call on. Throws: JMSException if a JMS error occurs.
Methods
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a QueueRequestor, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Note: This method closes the session object passed to the QueueRequestor constructor. Throws: JMSException if a JMS error occurs. request
public Message request(Message message) throws JMSException
Send a request and wait for a reply. The temporary queue is used for replyTo, and only one reply is expected for each request.
385
QueueRequestor
Parameters: message: the message to send. Returns: The reply message. Throws: JMSException if a JMS error occurs.
386
Using Java
QueueSender
QueueSender
public interface QueueSender extends MessageProducer WebSphere MQ class: MQQueueSender
java.lang.Object | +----com.ibm.mq.jms.MQMessageProducer | +----com.ibm.mq.jms.MQQueueSender
A client uses a QueueSender to send messages to a queue. A QueueSender is normally associated with a particular queue. However, it is possible to create an unidentified QueueSender that is not associated with any given queue. See also: MessageProducer
Methods
close *
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a QueueSender, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Throws: JMSException if JMS fails to close the producer because of some error. Overrides: Close in class MQMessageProducer. getQueue
public Queue getQueue() throws JMSException
Get the queue associated with this queue sender. Returns: The queue. Throws: JMSException if JMS fails to get the queue for this queue sender because of an internal error.
387
QueueSender
send
public void send(Message message) throws JMSException
Send a message to the queue. Use the QueueSenders default delivery mode, time-to-live, and priority. Parameters: message: the message to be sent. Throws: v JMSException if JMS fails to send the message because of an error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a queue sender with a non valid queue. send
public void send(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Send a message specifying delivery mode, priority, and time-to-live to the queue. Parameters: v message: the message to be sent. v deliveryMode: the delivery mode to use. v priority: the priority for this message. v timeToLive: the messages lifetime (in milliseconds). Throws: v JMSException if JMS fails to send the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a queue sender with a non valid queue. send
public void send(Queue queue, Message message) throws JMSException
Send a message to the specified queue with the QueueSenders default delivery mode, time-to-live, and priority. Note: This method can be used only with unidentified QueueSenders. Parameters: v queue:- the queue that this message should be sent to. v message: the message to be sent. Throws: v JMSException if JMS fails to send the message because of an internal error. v MessageFormatException if a non valid message is specified.
388
Using Java
QueueSender
v InvalidDestinationException if a client uses this method with a non valid queue. send
public void send(Queue queue, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Send a message to the specified queue with delivery mode, priority, and time-to-live. Note: This method can be used only with unidentified QueueSenders. Parameters: v queue: the queue that this message should be sent to. v message: the message to be sent. v deliveryMode: the delivery mode to use. v priority: the priority for this message. v timeToLive: the messages lifetime (in milliseconds). Throws: v JMSException if JMS fails to send the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a non valid queue.
389
QueueSession
QueueSession
public interface QueueSession extends Session WebSphere MQ class: MQQueueSession
java.lang.Object | +----com.ibm.mq.jms.MQSession | +----com.ibm.mq.jms.MQQueueSession
A QueueSession provides methods to create QueueReceivers, QueueSenders, QueueBrowsers, and TemporaryQueues. See also: Session The following methods are inherited from MQSession: v close v commit v rollback v recover
Methods
createBrowser
public QueueBrowser createBrowser(Queue queue) throws JMSException
Create a QueueBrowser to peek at the messages on the specified queue. Parameters: queue: the queue to access. Throws: v JMSException if a session fails to create a browser because of a JMS error. v InvalidDestinationException if a non valid queue is specified. createBrowser
public QueueBrowser createBrowser(Queue queue, java.lang.String messageSelector) throws JMSException
Create a QueueBrowser to peek at the messages on the specified queue. Parameters: v queue: the queue to access. v messageSelector: only deliver messages with properties that match the message selector expression. Throws: v JMSException if a session fails to create a browser because of a JMS error. v InvalidDestinationException if a non valid queue is specified. v InvalidSelectorException if the message selector is not valid.
390
Using Java
QueueSession
createQueue
public Queue createQueue(java.lang.String queueName) throws JMSException
Create a queue with a queue name. This allows the creation of a queue with a provider-specific name. The string takes a URI format, as described on page 204. Note: Clients that depend on this ability are not portable. Parameters: queueName: the name of this queue. Returns: A queue with the given name. Throws: JMSException if a session fails to create a queue because of a JMS error. createReceiver
public QueueReceiver createReceiver(Queue queue) throws JMSException
Create a QueueReceiver to receive messages from the specified queue. Parameters: queue: the queue to access. Throws: v JMSException if a session fails to create a receiver because of a JMS error. v InvalidDestinationException if a non valid queue is specified. createReceiver
public QueueReceiver createReceiver(Queue queue, java.lang.String messageSelector) throws JMSException
Create a QueueReceiver to receive messages from the specified queue. Parameters: v queue: the queue to access. v messageSelector: only messages with properties that match the message selector expression are delivered. Throws: v JMSException if a session fails to create a receiver because of a JMS error. v InvalidDestinationException if a non valid queue is specified. v InvalidSelectorException if the message selector is not valid. createSender
public QueueSender createSender(Queue queue) throws JMSException
391
QueueSession
Parameters: queue: the queue to access, or null if this is to be an unidentified producer. Throws: v JMSException if a session fails to create a sender because of a JMS error. v InvalidDestinationException if a non valid queue is specified. createTemporaryQueue
public TemporaryQueue createTemporaryQueue() throws JMSException
Create a temporary queue. Its lifetime is that of the QueueConnection unless deleted earlier. Returns: A temporary queue. Throws: JMSException if a session fails to create a temporary queue because of a JMS error.
392
Using Java
Session
Session
public interface Session extends java.lang.Runnable Subinterfaces: QueueSession, TopicSession, XAQueueSession, XASession, and XATopicSession WebSphere MQ class: MQSession
java.lang.Object | +----com.ibm.mq.jms.MQSession
A JMS session is a single-threaded context for producing and consuming messages. See also: QueueSession, TopicSession, and XASession
Fields
AUTO_ACKNOWLEDGE
public static final int AUTO_ACKNOWLEDGE
With this acknowledgement mode, the session automatically acknowledges a message when it has either successfully returned from a call to receive, or the message listener it has called to process the message successfully returns. CLIENT_ACKNOWLEDGE
public static final int CLIENT_ACKNOWLEDGE
With this acknowledgement mode, the client acknowledges a message by calling a messages acknowledge method. DUPS_OK_ACKNOWLEDGE
public static final int DUPS_OK_ACKNOWLEDGE
This acknowledgement mode instructs the session to acknowledge the delivery of messages lazily. | | | | SESSION_TRANSACTED
public static final int SESSION_TRANSACTED
The method getAcknowledgeMode returns this value if the session is transacted and ignores the acknowledgement mode.
Methods
393
Session
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a session, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Closing a transacted session rolls back any in-progress transaction. Closing a session automatically closes its message producers and consumer, so there is no need to close them individually. Throws: JMSException if the JMS implementation fails to close a session because of an internal error. commit
public void commit() throws JMSException
Commit all messages done in this transaction and release any locks currently held.
WebSphere MQ Event Broker note This always throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Throws: v JMSException if JMS fails to commit the transaction because of an internal JMS error. v TransactionRolledBackException if the transaction gets rolled back because of an internal error during commit. v IllegalStateException if the method is not called by a transacted session. createBrowser (JMS 1.1 only)
public QueueBrowser createBrowser(Queue queue) throws JMSException
| | | | | | | | | | |
Create a queue browser to browse the messages on the specified queue. Parameters: queue: the queue to access. Throws: v JMSException if the session fails to create a queue browser because of an internal JMS error. v InvalidDestinationException if the destination is not valid.
394
Using Java
Session
| | | | | | | | | | | | | | | | | createBrowser (JMS 1.1 only)
public QueueBrowser createBrowser(Queue queue, java.lang.String messageSelector) throws JMSException
Create a queue browser to browse the messages on the specified queue using a message selector. Parameters: v queue: the queue to access. v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. Throws: v JMSException if the session fails to create a queue browser because of an internal JMS error. v InvalidDestinationException if the destination is not valid. v InvalidSelectorException if the message selector is not valid. createBytesMessage
public BytesMessage createBytesMessage() throws JMSException
Create a BytesMessage. A BytesMessage is used to send a message containing a stream of uninterpreted bytes. Throws: JMSException if JMS fails to create this message because of an internal error. | | | | | | | | | | | | | | createConsumer (JMS 1.1 only)
public MessageConsumer createConsumer(Destination destination) throws JMSException
Create a message consumer for the specified destination. Because Queue and Topic both inherit from Destination, they can be used in the destination parameter to create a message consumer. A client uses a message consumer object to receive messages that are sent to a destination. Parameters: destination: the destination to access. Throws: v JMSException if the session fails to create a message consumer because of an internal JMS error. v InvalidDestinationException if the destination is not valid.
395
Session
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | createConsumer (JMS 1.1 only)
public MessageConsumer createConsumer(Destination destination, java.lang.String messageSelector) throws JMSException
Create a message consumer for the specified destination using a message selector. Because Queue and Topic both inherit from Destination, they can be used in the destination parameter to create a message consumer. A client uses a message consumer object to receive messages that are sent to a destination. Parameters: v destination: the destination to access. v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. Throws: v JMSException if the session fails to create a message consumer because of an internal JMS error. v InvalidDestinationException if the destination is not valid. v InvalidSelectorException if the message selector is not valid. createConsumer (JMS 1.1 only)
public MessageConsumer createConsumer(Destination destination, java.lang.String messageSelector, boolean NoLocal) throws JMSException
Create a message consumer for the specified destination using a message selector. Because Queue and Topic both inherit from Destination, they can be used in the destination parameter to create a message consumer. If the destination is a topic, you can use this method to specify whether the consumer can receive messages published by its own connection. A client uses a message consumer to receive messages that are published to a destination. A connection can publish and subscribe to the same topic. The NoLocal attribute of a consumer determines whether the consumer can receive messages published by its own connection. The default value of the attribute is false. Parameters: v destination: the destination to access. v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. v NoLocal: if true, the consumer does not receive the messages published by its own connection. The action of this parameter is defined only if the destination is a topic, not a queue. Throws: v JMSException if the session fails to create a message consumer because of an internal JMS error.
396
Using Java
Session
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | v InvalidDestinationException if the destination is not valid. v InvalidSelectorException if the message selector is not valid. createDurableSubscriber (JMS 1.1 only)
public TopicSubscriber createDurableSubscriber(Topic topic, java.lang.String name) throws JMSException
Create a durable subscriber to the specified topic. If a client needs to receive all the messages published on a topic, including the ones published while the subscriber is inactive, it uses a durable topic subscriber. The broker retains a record of this durable subscription and ensures that all messages from the publishers of the topic are retained until they are acknowledged by this durable subscriber or they expire. Sessions with durable subscribers must always provide the same client identifier. In addition, each client must specify a name that uniquely identifies, within the client identifier, each durable subscription it creates. Only one session at a time can have a topic subscriber for a particular durable subscription. A client can change an existing durable subscription by creating a durable topic subscriber with the same name, but with a new topic or message selector or both. Changing a durable subscriber is equivalent to unsubscribing the old one and creating a new one. Parameters: v topic: the topic to subscribe to. The topic must not be a temporary topic. v name: the name used to identify the subscription. Throws: v JMSException if the session fails to create a subscriber because of an internal JMS error. v InvalidDestinationException if the topic is not valid. createDurableSubscriber (JMS 1.1 only)
public TopicSubscriber createDurableSubscriber (Topic topic, java.lang.String name, java.lang.String messageSelector, boolean noLocal) throws JMSException
Create a durable subscriber to the specified topic, using a message selector and specifying whether the subscriber can receive messages published by its own connection. If a client needs to receive all the messages published on a topic, including the ones published while the subscriber is inactive, it uses a durable topic subscriber. The broker retains a record of this durable subscription and ensures that all messages from the publishers of the topic are retained until they are acknowledged by this durable subscriber or they expire. Sessions with durable subscribers must always provide the same client identifier. In addition, each client must specify a name which uniquely identifies, within the client identifier, each durable subscription it creates.
Chapter 15. JMS interfaces and classes
397
Session
| | | | | | | | | | | | | | | | | | | | | | | | | | Only one session at a time can have a topic subscriber for a particular durable subscription. An inactive durable subscriber is one that exists but does not currently have a message consumer associated with it. A client can change an existing durable subscription by creating a durable topic subscriber with the same name, but with a new topic or message selector or both. Changing a durable subscriber is equivalent to unsubscribing the old one and creating a new one. A connection can publish and subscribe to the same topic. The NoLocal attribute of a subscriber determines whether the subscriber can receive messages published by its own connection. The default value of the attribute is false. Parameters: v topic: the topic to subscribe to. The topic must not be a temporary topic. v name: the name used to identify the subscription. v messageSelector: deliver only those messages with properties that match the message selector expression. A value of null or an empty string indicates that there is no message selector for the message consumer. v noLocal: if true, the subscriber does not receive the messages published by its own connection. Throws: v JMSException if the session fails to create a subscriber because of an internal JMS error. v InvalidDestinationException if the topic is not valid. v InvalidSelectorException if the message selector is not valid. createMapMessage
public MapMessage createMapMessage() throws JMSException
Create a MapMessage. A MapMessage is used to send a self-defining set of name-value pairs, where names are strings, and values are Java primitive types. Throws: JMSException if JMS fails to create this message because of an internal error. createMessage
public Message createMessage() throws JMSException
Create a message. The Message interface is the root interface of all JMS messages. It holds all the standard message header information. It can be sent when a message containing only header information is sufficient. Throws: JMSException if JMS fails to create this message because of an internal error.
398
Using Java
Session
createObjectMessage
public ObjectMessage createObjectMessage() throws JMSException
Create an ObjectMessage. An ObjectMessage is used to send a message that contains a serializable Java object. Throws: JMSException if JMS fails to create this message because of an internal error. createObjectMessage
public ObjectMessage createObjectMessage (java.io.Serializable object) throws JMSException
Create an initialized ObjectMessage. An ObjectMessage is used to send a message that contains a serializable Java object. Parameters: object: the object to use to initialize this message. Throws: JMSException if JMS fails to create this message because of an internal error. | | | | | | | | | | | | | | | | | | | | | | | | | createProducer (JMS 1.1 only)
public MessageProducer createProducer(Destination destination) throws JMSException
Create a message producer to send messages to the specified destination. Because Queue and Topic both inherit from Destination, they can be used in the destination parameter to create a message producer. Parameters: destination: the destination to send messages to, or null to create a message producer that does not have a specified destination. Throws: v JMSException if the session fails to create a message producer because of an internal JMS error. v InvalidDestinationException if the destination is not valid. createQueue (JMS 1.1 only)
public Queue createQueue(java.lang.String queueName) throws JMSException
Create a Queue object given a queue name. The queue name can be the name of a WebSphere MQ queue or it can be a queue URI. For information about URI format, see Destinations on page 239. This method is provided for the rare cases where a client needs to work directly with a Queue object. The client can create the Queue object with a provider specific name. Clients that depend on this ability are not portable. The method does not create the WebSphere MQ queue. Creating a WebSphere MQ queue is an administrative task and is not done through the JMS API. The one exception is creating a temporary queue, which is done using the createTemporaryQueue() method.
399
Session
| | | | | | | Parameters: queueName: the name of the queue. Returns: A Queue object with the specified name. Throws: JMSException if the session fails to create a queue because of an internal JMS error. createStreamMessage
public StreamMessage createStreamMessage() throws JMSException
Create a StreamMessage. A StreamMessage is used to send a self-defining stream of Java primitives. Throws: JMSException if JMS fails to create this message because of an internal error. | | | | | | | | | | | | | | | | | | createTemporaryQueue (JMS 1.1 only)
public TemporaryQueue createTemporaryQueue() throws JMSException
Create a TemporaryQueue object. The temporary queue remains until the connection ends or the queue is explicitly deleted, whichever is the sooner. Returns: A TemporaryQueue object. Throws: JMSException if the session fails to create a temporary queue because of an internal JMS error. createTemporaryTopic (JMS 1.1 only)
public TemporaryTopic createTemporaryTopic() throws JMSException
Create a TemporaryTopic object. The temporary topic remains until the connection ends or the topic is explicitly deleted, whichever is the sooner. Returns: A TemporaryTopic object. Throws: JMSException if the session fails to create a temporary topic because of an internal JMS error. createTextMessage
public TextMessage createTextMessage() throws JMSException
Create a TextMessage. A TextMessage is used to send a message containing a string. Throws: JMSException if JMS fails to create this message because of an internal error.
400
Using Java
Session
createTextMessage
public TextMessage createTextMessage (java.lang.String string) throws JMSException
Create an initialized TextMessage. A TextMessage is used to send a message containing a string. Parameters: string: the string used to initialize this message. Throws: JMSException if JMS fails to create this message because of an internal error. | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | createTopic (JMS 1.1 only)
public Topic createTopic(java.lang.String topicName) throws JMSException
Create a Topic object given a topic name. The topic name can be the name of a broker topic or it can be a topic URI. For information about URI format, see Destinations on page 239. This method is provided for the rare cases where a client needs to work directly with a Topic object. The client can create the Topic object with a provider specific name. Clients that depend on this ability are not portable. This method does not create the broker topic. Creating a broker topic is an administrative task and is not done through the JMS API. The one exception is creating a temporary topic, which is done using the createTemporaryTopic() method. Parameters: topicName: the name of the topic. Returns: A Topic object with the specified name. Throws: JMSException if the session fails to create a topic because of an internal JMS error. getAcknowledgeMode (JMS 1.1 only)
public int getAcknowledgeMode() throws JMSException
Return the acknowledgement mode for the session. The acknowledgement mode is specified when the session is created. A session that is transacted has no acknowledgement mode. Returns: The acknowledgement mode for the session, provided the session is not transacted. If the session is transacted, the method returns SESSION_TRANSACTED. Throws: JMSException if JMS fails to return the acknowledgment mode because of an internal JMS error. See also: Connection.createSession
401
Session
getMessageListener
public MessageListener getMessageListener() throws JMSException
Return the sessions distinguished message listener. Returns: The message listener associated with this session. Throws: JMSException if JMS fails to get the message listener because of an internal JMS error. See also: setMessageListener getTransacted
public boolean getTransacted() throws JMSException
WebSphere MQ Event Broker note This method always returns false when you have a direct connection to WebSphere MQ Event Broker. Returns: True if the session is in transacted mode. Throws: JMSException if JMS fails to return the transaction mode because of an internal error in JMS Provider. recover
public void recover() throws JMSException
Stop the delivery of messages in this session, and restart the sending messages with the oldest unacknowledged message.
WebSphere MQ Event Broker note This always throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Throws: v JMSException if JMS fails to stop the delivery of messages and restart the sending messages because of an internal JMS error. v IllegalStateException if the method is called by a transacted session.
| |
402
Using Java
Session
rollback
public void rollback() throws JMSException
Roll back any messages done in this transaction and release any locks currently held.
WebSphere MQ Event Broker note This always throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Throws: v JMSException if JMS fails to roll back the transaction because of an internal JMS error. | | run
public void run()
WebSphere MQ Event Broker note This always throws an IllegalStateException when you have a direct connection to WebSphere MQ Event Broker. Specified by: run in the interface java.lang.Runnable See also: ServerSession setMessageListener
public void setMessageListener(MessageListener listener) throws JMSException
Set the sessions distinguished message listener. When it is set, no other form of message receipt in the session can be used. However, all forms of sending messages are still supported. This is an expert facility that is not used by regular JMS clients. Parameters: listener: the message listener to associate with this session. Throws: JMSException if JMS fails to set the message listener because of an internal error in the JMS Provider. See also: getMessageListener
403
Session
| | | | | | | | | | | | | | | | | | | | | | | unsubscribe (JMS 1.1 only)
public void unsubscribe(java.lang.String name) throws JMSException
Unsubscribe a durable subscription that has been created by a client. This method tells the broker that the durable subscription has ended and not to send any more messages to the subscriber. It is not advisable for a client to delete a durable subscription while there is an active message consumer for the subscription, or while a consumed message is part of a pending transaction or has not been acknowledged in the session.
Note For a direct connection to WebSphere MQ Event Broker, WebSphere Business Integration Event Broker, or WebSphere Business Integration Message Broker, this method throws a JMSException. Parameters: name: the name used to identify the subscription. Throws: v JMSException if the session fails to remove the durable subscription because of an internal JMS error. v InvalidDestinationException if the subscription name is not valid.
404
Using Java
StreamMessage
StreamMessage
public interface StreamMessage extends Message WebSphere MQ class: JMSStreamMessage
java.lang.Object | +----com.ibm.jms.JMSMessage | +----com.ibm.jms.JMSStreamMessage
Use a StreamMessage to send a stream of Java primitives. See also: BytesMessage, MapMessage, Message, ObjectMessage and TextMessage
Methods
readBoolean
public boolean readBoolean() throws JMSException
Read a boolean from the stream message. Returns: The boolean value read. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readByte
public byte readByte() throws JMSException
Read a byte value from the stream message. Returns: The next byte from the stream message as an 8-bit byte. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode.
405
StreamMessage
readBytes
public int readBytes(byte[] value) throws JMSExceptioneam message.
Read a byte array field from the stream message into the specified byte[] object (the read buffer). If the buffer size is less than, or equal to, the size of the data in the message field, an application must make further calls to this method to retrieve the remainder of the data. Once the first readBytes call on a byte[] field value has been done, the full value of the field must be read before it is valid to read the next field. An attempt to read the next field before that has been done throws a MessageFormatException. Parameters: value: the buffer into which the data is read. Returns: The total number of bytes read into the buffer, or -1 if there is no more data because the end of the byte field has been reached. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readChar
public char readChar() throws JMSException
Read a Unicode character value from the stream message. Returns: A Unicode character from the stream message. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readDouble
public double readDouble() throws JMSException
Read a double from the stream message. Returns: A double value from the stream message. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid.
406
Using Java
StreamMessage
v MessageNotReadableException if the message is in write-only mode. readFloat
public float readFloat() throws JMSException
Read a float from the stream message. Returns: A float value from the stream message. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readInt
public int readInt() throws JMSException
Read a 32-bit integer from the stream message. Returns: A 32-bit integer value from the stream message, interpreted as an int. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readLong
public long readLong() throws JMSException
Read a 64-bit integer from the stream message. Returns: A 64-bit integer value from the stream message, interpreted as a long. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode.
407
StreamMessage
readObject
public java.lang.Object readObject() throws JMSException
Read a Java object from the stream message. Returns: A Java object from the stream message in object format (for example, if it was set as an int, an integer is returned). Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v NotReadableException if the message is in write-only mode. readShort
public short readShort() throws JMSException
Read a 16-bit number from the stream message. Returns: A 16-bit number from the stream message. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode. readString
public java.lang.String readString() throws JMSException
Read in a string from the stream message. Returns: A Unicode string from the stream message. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageEOFException if an end of message stream is received. v MessageFormatException if this type conversion is not valid. v MessageNotReadableException if the message is in write-only mode
408
Using Java
StreamMessage
reset
public void reset() throws JMSException
Put the message in read-only mode, and reposition the stream to the beginning. Throws: v JMSException if JMS fails to reset the message because of an internal JMS error. v MessageFormatException if the message has an non valid format. writeBoolean
public void writeBoolean(boolean value) throws JMSException
Write a boolean to the stream message. Parameters: value: the boolean value to be written. Throws: v JMSException if JMS fails to read the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeByte
public void writeByte(byte value) throws JMSException
Write a byte to the stream message. Parameters: value: the byte value to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeBytes
public void writeBytes(byte[] value) throws JMSException
Write a byte array to the stream message. Parameters: value: the byte array to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode.
409
StreamMessage
writeBytes
public void writeBytes(byte[] value, int offset, int length) throws JMSException
Write a portion of a byte array to the stream message. Parameters: v value: the byte array value to be written. v offset: the initial offset within the byte array. v length: the number of bytes to use. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeChar
public void writeChar(char value) throws JMSException
Write a character to the stream message. Parameters: value: the character value to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeDouble
public void writeDouble(double value) throws JMSException
Write a double to the stream message. Parameters: value: the double value to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeFloat
public void writeFloat(float value) throws JMSException
Write a float to the stream message. Parameters: value: the float value to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error.
410
Using Java
StreamMessage
v MessageNotWriteableException if the message is in read-only mode. writeInt
public void writeInt(int value) throws JMSException
Write an integer to the stream message. Parameters: value: the integer to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeLong
public void writeLong(long value) throws JMSException
Write a long to the stream message. Parameters: value: the long to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeObject
public void writeObject(java.lang.Object value) throws JMSException
Write a Java object to the stream message. This method works only for object primitive types (for example, Integer, Double, Long), strings, and byte arrays. Parameters: value: the Java object to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. v MessageFormatException if the object is not valid.
411
StreamMessage
writeShort
public void writeShort(short value) throws JMSException
Write a short to the stream message. Parameters: value: the short to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode. writeString
public void writeString(java.lang.String value) throws JMSException
Write a string to the stream message. Parameters: value: the string value to be written. Throws: v JMSException if JMS fails to write the message because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode.
412
Using Java
TemporaryQueue
TemporaryQueue
public interface TemporaryQueue extends Queue WebSphere MQ class: MQTemporaryQueue
java.lang.Object | +----com.ibm.mq.jms.MQDestination | +----com.ibm.mq.jms.MQQueue | +----com.ibm.mq.jms.MQTemporaryQueue
A TemporaryQueue is a unique queue object that is created for the duration of a QueueConnection.
Methods
delete
public void delete() throws JMSException
Delete this temporary queue. If there are still existing senders or receivers using it, a JMSException is thrown. Throws: JMSException if JMS implementation fails to delete a TemporaryQueue because of an internal error.
413
TemporaryTopic
TemporaryTopic
public interface TemporaryTopic extends Topic WebSphere MQ class: MQTemporaryTopic
java.lang.Object | +----com.ibm.mq.jms.MQDestination | +----com.ibm.mq.jms.MQTopic | +----com.ibm.mq.jms.MQTemporaryTopic
A TemporaryTopic is a unique topic object created for the duration of a TopicConnection and can be consumed only by consumers of that connection.
WebSphere MQ constructor
MQTemporaryTopic
MQTemporaryTopic() throws JMSException
Methods
delete
public void delete() throws JMSException
Delete this temporary topic. If there are still existing publishers or subscribers using it, a JMSException is thrown. Throws: JMSException if JMS implementation fails to delete a TemporaryTopic because of an internal error.
414
Using Java
TextMessage
TextMessage
public interface TextMessage extends Message WebSphere MQ class: JMSTextMessage
java.lang.Object | +----com.ibm.jms.JMSMessage | +----com.ibm.jms.JMSTextMessage
Use TextMessage to send a message containing a java.lang.String. It inherits from Message and adds a text message body. See also: BytesMessage, MapMessage, Message, ObjectMessage and StreamMessage
Methods
getText
public java.lang.String getText() throws JMSException
Get the string containing this messages data. The default value is null. Returns: The string containing the messages data. Throws: JMSException if JMS fails to get the text because of an internal JMS error. setText
public void setText(java.lang.String string) throws JMSException
Set the string containing this messages data. Parameters: string: the string containing the messages data. Throws: v JMSException if JMS fails to set text because of an internal JMS error. v MessageNotWriteableException if the message is in read-only mode.
415
Topic
Topic
public interface Topic extends Destination Subinterfaces: TemporaryTopic WebSphere MQ class: MQTopic
java.lang.Object | +----com.ibm.mq.jms.MQDestination | +----com.ibm.mq.jms.MQTopic
A Topic object encapsulates a provider-specific topic name. It is the way that a client specifies the identity of a topic to JMS methods.
WebSphere MQ Event Broker note For direct connections to WebSphere MQ Event Broker, properties accessed by methods marked with a are ignored. See also: Destination
WebSphere MQ constructor
MQTopic
public MQTopic() public MQTopic(string URItopic)
See TopicSession.createTopic.
Methods
getBaseTopicName *
public String getBaseTopicName()
Get method for brokerCCDurSubQueue attribute. Returns: The name of the durable subscription queue (the brokerCCDurSubQueue) to use for a ConnectionConsumer.
416
Using Java
Topic
getBrokerDurSubQueue *
public String getBrokerDurSubQueue()
Get method for brokerDurSubQueue attribute. Returns: The name of the durable subscription queue (the brokerDurSubQueue) to use. getBrokerVersion *
public int getBrokerVersion()
Get method for brokerVersion attribute. Returns: The brokers version number | | | | | | | getMulticast *
public int getMulticast()
Get method for the multicast attribute. Returns: An integer representing the current multicast setting. See also: setMulticast() getReference *
public Reference getReference()
Create a reference for this topic. Returns: A reference for this object. Throws: NamingException. getTopicName
public java.lang.String getTopicName() throws JMSException
| |
Get the name of this topic in URI format. (URI format is described in Creating topics at runtime on page 223. For information specific to JMS 1.1, see Destinations on page 239.) Note: Clients that depend upon the name are not portable. Returns: The topic name. Throws: JMSException if JMS implementation for topic fails to return the topic name because of an internal error.
417
Topic
setBaseTopicName *
public void setBaseTopicName(String x)
Set method for brokerCCDurSubQueue attribute. Parameters: brokerCCDurSubQueue: the name of the durable subscription queue to use for a ConnectionConsumer. setBrokerDurSubQueue *
public void setBrokerDurSubQueue(String x) throws JMSException
Set method for brokerDurSubQueue attribute. Parameters: brokerDurSubQueue: the name of the durable subscription queue to use. setBrokerVersion *
public void setBrokerVersion(int x) throws JMSException
Set method for brokerVersion attribute. Parameters: An integer representing one of the valid broker version number values. These are represented by the constants:
JMSC.MQJMS_BROKER_V1 JMSC.MQJMS_BROKER_V2
| | | | | | | | | | | | | |
setMulticast *
public void setMulticast(int x) throws JMSException
Set method for the multicast attribute. Parameters: x: an integer specifying a multicast setting. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_MULTICAST_AS_CF JMSC.MQJMS_MULTICAST_DISABLED JMSC.MQJMS_MULTICAST_NOT_RELIABLE JMSC.MQJMS_MULTICAST_RELIABLE JMSC.MQJMS_MULTICAST_ENABLED Throws: JMSException if the parameter does not represent a valid multicast setting.
418
Using Java
Topic
toString
public String toString()
Return a well-formatted printed version of the topic name. Returns: The provider-specific identity values for this topic. Overrides: toString in class Object.
419
TopicConnection
TopicConnection
public interface TopicConnection extends Connection Subinterfaces: XATopicConnection WebSphere MQ class: MQTopicConnection
java.lang.Object | +----com.ibm.mq.jms.MQConnection | +----com.ibm.mq.jms.MQTopicConnection
A TopicConnection is an active connection to a JMS publish/subscribe provider. See also: Connection, TopicConnectionFactory, and XATopicConnection
Methods
createConnectionConsumer
public ConnectionConsumer createConnectionConsumer (Topic topic, java.lang.String messageSelector, ServerSessionPool sessionPool, int maxMessages) throws JMSException
Create a connection consumer for this connection. This is an expert facility that is not used by regular JMS clients.
WebSphere MQ Event Broker note For a direct connection to WebSphere MQ Event Broker, this method throws a JMSException. Parameters: v topic: the topic to access. v messageSelector: only deliver messages with properties that match the message selector expression. v sessionPool: the server session pool to associate with this connection consumer. v maxMessages: the maximum number of messages that can be assigned to a server session at one time. Returns: The connection consumer. Throws: v JMSException if the JMS Connection fails to create a connection consumer because of an internal error, or because of incorrect arguments for sessionPool. v InvalidDestinationException if the topic is not valid. v InvalidSelectorException if the message selector is not valid. See also: ConnectionConsumer
420
Using Java
TopicConnection
createDurableConnectionConsumer
public ConnectionConsumer createDurableConnectionConsumer (Topic topic, java.lang.String subscriptionName java.lang.String messageSelector, ServerSessionPool sessionPool, int maxMessages) throws JMSException
Create a durable connection consumer for this connection. This is an expert facility that is not used by regular JMS clients.
WebSphere MQ Event Broker note For a direct connection to WebSphere MQ Event Broker, this method throws a JMSException. Parameters: v topic: the topic to access. v subscriptionName: the name of the durable subscription. v messageSelector: deliver only messages with properties that match the message selector expression. v sessionPool: the server session pool to associate with this durable connection consumer. v maxMessages: the maximum number of messages that can be assigned to a server session at one time. Returns: The durable connection consumer. Throws: v JMSException if the JMS Connection fails to create a connection consumer because of an internal error, or because of incorrect arguments for sessionPool and messageSelector. v InvalidDestinationException if the topic is not valid. v InvalidSelectorException if the message selector is not valid. See also: ConnectionConsumer createTopicSession
public TopicSession createTopicSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a TopicSession.
WebSphere MQ Event Broker note For a direct connection to WebSphere MQ Event Broker, if transacted is true, this method throws a JMSException. Parameters: v transacted: if true, the session is transacted. v acknowledgeMode: one of: Session.AUTO_ACKNOWLEDGE
Chapter 15. JMS interfaces and classes
421
TopicConnection
Session.CLIENT_ACKNOWLEDGE Session.DUPS_OK_ACKNOWLEDGE Indicates whether the consumer or the client acknowledge any messages that they receive. This parameter is ignored if the session is transacted. Returns: A newly-created topic session. Throws: JMSException if JMS Connection fails to create a session because of an internal error, or a lack of support for the specific transaction and acknowledgement mode.
422
Using Java
TopicConnectionFactory
TopicConnectionFactory
public interface TopicConnectionFactory extends ConnectionFactory Subinterfaces: XATopicConnectionFactory WebSphere MQ class: MQTopicConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQConnectionFactory | +----com.ibm.mq.jms.MQTopicConnectionFactory
| | |
Note For direct connections to WebSphere MQ Event Broker, WebSphere Business Integration Event Broker, or WebSphere Business Integration Message Broker, properties accessed by methods marked with a are ignored. See also: ConnectionFactory and XATopicConnectionFactory
WebSphere MQ constructor
MQTopicConnectionFactory
public MQTopicConnectionFactory()
Methods
createTopicConnection
public TopicConnection createTopicConnection() throws JMSException
Create a topic connection with default user identity. The connection is created in stopped mode. No messages are delivered until Connection.start method is explicitly called. Returns: A newly-created topic connection. Throws: v JMSException if JMS Provider fails to create a Topic Connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password.
423
TopicConnectionFactory
createTopicConnection
public TopicConnection createTopicConnection (java.lang.String userName, java.lang.String password) throws JMSException
Create a topic connection with specified user identity. The connection is created in stopped mode. No messages are delivered until Connection.start method is explicitly called. Parameters: v userName: the callers user name. v password: the callers password. Returns: A newly-created topic connection. Throws: v JMSException if JMS Provider fails to create a Topic Connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password. Note: This method is valid only for transport type IBM_JMS_TP_CLIENT_MQ_TCPIP. See ConnectionFactory. getBrokerCCSubQueue *
public String getBrokerCCSubQueue()
Get method for brokerCCSubQueue attribute. Returns: The name of the nondurable subscription queue to use for a connection consumer. getBrokerControlQueue *
public String getBrokerControlQueue()
Get method for brokerControlQueue attribute. Returns: The brokers control queue name getBrokerPubQueue *
public String getBrokerPubQueue()
Get method for brokerPubQueue attribute. Returns: The brokers publish queue name.
424
Using Java
TopicConnectionFactory
getBrokerQueueManager *
public String getBrokerQueueManager()
Get method for brokerQueueManager attribute. Returns: The brokers queue manager name. getBrokerSubQueue *
public String getBrokerSubQueue()
Get method for brokerSubQueue attribute. Returns: The name of the nondurable subscription queue to use. getBrokerVersion *
public int getBrokerVersion()
Get method for brokerVersion attribute. Returns: The brokers version number getCleanupInterval *
public long getCleanupInterval()
Get method for cleanupInterval attribute. Returns: How often the cleanup utility runs, in milliseconds getCleanupLevel *
public int getCleanupLevel()
Get method for cleanupLevel attribute. Returns: The value of cleanupLevel | | | | | | | getDirectAuth *
public int getDirectAuth()
Get method for the direct authentication attribute. Returns: The value of the direct authentication attribute See also: setDirectAuth()
425
TopicConnectionFactory
| | | | | | | | | | | | | | | | | | | | | | | | | getMessageSelection *
public int getMessageSelection()
Get method for the message selection attribute. Returns: The value of the message selection attribute See also: setMessageSelection() getMulticast *
public int getMulticast()
Get method for the multicast attribute. Returns: An integer representing the current multicast setting. See also: setMulticast() getProxyHostName *
public String getProxyHostName()
Get method for the proxy host name attribute. Returns: The host name of the proxy server when establishing a direct connection, or null if no proxy server is used. getProxyPort *
public int getProxyPort()
Get method for the proxy port attribute. Returns: The port number to connect to on the proxy server. getPubAckInterval *
public int getPubAckInterval()
Get method for pubAckInterval attribute. Returns: The interval, in number of messages, between publish requests that require acknowledgement from the broker. getReference *
public Reference getReference()
Return a reference for this topic connection factory. Returns: A reference for this topic connection factory. Throws: NamingException.
426
Using Java
TopicConnectionFactory
| | | | | | | getSparseSubscriptions *
public boolean getSparseSubscriptions()
Get method for the sparse subscriptions attribute. Returns: The value of the sparse subscriptions attribute See also: setSparseSubscriptions() getStatusRefreshInterval *
public int getStatusRefreshInterval()
Get method for statusRefreshInterval attribute. Returns: The number of milliseconds between transactions to refresh publish/subscribe status. getSubscriptionStore *
public int getSubscriptionStore()
Get method for the SUBSTORE property. Returns: An integer representing the current SUBSTORE property. setBrokerCCSubQueue *
public void setBrokerCCSubQueue(String x) throws JMSException
Set method for brokerCCSubQueue attribute. Parameters: brokerSubQueue: the name of the nondurable subscription queue to use for a connection consumer. setBrokerControlQueue *
public void setBrokerControlQueue(String x) throws JMSException
Set method for brokerControlQueue attribute. Parameters: brokerControlQueue: the name of the broker control queue. setBrokerPubQueue *
public void setBrokerPubQueue(String x) throws JMSException
Set method for brokerPubQueue attribute. Parameters: brokerPubQueue: the name of the broker publish queue.
427
TopicConnectionFactory
setBrokerQueueManager *
public void setBrokerQueueManager(String x) throws JMSException
Set method for brokerQueueManager attribute. Parameters: brokerQueueManager: the name of the brokers queue manager. setBrokerSubQueue *
public void setBrokerSubQueue(String x) throws JMSException
Set method for brokerSubQueue attribute. Parameters: brokerSubQueue: the name of the nondurable subscription queue to use. setBrokerVersion *
public void setBrokerVersion(int x) throws JMSException
Set method for brokerVersion attribute. Parameters: An integer representing one of the valid broker version number values. These are represented by the constants: JMSC.MQJMS_BROKER_V1 JMSC.MQJMS_BROKER_V2 setCleanupInterval *
public void setCleanupInterval(long x) throws JMSException
Set method for cleanupInterval attribute. Parameters: How often the cleanup utility runs, in milliseconds setCleanupLevel *
public void setCleanupLevel(int x) throws JMSException
Set method for cleanupLevel attribute. Parameters: An integer representing one of the valid cleanup levels. These are represented by the constants: JMSC.MQJMS_CLEANUP_NONE JMSC.MQJMS_CLEANUP_SAFE JMSC.MQJMS_CLEANUP_STRONG JMSC.MQJMS_CLEANUP_AS_PROPERTY
428
Using Java
TopicConnectionFactory
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | setDirectAuth *
public void setDirectAuth(int x) throws JMSException
Set method for the direct authentication attribute. Parameters: x: an integer specifying the type of direct authentication that is required. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_DIRECTAUTH_BASIC JMSC.MQJMS_DIRECTAUTH_CERTIFICATE setMessageSelection *
public void setMessageSelection(int x)
Set method for the message selection attribute. Parameters: x: an integer indicating whether the client or the broker performs message selection. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_MSEL_CLIENT JMSC.MQJMS_MSEL_BROKER setMulticast *
public void setMulticast(int x) throws JMSException
Set method for the multicast attribute. Parameters: x: an integer specifying a multicast setting. The following are symbolic constants that represent the valid values of the parameter: JMSC.MQJMS_MULTICAST_DISABLED JMSC.MQJMS_MULTICAST_NOT_RELIABLE JMSC.MQJMS_MULTICAST_RELIABLE JMSC.MQJMS_MULTICAST_ENABLED setProxyHostName *
public void setProxyHostName(String proxyHostName) throws JMSException
Set method for the proxy host name attribute. Parameters: proxyHostName: the host name of the proxy server when establishing a direct connection, or null if no proxy server is used. setProxyPort *
public void setProxyPort(int proxyPort) throws JMSException
Set method for the proxy port attribute. Parameters: proxyPort: the port number to connect to on the proxy server.
429
TopicConnectionFactory
setPubAckInterval *
public void setPubAckInterval(int x)
Set method for pubAckInterval attribute. The number of messages to publish between requiring acknowledgement from the broker. The default is 25. Applications do not normally alter this value, and must not rely on this acknowledgement. Parameters: pubAckInterval: the number of messages to use as an interval.
| | | | | | | | | |
setSparseSubscriptions *
public void setSparseSubscriptions(boolean x)
Set method for the sparse subscriptions attribute. A sparse subscription is one that receives infrequent matching messages. The default value of this attribute is false. A value of true might be required if an application using sparse subscriptions fails to receive messages because of log overflow. If you set the attribute to true, the application must be able to open the subscriber queue for browsing messages. Parameters: x: indicates whether sparse subscriptions are selected. setStatusRefreshInterval *
public void setStatusRefreshInterval(int x)
Set method for statusRefreshInterval attribute. Parameters: statusRefreshInterval: the number of milliseconds between transactions to refresh publish/subscribe status. setSubscriptionStore *
public void setSubscriptionStore(int x) throws JMSException
Set method for the SUBSTORE property. | | | Parameters: SubStoretype: an integer representing one of the valid values of the SUBSTORE property. The following symbolic constants represent the valid values: JMSC.MQJMS_SUBSTORE_QUEUE JMSC.MQJMS_SUBSTORE_BROKER JMSC.MQJMS_SUBSTORE_MIGRATE
430
Using Java
TopicPublisher
TopicPublisher
public interface TopicPublisher extends MessageProducer WebSphere MQ class: MQTopicPublisher
java.lang.Object | +----com.ibm.mq.jms.MQMessageProducer | +----com.ibm.mq.jms.MQTopicPublisher
A client uses a TopicPublisher for publishing messages on a topic. TopicPublisher is the publish/subscribe variant of a JMS message producer.
Methods
close *
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a TopicPublisher, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Throws: JMSException if JMS fails to close the producer because of an error. Overrides: close in class MQMessageProducer. getTopic
public Topic getTopic() throws JMSException
Get the topic associated with this publisher. Returns: This publishers topic Throws: JMSException if JMS fails to get the topic for this topic publisher because of an internal error. publish
public void publish(Message message) throws JMSException
Publish a message to the topic. Use the topics default delivery mode, time-to-live, and priority. Parameters: message: the message to publish Throws: v JMSException if JMS fails to publish the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a Topic Publisher with a non valid topic.
Chapter 15. JMS interfaces and classes
431
TopicPublisher
publish
public void publish(Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Publish a message to the topic specifying delivery mode, priority, and time-to-live to the topic.
WebSphere MQ Event Broker note If deliveryMode is PERSISTENT or timeToLive is greater than 0, this method throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Parameters: v message: the message to publish. v deliveryMode: the delivery mode to use. v priority: the priority for this message. v timeToLive: the messages lifetime (in milliseconds). Throws: v JMSException if JMS fails to publish the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a Topic Publisher with a non valid topic. publish
public void publish(Topic topic, Message message) throws JMSException
Publish a message to a topic for an unidentified message producer. Use the topics default delivery mode, time-to-live, and priority. Parameters: v topic: the topic to publish this message to. v message: the message to send. Throws: v JMSException if JMS fails to publish the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a non valid topic.
432
Using Java
TopicPublisher
publish
public void publish(Topic topic, Message message, int deliveryMode, int priority, long timeToLive) throws JMSException
Publish a mssage to a topic for an unidentified message producer, specifying delivery mode, priority, and time-to-live.
WebSphere MQ Event Broker note If deliveryMode is PERSISTENT or timeToLive is greater than 0, this method throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Parameters: v topic: the topic to publish this message to. v message: the message to send. v deliveryMode: the delivery mode to use. v priority: the priority for this message. v timeToLive: the messages lifetime (in milliseconds). Throws: v JMSException if JMS fails to publish the message because of an internal error. v MessageFormatException if a non valid message is specified. v InvalidDestinationException if a client uses this method with a non valid topic.
433
TopicRequestor
TopicRequestor
public class TopicRequestor extends java.lang.Object
java.lang.Object | +----javax.jms.TopicRequestor
JMS provides this TopicRequestor class to assist with making service requests. The TopicRequestor constructor is given a non-transacted TopicSession and a destination Topic. It creates a TemporaryTopic for the responses, and provides a request() method that sends the request message and waits for its reply. Users are free to create more sophisticated versions.
Constructors
TopicRequestor
public TopicRequestor(TopicSession session, Topic topic) throws JMSException
Constructor for the TopicRequestor class. This implementation assumes that the session parameter is non-transacted, and either AUTO_ACKNOWLEDGE or DUPS_OK_ACKNOWLEDGE. Parameters: v session: the topic session the topic belongs to. v topic: the topic to perform the request/reply call on. Throws: JMSException if a JMS error occurs.
Methods
close
public void close() throws JMSException
Because a provider can allocate some resources outside the JVM on behalf of a TopicRequestor, clients must close them when they are not needed. You cannot rely on garbage collection to reclaim these resources eventually, because this might not occur soon enough. Note: This method closes the session object passed to the TopicRequestor constructor. Throws: JMSException if a JMS error occurs. request
public Message request(Message message) throws JMSException
Send a request and wait for a reply. Parameters: message: the message to send.
434
Using Java
TopicRequestor
Returns: The reply message. Throws: JMSException if a JMS error occurs.
435
TopicSession
TopicSession
public interface TopicSession extends Session WebSphere MQ class: MQTopicSession
java.lang.Object | +----com.ibm.mq.jms.MQSession | +----com.ibm.mq.jms.MQTopicSession
A TopicSession provides methods for creating TopicPublishers, TopicSubscribers, and TemporaryTopics. See also: Session
WebSphere MQ constructor
MQTopicSession
public MQTopicSession(boolean transacted, int acknowledgeMode) throws JMSException
See TopicConnection.createTopicSession.
Methods
createDurableSubscriber
public TopicSubscriber createDurableSubscriber (Topic topic, java.lang.String name) throws JMSException
WebSphere MQ Event Broker note This method throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Parameters: v topic: the topic to subscribe to. v name: the name used to identify this subscription. Throws: v JMSException if a session fails to create a subscriber because of a JMS error. v InvalidDestinationException if the topic specified is not valid. See TopicSession.unsubscribe
436
Using Java
TopicSession
createDurableSubscriber
public TopicSubscriber createDurableSubscriber (Topic topic, java.lang.String name, java.lang.String messageSelector, boolean noLocal) throws JMSException
Create a durable subscriber to the specified topic. A client can change an existing durable subscription by creating a durable subscriber with the same name and a new topic or message selector or both.
WebSphere MQ Event Broker note This method throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Parameters: v topic: the topic to subscribe to. v name: the name used to identify this subscription. v messageSelector: deliver only messages with properties that match the message selector expression. This value can be null. v noLocal: if set, inhibits the delivery of messages published by its own connection. Throws: v JMSException if a session fails to create a subscriber because of a JMS error or non valid selector. v InvalidDestinationException if the topic specified is not valid. v InvalidSelectorException if the message selector is not valid. createPublisher
public TopicPublisher createPublisher(Topic topic) throws JMSException
Create a publisher for the specified topic. Parameters: topic: the topic to publish to, or null if this is an unidentified producer. Throws: v JMSException if a session fails to create a publisher because of a JMS error. v InvalidDestinationException if the topic specified is not valid. createSubscriber
public TopicSubscriber createSubscriber(Topic topic) throws JMSException
Create a non-durable subscriber to the specified topic. Parameters: topic: the topic to subscribe to Throws: v JMSException - if a session fails to create a subscriber because of a JMS error.
Chapter 15. JMS interfaces and classes
437
TopicSession
v InvalidDestinationException if the topic specified is not valid. createSubscriber
public TopicSubscriber createSubscriber (Topic topic, java.lang.String messageSelector, boolean noLocal) throws JMSException
Create a non-durable subscriber to the specified topic. Parameters: v topic: the topic to subscribe to. v messageSelector: deliver only messages with properties that match the message selector expression. This value can be null. v noLocal: if set, inhibits the delivery of messages published by its own connection. Throws: v JMSException if a session fails to create a subscriber because of a JMS error or non valid selector. v InvalidDestinationException if the topic specified is not valid. v InvalidSelectorException if the message selector is not valid. createTemporaryTopic
public TemporaryTopic createTemporaryTopic() throws JMSException
Create a temporary topic. Its lifetime is that of the TopicConnection unless deleted earlier. Returns: A temporary topic. Throws: JMSException if a session fails to create a temporary topic because of a JMS error. createTopic
public Topic createTopic(java.lang.String topicName) throws JMSException
| |
Create a topic given a URI format topic name. (URI format is described in Creating topics at runtime on page 223. For information specific to JMS 1.1, see Destinations on page 239.) This allows you to create a topic with a provider-specific name. Note: Clients that depend on this ability are not portable. Parameters: topicName: the name of this topic. Returns: A topic with the given name. Throws: JMSException if a session fails to create a topic because of a JMS error.
438
Using Java
TopicSession
unsubscribe
public void unsubscribe(java.lang.String name) throws JMSException
WebSphere MQ Event Broker note This method throws a JMSException when you have a direct connection to WebSphere MQ Event Broker. Note: Do not use this method while an active subscription exists. You must close() your subscriber first. Parameters: name: the name used to identify this subscription. Throws: v JMSException if JMS fails to unsubscribe the durable subscription because of a JMS error. v InvalidDestinationException if the subscription name specified is not valid.
439
TopicSubscriber
TopicSubscriber
public interface TopicSubscriber extends MessageConsumer WebSphere MQ class: MQTopicSubscriber
java.lang.Object | +----com.ibm.mq.jms.MQMessageConsumer | +----com.ibm.mq.jms.MQTopicSubscriber
A client uses a TopicSubscriber to receive messages that have been published to a topic. TopicSubscriber is the publish/subscribe variant of a JMS message consumer. See also: MessageConsumer and TopicSession.createSubscriber MQTopicSubscriber inherits the following methods from MQMessageConsumer: close getMessageListener receive receiveNoWait setMessageListener
Methods
getNoLocal
public boolean getNoLocal() throws JMSException
Get the NoLocal attribute for this TopicSubscriber. The default value for this attribute is false. Returns: Set to true if locally-published messages are being inhibited. Throws: JMSException if JMS fails to get NoLocal attribute for this topic subscriber because of an internal error. getTopic
public Topic getTopic() throws JMSException
Get the topic associated with this subscriber. Returns: This subscribers topic. Throws: JMSException if JMS fails to get topic for this topic subscriber because of an internal error.
440
Using Java
XAConnection
XAConnection
| public interface XAConnection extends Connection Subinterfaces: XAQueueConnection and XATopicConnection WebSphere MQ class: MQXAConnection
java.lang.Object | +----com.ibm.mq.jms.MQXAConnection
| | | | | | | | | |
WebSphere MQ JMS exposes its JTS support in the XAConnectionFactory, XAConnection, and XASession classes. These classes are provided for use in a J2EE application server environment. WebSphere Application Server Version 5 uses these classes to create and manage a pool of XAConnection and XASession objects. A JMS application does not need to use these classes directly if it is running in this environment. A JMS application might need to use the XAConnection class only if it is running in a WebSphere Application Server environment with a version of WebSphere Application Server before Version 5. For more details, see Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475. See also: XAQueueConnection and XATopicConnection
| | | | | | | | | | | | | | | |
Methods
createSession (JMS 1.1 only)
public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a session. Specified by: createSession in the Connection interface. Parameters: v transacted: usage is undefined. v acknowledgeMode: usage is undefined. Returns: A newly created session. Throws: JMSException if the XA connection fails to create a session because of an internal JMS error.
441
XAConnection
| | | | | | | | createXASession (JMS 1.1 only)
public XASession createXASession() throws JMSException
Create an XA session. Returns: A newly created XA session. Throws: JMSException if the XA connection fails to create an XA session because of an internal JMS error.
442
Using Java
XAConnectionFactory
XAConnectionFactory
public interface XAConnectionFactory Subinterfaces: XAQueueConnectionFactory and XATopicConnectionFactory WebSphere MQ class: MQXAConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQXAConnectionFactory
| | | | | | | | | |
WebSphere MQ JMS exposes its JTS support in the XAConnectionFactory, XAConnection, and XASession classes. These classes are provided for use in a J2EE application server environment. WebSphere Application Server Version 5 uses these classes to create and manage a pool of XAConnection and XASession objects. A JMS application does not need to use these classes directly if it is running in this environment. A JMS application might need to use the XAConnectionFactory class only if it is running in a WebSphere Application Server environment with a version of WebSphere Application Server before Version 5. For more details, see Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475. See also: XAQueueConnectionFactory and XATopicConnectionFactory
| | | | | | | | | | | | | | | | | | | | | | |
Methods
createXAConnection (JMS 1.1 only)
public XAConnection createXAConnection() throws JMSException
Create an XA connection with the default user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start() method is called explicitly. Returns: A newly created XA connection. Throws: v JMSException if JMS fails to create an XA connection because of an internal JMS error. v JMSSecurityException if client authentication fails because the user name or password is not valid. createXAConnection (JMS 1.1 only)
public XAConnection createXAConnection(java.lang.String userName, java.lang.String password) throws JMSException
Create an XA connection with the specified user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Parameters: v userName: the user name of the caller. v password: the password of the caller.
443
XAConnectionFactory
| | | | | | | Returns: A newly created XA connection. Throws: v JMSException if JMS fails to create an XA connection because of an internal JMS error. v JMSSecurityException if client authentication fails because the user name or password is not valid.
444
Using Java
XAQueueConnection
XAQueueConnection
public interface XAQueueConnection extends QueueConnection and XAConnection WebSphere MQ class: MQXAQueueConnection
java.lang.Object | +----com.ibm.mq.jms.MQConnection | +----com.ibm.mq.jms.MQQueueConnection | +----com.ibm.mq.jms.MQXAQueueConnection
XAQueueConnection provides the same create options as QueueConnection. The only difference is that, by definition, an XAConnection is transacted. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. See also: XAConnection and QueueConnection
Methods
createQueueSession
public QueueSession createQueueSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a QueueSession. Parameters: v transacted: if true, the session is transacted. v acknowledgeMode: indicates whether the consumer or the client acknowledges any messages it receives. Possible values are: Session.AUTO_ACKNOWLEDGE Session.CLIENT_ACKNOWLEDGE Session.DUPS_OK_ACKNOWLEDGE This parameter is ignored if the session is transacted. Returns: A newly-created queue session (this is not an XA queue session). Throws: JMSException if JMS Connection fails to create a queue session because of an internal error. createXAQueueSession
public XAQueueSession createXAQueueSession()
Create an XAQueueSession. Throws: JMSException if JMS Connection fails to create an XA queue session because of an internal error.
445
XAQueueConnectionFactory
XAQueueConnectionFactory
public interface XAQueueConnectionFactory extends QueueConnectionFactory and XAConnectionFactory WebSphere MQ class: MQXAQueueConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQConnectionFactory | +----com.ibm.mq.jms.MQQueueConnectionFactory | +----com.ibm.mq.jms.MQXAQueueConnectionFactory
An XAQueueConnectionFactory provides the same create options as a QueueConnectionFactory. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. See also: QueueConnectionFactory and XAConnectionFactory
Methods
createXAQueueConnection
public XAQueueConnection createXAQueueConnection() throws JMSException
Create an XAQueueConnection using the default user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Returns: A newly-created XA queue connection. Throws: v JMSException if the JMS provider fails to create an XA queue connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password. createXAQueueConnection
public XAQueueConnection createXAQueueConnection (java.lang.String userName, java.lang.String password) throws JMSException
Create an XA queue connection using a specific user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Parameters: v userName: the user name of the caller. v password: the password for the caller. Returns: A newly-created XA queue connection.
446
Using Java
XAQueueConnectionFactory
Throws: v JMSException if the JMS Provider fails to create an XA queue connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password.
447
XAQueueSession
XAQueueSession
public interface XAQueueSession extends XASession WebSphere MQ class: MQXAQueueSession
java.lang.Object | +----com.ibm.mq.jms.MQXASession | +----com.ibm.mq.jms.MQXAQueueSession
An XAQueueSession provides a regular QueueSession that can be used to create QueueReceivers, QueueSenders, and QueueBrowsers. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. The XAResource that corresponds to the QueueSession can be obtained by calling the getXAResource method, which is inherited from XASession. See also: XASession
Methods
getQueueSession
public QueueSession getQueueSession() throws JMSException
Get the queue session associated with this XAQueueSession. Returns: The queue session object. Throws: JMSException if a JMS error occurs.
448
Using Java
XASession
XASession
| public interface XASession extends java.lang.Runnable and Session Subinterfaces: XAQueueSession and XATopicSession WebSphere MQ class: MQXASession
java.lang.Object | +----com.ibm.mq.jms.MQXASession
| | | | | | | | | | |
WebSphere MQ JMS exposes its JTS support in the XAConnectionFactory, XAConnection, and XASession classes. These classes are provided for use in a J2EE application server environment. WebSphere Application Server Version 5 uses these classes to create and manage a pool of XAConnection and XASession objects. A JMS application does not need to use these classes directly if it is running in this environment. A JMS application might need to use the XASession class only if it is running in a WebSphere Application Server environment with a version of WebSphere Application Server before Version 5. For more details, see Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475. See also: Session
Methods
commit
public void commit() throws JMSException
Do not call this method for an XASession object. If it is called, it throws a TransactionInProgressException. Specified by: commit in the Session interface. Throws: TransactionInProgressException if this method is called on an XASession. | | | | | | | | getSession (JMS 1.1 only)
public Session getSession() throws JMSException
Get the session associated with this XA session. Returns: The session. Throws: JMSException if JMS fails to return the session because of an internal JMS error.
449
XASession
getTransacted
public boolean getTransacted() throws JMSException
Indicates whether the session is in transacted mode. Specified by: getTransacted in the Session interface.
Returns: True. Throws: JMSException if JMS fails to return the transaction mode because of an internal JMS error. getXAResource
public javax.transaction.xa.XAResource getXAResource()
Do not call this method for an XASession object. If it is called, it throws a TransactionInProgressException. Specified by: rollback in the Session interface. Throws: TransactionInProgressException if this method is called on an XASession.
450
Using Java
XATopicConnection
XATopicConnection
public interface XATopicConnection extends TopicConnection and XAConnection WebSphere MQ class: MQXATopicConnection
java.lang.Object | +----com.ibm.mq.jms.MQConnection | +----com.ibm.mq.jms.MQTopicConnection | +----com.ibm.mq.jms.MQXATopicConnection
An XATopicConnection provides the same create options as TopicConnection. The only difference is that an XAConnection is transacted. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. See also: TopicConnection and XAConnection
Methods
createTopicSession
public TopicSession createTopicSession(boolean transacted, int acknowledgeMode) throws JMSException
Create a TopicSession. Specified by: createTopicSession in interface TopicConnection. Parameters: v transacted: if true, the session is transacted. v acknowledgeMode: one of: Session.AUTO_ACKNOWLEDGE Session.CLIENT_ACKNOWLEDGE Session.DUPS_OK_ACKNOWLEDGE Indicates whether the consumer or the client acknowledges any messages it receives. This parameter is ignored if the session is transacted. Returns: A newly-created topic session (this is not an XA topic session). Throws: JMSException if JMS Connection fails to create a topic session because of an internal error. createXATopicSession
public XATopicSession createXATopicSession() throws JMSException
Create an XATopicSession. Throws: JMSException if the JMS Connection fails to create an XA topic session because of an internal error.
Chapter 15. JMS interfaces and classes
451
XATopicConnectionFactory
XATopicConnectionFactory
public interface XATopicConnectionFactory extends TopicConnectionFactory and XAConnectionFactory WebSphere MQ class: MQXATopicConnectionFactory
java.lang.Object | +----com.ibm.mq.jms.MQConnectionFactory | +----com.ibm.mq.jms.MQTopicConnectionFactory | +----com.ibm.mq.jms.MQXATopicConnectionFactory
An XATopicConnectionFactory provides the same create options as TopicConnectionFactory. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. See also: TopicConnectionFactory and XAConnectionFactory
Methods
createXATopicConnection
public XATopicConnection createXATopicConnection() throws JMSException
Create an XA topic connection using the default user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Returns: A newly-created XA topic connection. Throws: v JMSException if the JMS Provider fails to create an XA topic connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password. createXATopicConnection
public XATopicConnection createXATopicConnection(java.lang.String userName, java.lang.String password) throws JMSException
Create an XA topic connection using the specified user identity. The connection is created in stopped mode. No messages are delivered until the Connection.start method is called explicitly. Parameters: v userName: the user name of the caller v password: the password of the caller Returns: A newly-created XA topic connection. Throws:
452
Using Java
XATopicConnectionFactory
v JMSException if the JMS Provider fails to create an XA topic connection because of an internal error. v JMSSecurityException if client authentication fails because of a non valid user name or password.
453
XATopicSession
XATopicSession
public interface XATopicSession extends XASession WebSphere MQ class: MQXATopicSession
java.lang.Object | +----com.ibm.mq.jms.MQXASession | +----com.ibm.mq.jms.MQXATopicSession
An XATopicSession provides a TopicSession, which you can use to create TopicSubscribers and TopicPublishers. Refer to Appendix E, JMS JTA/XA interface with WebSphere Application Server V4, on page 475 for details about how WebSphere MQ JMS uses XA classes. The XAResource that corresponds to the TopicSession can be obtained by calling the getXAResource method, which is inherited from XASession. See also: TopicSession and XASession
Methods
getTopicSession
public TopicSession getTopicSession() throws JMSException
Get the topic session associated with this XATopicSession. Returns: The topic session object. Throws: v JMSException if a JMS error occurs.
454
Using Java
Part 4. Appendixes
455
456
Using Java
cleanupInterval clientId description directAuth encoding expiry failIfQuiesce hostName localAddress msgBatchSize messageRetention messageSelection YES NO CLIENT BROKER JMSC.MQJMS_MRET_YES JMSC.MQJMS_MRET_NO JMSC.MQJMS_MSEL_CLIENT JMSC.MQJMS_MSEL_BROKER APP UNLIM YES NO JMSC.MQJMS_EXP_APP JMSC.MQJMS_EXP_UNLIMITED JMSC.MQJMS_FIQ_YES JMSC.MQJMS_FIQ_NO BASIC CERTIFICATE JMSC.MQJMS_DIRECTAUTH_BASIC JMSC.MQJMS_DIRECTAUTH_CERTIFICATE
| |
| |
MSGSELECTION
457
Properties
Table 38. Comparison of representations of property values within the administration tool and within programs (continued) Property Member variable name multicast Tool property values DISABLED NOTR RELIABLE ENABLED ASCF APP QDEF PERS NON Program property values JMSC.MQJMS_MULTICAST_DISABLED JMSC.MQJMS_MULTICAST_NOT_RELIABLE JMSC.MQJMS_MULTICAST_RELIABLE JMSC.MQJMS_MULTICAST_ENABLED JMSC.MQJMS_MULTICAST_AS_CF JMSC.MQJMS_PER_APP JMSC.MQJMS_PER_QDEF JMSC.MQJMS_PER_PER JMSC.MQJMS_PER_NON
| | | | |
MULTICAST
PERSISTENCE
persistence
pollingInterval port priority proxyHostName proxyPort pubAckInterval baseQueueName queueManager* receiveExit receiveExitInit securityExit securityExitInit sendExit sendExitInit sparseSubscriptions sslCipherSuite sslCertStores sslPeerName statusRefreshInterval subscriptionStore MIGRATE QUEUE BROKER JMSC.MQJMS_SUBSTORE_MIGRATE JMSC.MQJMS_SUBSTORE_QUEUE JMSC.MQJMS_SUBSTORE_BROKER YES NO true false APP QDEF JMSC.MQJMS_PRI_APP JMSC.MQJMS_PRI_QDEF
| |
PROXYHOSTNAME PROXYPORT PUBACKINT QUEUE QMANAGER RECEXIT RECEXITINIT SECEXIT SECEXITINIT SENDEXIT SENDEXITINIT
| |
| | |
SUBSTORE
syncpointAllGets targetClient temporaryModel baseTopicName transportType BIND CLIENT DIRECT DIRECTHTTP JMSC.MQJMS_TP_BINDINGS_MQ JMSC.MQJMS_TP_CLIENT_MQ_TCPIP JMSC.MQJMS_TP_DIRECT_TCPIP JMSC.MQJMS_TP_DIRECT_HTTP JMS MQ JMSC.MQJMS_CLIENT_JMS_COMPLIANT JMSC.MQJMS_CLIENT_NONJMS_MQ
|
USECONNPOOLING useConnectionPooling
458
Using Java
Properties
Table 38. Comparison of representations of property values within the administration tool and within programs (continued) Property Member variable name Tool property values Program property values
459
Properties
460
Using Java
Appendix B. Scripts provided with WebSphere MQ classes for Java Message Service
The following files are provided in the bin directory of your WebSphere MQ JMS installation. These scripts are provided to assist with common tasks that need to be performed while installing or using WebSphere MQ JMS. Table 39 lists the scripts and their uses.
Table 39. Utilities supplied with WebSphere MQ classes for Java Message Service Utility Cleanup.bat Use Runs the subscription cleanup utility as described in Manual cleanup on page 232, or the consumer cleanup utility as described in Manual cleanup on page 250.. Runs the default configuration application on non-Windows systems as described in JMS Postcard configuration on page 22. Converts binary log files to plain text as described in Logging on page 39. Runs the point-to-point installation verification test program as described in Running the point-to-point IVT on page 31. Runs the administration tool as described in Chapter 5, Using the WebSphere MQ JMS administration tool, on page 41. Configuration file for the administration tool as described in Configuration on page 42. Starts the JMS Postcard application as described in JMS Postcard on page 19. Runs the publish/subscribe installation verification test program as described in The publish/subscribe installation verification test on page 35. Views broker report messages as described in Handling broker reports on page 233. For information specific to JMS 1.1, see Handling broker reports on page 252. Helps you to run JMS applications as described in Running your own WebSphere MQ JMS programs on page 38.
| |
DefaultConfiguration
PSReportDump.class
| |
runjms.bat
Note: On UNIX systems, the extension .bat is omitted from the filenames.
461
Scripts
462
Using Java
If no errors occur, your server is properly configured to store Java objects and you can proceed to store JMS objects. However, if your LDAP server contains older schema definitions (for example, from an earlier draft of RFC 2713 such as the now-obsolete draft-ryan-java-schema-00 and draft-ryan-java-schema-01 specifications), update them with those described here. If a SchemaViolationException occurs, or if the message Unable to bind to object is returned, your server is not properly configured. Either your server is not configured to store Java objects, permissions on the objects are not correct, or the provided suffix or context has not been set up. The following information helps you with the schema configuration part of your server setup.
463
Attribute definitions
Attribute definitions
Table 40. Attribute settings for javaCodebase Attribute OID (Object Identifier) Syntax Maximum length Single/multi-valued User modifiable Matching rules Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.7 IA5 String (1.3.6.1.4.1.1466.115.121.1.26) 2048 Multi-valued Yes caseExactIA5Match normal userApplications URL(s) specifying the location of class definition
Table 41. Attribute settings for javaClassName Attribute OID (Object Identifier) Syntax Maximum length Single/multi-valued User modifiable? Matching rules Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.6 Directory String (1.3.6.1.4.1.1466.115.121.1.15) 2048 Single-valued Yes caseExactMatch normal userApplications Fully qualified name of distinguished Java class or interface
Table 42. Attribute settings for javaClassNames Attribute OID (Object Identifier) Syntax Maximum length Single/multi-valued User modifiable Matching rules Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.13 Directory String (1.3.6.1.4.1.1466.115.121.1.15) 2048 Multi-valued Yes caseExactMatch normal userApplications Fully qualified Java class or interface name
464
Using Java
Attribute definitions
Table 43. Attribute settings for javaFactory Attribute OID (Object Identifier) Syntax Maximum length Single/multi-valued User modifiable Matching rules Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.10 Directory String (1.3.6.1.4.1.1466.115.121.1.15) 2048 Single-valued Yes caseExactMatch normal userApplications Fully qualified Java class name of a JNDI object factory
Table 44. Attribute settings for javaReferenceAddress Attribute OID (Object Identifier) Syntax Maximum length Single/multi-valued User modifiable Matching rules Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.11 Directory String (1.3.6.1.4.1.1466.115.121.1.15) 2048 Multi-valued Yes caseExactMatch normal userApplications Addresses associated with a JNDI Reference
Table 45. Attribute settings for javaSerializedData Attribute OID (Object Identifier) Syntax Single/multi-valued User modifiable Access class Usage Description Value 1.3.6.1.4.1.42.2.27.4.1.8 Octet String (1.3.6.1.4.1.1466.115.121.1.40) Single-valued Yes normal userApplications Serialized form of a Java object
objectClass definitions
Table 46. objectClass definition for javaSerializedObject Definition OID (Object Identifier) Extends/superior Type Required (must) attrs Value 1.3.6.1.4.1.42.2.27.4.2.5 javaObject AUXILIARY javaSerializedData
465
objectClass definitions
Table 47. objectClass definition for javaObject Definition OID (Object Identifier) Extends/superior Type Required (must) attrs Optional (may) attrs Value 1.3.6.1.4.1.42.2.27.4.2.4 top ABSTRACT javaClassName javaClassNames javaCodebase javaDoc description
Table 48. objectClass definition for javaContainer Definition OID (Object Identifier) Extends/superior Type Required (must) attrs Value 1.3.6.1.4.1.42.2.27.4.2.1 top STRUCTURAL cn
Table 49. objectClass definition for javaNamingReference Definition OID (Object Identifier) Extends/superior Type Optional (may) attrs Value 1.3.6.1.4.1.42.2.27.4.2.7 javaObject AUXILIARY javaReferenceAddress javaFactory
466
Using Java
467
468
Using Java
| | | | |
469
When this message flow is deployed and the broker is started, from the JMS applications perspective the WebSphere MQ Integrator V2 broker behaves like an MQSeries Publish/Subscribe broker. The current subscription state can be viewed using the WebSphere MQ Integrator Control Center. Notes: 1. No modifications are required to WebSphere MQ classes for Java Message Service. 2. MQSeries Publish/Subscribe and WebSphere MQ Integrator V2 brokers cannot coexist on the same queue manager. 3. Details of the WebSphere MQ Integrator V2 installation and setup procedure are described in the WebSphere MQ Integrator for Windows NT Version 2.0 Installation Guide. | Direct connection to WebSphere MQ Event Broker Version 2.1 over TCP/IP For this, set up a message flow within an execution group on WebSphere MQ Event Broker. This message flow is to read messages from the TCP/IP socket on which the broker is listening. The basic message flow consists of a JMSIPOptimised flow set to listen on the port configured for direct connections. By default, this port is 1506. Note: WebSphere MQ Event Broker can be configured to listen for both direct connections across TCP/IP from WebSphere MQ JMS and connections made across TCP/IP through WebSphere MQ. In this case, the two listeners must be configured on different ports. The default port for a WebSphere MQ connection is 1414. | | | | | | | | | | | | | | Direct connection to WebSphere Business Integration Event Broker Version 5.0 or WebSphere Business Integration Message Broker Version 5.0 To configure a WebSphere Business Integration Event Broker or WebSphere Business Integration Message Broker broker for a direct connection from WebSphere MQ JMS, create a message flow to read messages from the TCP/IP port on which the broker is listening and publish the messages. You can do this in either of the following ways: v You can create a message flow that contains a Real-timeOptimizedFlow message processing node. v You can create a message flow that contains a Real-timeInput message processing node and a Publication message processing node. You must configure the Real-timeOptimizedFlow or Real-timeInput node to listen on the port used for direct connections. By default, the port number for direct connections is 1506.
470
Using Java
This URI form allows an application to set the mcd to a domain that is not one of the standard jms_xxxx values; for example, to domain mrm. It also allows the application to set any or all of the mcd set, type, and format fields. The string argument to setJMSType is interpreted as follows: 1. If the string does not appear to be in the special URI format (it does not start with mcd://), the string is added to the mcd folder as the type field. 2. If the string starts with mcd://, conforms to the URI format, and the message is a Text or Bytes message, the URI string is split into its constituent parts. The domain part overrides the jms_text or jms_bytes value that would otherwise have been generated, and the remaining parts (if present) are used to set the set, type, and format fields in the mcd. Note that set, type, and format are all optional. 3. If the string starts with mcd:// and the message is a Map, Stream, or Object message, the setJMSType call throws an exception. So you cannot override the domain, or provide a set or format for these classes of message, but you can provide a type. When a WebSphere MQ message is received with an Msd domain other than one of the standard jms_xxxx values, it is instantiated as a JMS text or bytes message and a URI-style JMSType is assigned to it. If the format field of the RFH2 is MQFMT_STRING, it becomes a TextMessage; otherwise it becomes a BytesMessage. The receiving application can read this using the getJMSType method.
471
Configuring WebSphere MQ JMS for a direct connection to WebSphere Business Integration Event Broker Version 5.0 and WebSphere Business Integration Message Broker Version 5.0
A WebSphere MQ JMS client can connect directly to a WebSphere Business Integration Event Broker or WebSphere Business Integration Message Broker broker over TCP/IP. The available function is comparable to that provided for a direct connection to a WebSphere MQ Event Broker Version 2.1 broker, but with the following additions: v Secure Sockets Layer (SSL) authentication v Multicast v HTTP tunnelling v Connect via proxy For detailed information about this additional function, see the WebSphere Business Integration Event Broker or WebSphere Business Integration Message Broker Information Center. The following sections explain how to configure a WebSphere MQ JMS client in order to use this function.
472
Using Java
Multicast
You can configure a WebSphere MQ JMS client multicast connection to a broker in either of the following ways: v In a WebSphere MQ JMS application, use the setMulticast() method of an MQConnectionFactory, MQTopicConnectionFactory, or MQTopic object to set the multicast attribute. v Use the WebSphere MQ JMS administration tool to set the MULTICAST property. The TRANSPORT property must be set to DIRECT before the MULTICAST property has any effect.
HTTP tunnelling
A WebSphere MQ JMS client can connect to a broker using HTTP tunnelling. HTTP tunnelling is suitable for applets because the Java 2 Security Manager normally rejects any attempt by an applet to connect directly to the broker. Using HTTP tunnelling, which exploits the built in support in Web browsers, a WebSphere MQ JMS client can connect to the broker using the HTTP protocol as though connecting to a Web site. You can configure a WebSphere MQ JMS client to use HTTP tunnelling in either of the following ways: v In a WebSphere MQ JMS application, use the setTransportType() method of an MQConnectionFactory object to set the transport type attribute to JMSC.MQJMS_TP_DIRECT_HTTP. v Use the WebSphere MQ JMS administration tool to set the TRANSPORT property to DIRECTHTTP. SSL authentication cannot be used with HTTP tunnelling.
473
474
Using Java
Administered objects
JMS uses administered objects to encapsulate vendor-specific information. This minimizes the impact of vendor-specific details on end-user applications. Administered objects are stored in a JNDI namespace, and can be retrieved and used in a portable manner without knowing the vendor-specific contents. For standalone use, WebSphere MQ JMS provides the following classes: v MQQueueConnectionFactory v MQQueue v MQTopicConnectionFactory v MQTopic WebSphere Application Server provides an additional pair of administered objects so that WebSphere MQ JMS can integrate with WebSphere Application Server: v JMSWrapXAQueueConnectionFactory v JMSWrapXATopicConnectionFactory You use these objects in exactly the same way as the MQQueueConnectionFactory and MQTopicConnectionFactory. However, behind the scenes they use the XA versions of the JMS classes, and enlist the WebSphere MQ JMS XAResource in the WebSphere Application Server transaction.
475
MQ_install_dir is the installation directory for WebSphere MQ JMS, and hostname is the name or IP address of the machine that is running WebSphere Application Server. To access the com.ibm.ejs.ns.jndi.CNInitialContextFactory, you must add the file ejs.jar from the WebSphere Application Server lib directory to the CLASSPATH. To create the new factories, use the define verb with the following two new types:
def WSQCF(name) [properties] def WSTCF(name) [properties]
These new types use the same properties as the equivalent QCF or TCF types, except that only the BIND transport type is allowed (and therefore, client properties cannot be configured). For details, see Administering JMS objects on page 45.
The objects can be cast to, and used as, the generic JMS interfaces. Normally, there is no need to program to the WebSphere MQ specific classes in the application code.
Samples
There are three samples that illustrate the basics of using WebSphere MQ JMS with WebSphere Application Server Advanced Edition. These are in subdirectories of MQ_samples_dir/ws, where MQ_samples_dir is the samples directory for WebSphere MQ JMS. See Table 3 on page 10 to find where this is.
476
Using Java
Sample1
Sample1EJB.java, in the sample1 directory, defines two methods that use JMS: v putMessage() sends a TextMessage to a queue, and returns the MessageID of the sent message v getMessage() reads the message with the specified MessageID back from the queue Before you run the sample, you must store two administered objects in the WebSphere Application Server JNDI namespace: QCF1 a WebSphere Application Server-specific queue connection factory Q1 a queue
Both objects must be bound in the jms/Samples sub-context. To set up the administered objects, you can either use the WebSphere MQ JMS administration tool and set them up manually, or you can use the script provided. The WebSphere MQ JMS administration tool must be configured to access the WebSphere Application Server namespace. For details about how to configure the administration tool, refer to Configuring for WebSphere Application Server V3.5 on page 44. To set up the administered objects with typical default settings, you can enter the following command to run the script admin.scp:
JMSAdmin < admin.scp
The bean must be deployed with the getMessage and putMessage methods marked as TX_REQUIRED. This ensures that the container starts a transaction before entering each method, and commits the transaction when the method completes. Within the methods, you do not need any application code that relates to the transactional state. However, the message sent from putMessage occurs under syncpoint, and does not become available until the transaction is committed. In the sample1 directory, there is a simple client program, Sample1Client.java, to call the EJB bean. There is also a script, runClient, to simplify running this program. The client program (or script) takes a single parameter, which is used as the body of a TextMessage that is sent by the EJB bean putMessage method. The getMessage
Appendix E. JMS JTA/XA interface with WebSphere Application Server V4
477
Sample2
Sample2EJB.java, in the sample2 directory, performs the same task as sample1, and requires the same administered objects. Unlike sample1, sample2 uses bean-managed transactions to control the transactional boundaries. If you have not already run sample1, ensure that you set up the administered objects QCF1 and Q1, as described in Sample1 on page 477. The putMessage methods and getMessage methods start by obtaining an instance of UserTransaction. They use this instance to create a transaction using the UserTransaction.begin() method. After that, the main body of the code is the same as sample1 until the end of each method. At the end of each method, the transaction is completed by the UserTransaction.commit() call. In the sample2 directory, there is a simple client program, Sample2Client.java, to call the EJB bean. There is also a script, runClient, to simplify running this program. You can use these in the same way as described for Sample1 on page 477.
Sample3
Sample3EJB.java, in the sample3 directory, demonstrates the use of the publish/subscribe API with WebSphere Application Server. Publishing a message is very similar to the point-to-point case. However, there are differences when receiving messages using a TopicSubscriber. Publish/subscribe programs commonly use nondurable subscribers. These nondurable subscribers exist only for the lifetime of their owning sessions (or less if the subscriber is closed explicitly). Also, they can receive messages from the broker only during that lifetime. To convert sample1 to publish/subscribe, create a durable subscriber before the message is published. Durable subscribers persist as a deliverable end-point beyond the lifetime of the session. Therefore, the message is available for retrieval during the call to getMessage(). The EJB bean includes two additional methods: v createSubscription creates a durable subscription v destroySubscription deletes a durable subscription These methods (along with putMessage and getMessage) must be deployed with the TX_REQUIRED attribute.
478
Using Java
If you have already run admin.scp to set up objects for sample1 or sample2, there will be error messages when you run admin.scp for sample3. (These occur when you attempt to create the jms and Samples sub-contexts.) You can safely ignore these error messages. Also, before you run sample3, ensure that the WebSphere MQ publish/subscribe broker (SupportPac MA0C) is installed and running. In the sample3 directory, there is a simple client program, Sample3Client.java, to call the EJB bean. There is also a script, runClient, to simplify running this program. You can use these in the same way as described for Sample1 on page 477.
479
480
Using Java
Notes: 1. You might need to restart VisualAge for Java if you get the error message Unknown Java Error after repeated tests.
Copyright IBM Corp. 1997, 2004
481
482
Using Java
2. Using FTP binary mode, upload the file ma1g.tar.Z from your workstation to the HFS directory /u/joe/mqm.
Copyright IBM Corp. 1997, 2004
483
5. Set up your CLASSPATH and LIBPATH as described in Environment variables on page 10.
The program output is placed in the files used for standard and error output. Refer to CICS documentation for more information on running Java programs and setting the input and output files.
484
Using Java
Running WebSphere MQ base Java applications under CICS Transaction Server for OS/390
To run a Java application as a transaction under CICS, you must: 1. Define the application and transaction to CICS by using the supplied CEDA transaction. 2. Ensure that the WebSphere MQ CICS adapter is installed in your CICS system. (See WebSphere MQ for z/OS System Setup Guide for details.) 3. Ensure that the JVM environment specified in the DHFJVM parameter of your CICS startup JCL (Job Control Language) includes appropriate CLASSPATH and LIBPATH entries. 4. Initiate the transaction by using any of your normal processes. For more information on running CICS Java transactions, refer to your CICS system documentation.
485
486
Using Java
487
SSL CipherSuites
488
Using Java
Reading variables in a message Some messages display text or numbers that vary according to the circumstances giving rise to the message; these are known as message variables. Message variables are indicated in this book by the use of numbers in braces; for example, {0}, {1}, and so on.
| | | |
MQJMS0000 Method {0} has been invoked at an illegal or inappropriate time or if the provider is not in an appropriate state for the requested operation. Explanation: The normal reason for this exception is that the SSL certificate stores have not been defined. {0} identifies the method that has caused the problem. User Response: For more information, see Using Secure Sockets Layer (SSL) on page 210. For information specific to JMS 1.1, see Using Secure Sockets Layer (SSL) on page 253. MQJMS0002 JMS Client attempted to set invalid clientId on a connection. Explanation: An application attempted to set the clientId property of a valid connection to null, or attempted to set the clientId property of an invalid connection. User Response: The clientId property on a connection can only be set once, only to a non-null value, and only before the connection is used. Ensure that the connection is valid and that the clientId value is not null. MQJMS0003 Destination not understood or no longer valid. Explanation: The queue or topic may have become unavailable, the application may be using an incorrect connection for the queue or topic, or the supplied destination is not of the correct type for this method. User Response: Check that WebSphere MQ is still running and the queue manager is available. Check that the right connection is being used for your queue or topic.
Copyright IBM Corp. 1997, 2004
MQJMS0004 JMS Client has given JMS Provider a message selector with invalid syntax. Explanation: The message selector string is empty or contains an invalid value or syntax. User Response: Check the linked WebSphere MQ exception reason and completion codes for more information. MQJMS0005 Unexpected end of stream has been reached when a StreamMessage or BytesMessage is being read. Explanation: The byte stream being read is shorter than the buffer supplied. This can also be caused by receiving a corrupt StreamMessage or BytesMessage. User Response: Check the length of buffer supplied. Check system event logs for more information. MQJMS0006 JMS Client attempts to use a data type not supported by a message or attempts to read data in the wrong type. Explanation: Wrong data types used to read message property types. User Response: Check that the message received and the properties to be read are of the type expected. MQJMS0009 JMS Provider is unable to allocate the resources required for a method. Explanation: Machine resources may be overloaded, the linked exception may give further information. User Response: Check system resources and load.
489
| | | |
490
Using Java
491
492
Using Java
a valid property name in accordance with the JMS specification. If the property name refers to a JMS or provider-specific extension property, ensure that this property is settable. MQJMS1059 Fatal error - UTF8 not supported. Explanation: The Java runtime environment you are using does not support the UTF-8 character encoding. JMS requires support for this encoding to perform some operations. User Response: Consult the documentation and or provider of your Java runtime environment to determine how to obtain support for the UTF-8 character encoding. MQJMS1060 Unable to serialize object. Explanation: An attempt has been made to serialize an ObjectMessage which contains a non-serializable object. User Response: Ensure that ObjectMessages only contain serializable objects. If the object placed inside an ObjectMessage references other objects, these must also be serializable. MQJMS1061 Unable to deserialize object. Explanation: De-serialization of an ObjectMessage failed. User Response: Ensure that the ObjectMessage being received contains valid data. Ensure that the class files representing object data contained within the ObjectMessage are present on the machine deserializing the ObjectMessage. If the object contained within the ObjectMessage references other objects, ensure that these class files are also present. MQJMS1066 Invalid message element name: {0}. Explanation: Attempting to set a message property using either an invalid property name, or the name of a property which cannot have its value set. User Response: Ensure that the property name specified conforms to the JMS specification. If the property name supplied is that of a JMS property, or a vendor specific extension, ensure that this property name is settable. MQJMS1067 Timeout invalid for MQ. Explanation: An attempt was made to invoke the receive method on either a QueueReceiver or TopicSubscriber method, specifying a long timeout value which is not valid. User Response: Ensure the timeout value specified is not negative and not greater than the value of Integer.MAX_VALUE.
493
494
Using Java
| | | | | | | | | | | | | | | | | | | |
MQJMS1112 JMS 1.1 Invalid operation for a domain specific object. Explanation: A JMS application attempted to perform an operation on domain specific object, but the operation is valid only for the other messaging domain. User Response: Make sure that the JMS objects used by your application are relevant for the required messaging domain. If your application uses both messaging domains, consider using domain independent objects throughout the application. MQJMS1113 JMS 1.1 Invalid attribute for a domain specific object. Explanation: A JMS application attempted to set an attribute of a domain specific object, but the attribute is valid only for the other messaging domain. User Response: Make sure that the JMS object types used by your application are relevant for the required messaging domain. If your application uses both messaging domains, consider using domain independent objects throughout the application. MQJMS2000 Failed to close MQ queue. Explanation: JMS attempted to close a WebSphere MQ queue, but encountered an error. The queue may already be closed, or another thread may be performing an MQGET while close() is called. User Response: Use the linked exception to determine the cause of this error. You may be able to perform the close() later. MQJMS2001 MQQueue reference is null. Explanation: JMS attempted to perform some operation on a null MQQueue object. User Response: Check your system setup, and that all required queue names have been specified. This may represent an internal error condition in JMS; in this case, contact your IBM representative. MQJMS2002 Failed to get message from MQ queue. Explanation: JMS attempted to perform an MQGET; however WebSphere MQ reported an error. User Response: Use the linked exception to determine the cause of this error. MQJMS2003 Failed to disconnect queue manager. Explanation: JMS encountered an error while attempting to disconnect. User Response: Use the linked exception to determine the cause of this error. MQJMS2004 MQQueueManager reference is null. Explanation: JMS attempted to perform an operation on a null MQQueueManager object. User Response: Check that the relevant object has not been closed. This may represent an internal error
| | | | | | | | | | | | |
MQJMS1111 JMS 1.1 The required queues or publish/subscribe services are not set up: {0}. Explanation: The required WebSphere MQ setup for the messaging domain is not complete. User Response: For the point-to-point messaging, make sure that you have started the queue manager and, if your JMS application is connecting as a client application, make sure that you have started a listener for the correct port. For publish/subscribe messaging, make sure that you have done the post installation setup, as described in Additional setup for publish/subscribe mode on page 26.
495
496
Using Java
497
| | |
| | | |
498
Using Java
499
500
Using Java
501
502
Using Java
| | |
| | |
| | |
| | |
503
504
Using Java
Appendix J. Notices
This information was developed for products and services offered in the United States. IBM may not offer the products, services, or features discussed in this information in other countries. Consult your local IBM representative for information on the products and services currently available in your area. Any reference to an IBM product, program, or service is not intended to state or imply that only that IBM product, program, or service may be used. Any functionally equivalent product, program, or service that does not infringe any IBM intellectual property right may be used instead. However, it is the users responsibility to evaluate and verify the operation of any non-IBM product, program, or service. IBM may have patents or pending patent applications covering subject matter described in this information. The furnishing of this information does not give you any license to these patents. You can send license inquiries, in writing, to: IBM Director of Licensing IBM Corporation North Castle Drive Armonk, NY 10504-1785 U.S.A. For license inquiries regarding double-byte (DBCS) information, contact the IBM Intellectual Property Department in your country or send inquiries, in writing, to: IBM World Trade Asia Corporation Licensing 2-31 Roppongi 3-chome, Minato-ku Tokyo 106, Japan The following paragraph does not apply to the United Kingdom or any other country where such provisions are inconsistent with local law: INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS PUBLICATION AS IS WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. Some states do not allow disclaimer of express or implied warranties in certain transactions, therefore this statement may not apply to you. This information could include technical inaccuracies or typographical errors. Changes are periodically made to the information herein; these changes will be incorporated in new editions of the information. IBM may make improvements and/or changes in the product(s) and/or the program(s) described in this information at any time without notice. Any references in this information to non-IBM Web sites are provided for convenience only and do not in any manner serve as an endorsement of those Web sites. The materials at those Web sites are not part of the materials for this IBM product and use of those Web sites is at your own risk. IBM may use or distribute any of the information you supply in any way it believes appropriate without incurring any obligation to you.
505
Notices
Licensees of this program who wish to have information about it for the purpose of enabling: (i) the exchange of information between independently created programs and other programs (including this one) and (ii) the mutual use of the information which has been exchanged, should contact: IBM United Kingdom Laboratories, Mail Point 151, Hursley Park, Winchester, Hampshire, England SO21 2JN. Such information may be available, subject to appropriate terms and conditions, including in some cases, payment of a fee. The licensed program described in this information and all licensed material available for it are provided by IBM under terms of the IBM Customer Agreement, IBM International Programming License Agreement, or any equivalent agreement between us. Information concerning non-IBM products was obtained from the suppliers of those products, their published announcements or other publicly available sources. IBM has not tested those products and cannot confirm the accuracy of performance, compatibility or any other claims related to non-IBM products. Questions on the capabilities of non-IBM products should be addressed to the suppliers of those products. COPYRIGHT LICENSE: This information contains sample application programs in source language, which illustrate programming techniques on various operating platforms. You may copy, modify, and distribute these sample programs in any form without payment to IBM, for the purposes of developing, using, marketing or distributing application programs conforming to the application programming interface for the operating platform for which the sample programs are written. These examples have not been thoroughly tested under all conditions. IBM, therefore, cannot guarantee or imply reliability, serviceability, or function of these programs. You may copy, modify, and distribute these sample programs in any form without payment to IBM for the purposes of developing, using, marketing, or distributing application programs conforming to IBMs application programming interfaces.
Trademarks
The following terms are trademarks of International Business Machines Corporation in the United States, or other countries, or both:
AIX IBM MQSeries OS/400 System/390 WebSphere AS/400 iSeries MVS/ESA SecureWay S/390 z/OS CICS Language Environment OS/390 SupportPac VisualAge zSeries
Intel, Intel Inside (logos), MMX, and Pentium are trademarks of Intel Corporation in the United States, other countries, or both.
506
Using Java
Notices
Java, HotJava, JDK, and all Java-based trademarks and logos are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States, other countries, or both. Microsoft, Windows, and Windows NT are trademarks of Microsoft Corporation in the United States, other countries, or both. UNIX is a registered trademark of The Open Group in the United States and other countries. Other company, product, and service names may be trademarks or service marks of others.
Appendix J. Notices
507
508
Using Java
Index A
accessibility 24 JMS Postcard 24 accessing queues and processes 75 administered objects 47, 200 with WebSphere Application Server V4 475 administering JMS objects 45 administration commands 44 verbs 45 administration tool configuration file 42 configuring 42 overview 41 properties 42 property mapping 457 starting 41 advantages of Java interface 63 applets example code 69 running 93 security settings for 481 using WebSphere MQ Java in 481 versus applications 67 appletviewer using 5 application example 72 Application Server Facilities 277 classes and functions 277 sample client applications 287 sample code 283 applications closing 209 JMS 1.1, writing 235 JMS publish/subscribe, writing 213 JMS, writing 199 running 94 unexpected termination 230 versus applets 67 ASF (Application Server Facilities) 277 ASFClient1.java 289 ASFClient2.java 290 ASFClient3.java 292 ASFClient4.java 293 ASFClient5.java 294 asynchronous message delivery 208 using JMS 1.1 248 bindings transport, choosing 202 body, message 257 broker reports 233 BROKERCCDSUBQ object property 49, 279, 457 BROKERCCSUBQ object property 49, 279, 457 BROKERCONQ object property 49, 457 BROKERDURSUBQ object property 49, 457 BROKERPUBQ object property 49, 457 BROKERQMGR object property 49, 457 BROKERSUBQ object property 49, 457 BROKERVER object property 49, 457 building a connection 200 using JMS 1.1 236 bytes message 257 BytesMessage interface 300 type 207 classes, WebSphere MQ classes for Java (continued) MQQueueManager 163 MQReceiveExit 182 MQSecurityExit 184 MQSendExit 186 MQSimpleConnectionManager 176 classpath configuring 25 settings 10 Cleanup class 308 CLEANUP object property 49, 457 cleanup utility consumer 248 subscriber 230 CLEANUPINT object property 49, 457 client properties 56 client transport, choosing 202 CLIENTID object property 49, 457 clients configuring queue manager 15 connection 5 programming 67 verifying 16 closing applications 209 JMS resources in publish/subscribe mode 219 resources 208 resources using JMS 1.1 252 code examples 69 com.ibm.jms package 299 com.ibm.mq.jar 9 com.ibm.mq.jms package 298 com.ibm.mqbind.jar 9 com.ibm.mqjms.jar 9 combinations, valid, of objects and properties 52 commands, administration 44 compiling WebSphere MQ classes for Java programs 93 configuration file, for administration tool 42 configuring environment variables 26 for publish/subscribe 26 for WebSphere Application Server 44 Java 2 Security Manager 13 LDAP server 463 queue manager for clients 15 the administration tool 42 to run applets 481 unsupported InitialContextFactory 43 Web server 12 your classpath 25 your installation 25 confirm on arrival report options, message 133
C
CCSID object property 49, 457 certificate revocation list (CRL) 91 CHANGE (administration verb) 45 CHANNEL object property 49, 457 choosing transport 202 CICS Transaction Server running applications 485 CipherSpecs 487 CipherSuites supported 487 class library 65 classes, Application Server Facilities 277 classes, core 95 restrictions and variations 96, 485 classes, JMS 295 classes, WebSphere MQ classes for Java 101 ManagedConnection 188 ManagedConnectionFactory 191 ManagedConnectionMetaData 193 MQC 179 MQChannelDefinition 102 MQChannelExit 104 MQConnectionManager 181 MQDistributionList 107 MQDistributionListItem 109 MQEnvironment 110 MQException 117 MQGetMessageOptions 119 MQManagedObject 123 MQMessage 126 MQMessageTracker 144 MQPoolServices 146 MQPoolServicesEvent 147 MQPoolServicesEventListener 180 MQPoolToken 149 MQProcess 150 MQPutMessageOptions 152 MQQueue 155
B
bean-managed transactions 476 sample application 478 behavior in different environments benefits of JMS 3 bindings connection 6 connection, programming 68 example application 72 verifying 16 Copyright IBM Corp. 1997, 2004 485
509
confirm on delivery report options, message 133 connecting to a publish/subscribe broker 469 connecting to a queue manager 75 connecting to WebSphere Business Integration Event Broker configuring a client for a multicast connection 473 configuring a client for connection through a proxy server 473 configuring a client for HTTP tunnelling 473 configuring a client for SSL authentication 472 configuring the broker for a direct connection 470 connecting to WebSphere Business Integration Message Broker configuring a client for a multicast connection 473 configuring a client for connection through a proxy server 473 configuring a client for HTTP tunnelling 473 configuring a client for SSL authentication 472 configuring the broker for a direct connection 470 connecting to WebSphere MQ Event Broker 469 connecting to WebSphere MQ Integrator V2 469 connection building 200 building using JMS 1.1 236 creating 201 interface 199 options 4 starting 201 WebSphere MQ, losing 230 Connection interface 313 connection pooling 80 example 81 connection type, defining 68 ConnectionConsumer class 277 ConnectionConsumer interface 318 ConnectionFactory interface 319 ConnectionMetaData interface 335 connector.jar 9 consumer cleanup utility 248 container-managed transactions 476 sample application 477 converting the log file 41 COPY (administration verb) 45 core classes 95 restrictions and variations 96, 485 createQueueSession method 203 createReceiver method 207 createSender method 204 creating a connection 201 factories at runtime 201 JMS objects 48 Topics at runtime 223
D
default connection pool 80 multiple components 83 default trace and log output locations 38 DEFINE (administration verb) 45 defining connection type 68 defining transport 202 definition, LDAP schema 463 DELETE (administration verb) 45 DeliveryMode interface 337 dependencies, property 56 DESCRIPTION object property 49, 457 Destination interface 338 destinations 239 differences between applets and applications 67 differences due to environment 485 DIRECTAUTH object property 49, 457 directories, installation 10 disconnecting from a queue manager 75 DISPLAY (administration verb) 45 disposition options, message 134, 281 distribution lists platform dependency 98 durable subscribers 224
exceptions JMS 209 JMS 1.1 252 WebSphere MQ 209 exit string properties 57 expiration report options, message 133 EXPIRY object property 49, 457 extra function provided over WebSphere MQ Java 3
F
factories, creating at runtime 201 FAILIFQUIESCE object property 49, 457 formatLog utility 41, 461 fscontext.jar 9 function, extra provided over WebSphere MQ Java 3 functions, Application Server Facilities 277
G
getting started 3
E
ENCODING object property 57, 457 END (administration verb) 45 environment dependencies 95 functions not with all platforms 98 distribution lists 98 MQGetMessageOptions fields 98 MQMD fields 99 MQPutMessageOptions fields 98 MQQueueManager begin() method 98 MQQueueManager constructor 98 restrictions and variations 96 MQGMO_* values 96 MQPMO_* values 96 MQPMRF_* values 96 MQRO_* values 97 z/OS and OS/390 97 environment differences 485 environment variables 10 configuring 26 error conditions when creating an object 59 conditions when using an object 59 handling 77 logging 39 recovery, IVT 34 recovery, PSIVT 37 runtime, handling 209 runtime, handling using JMS 1.1 252 error messages 18 LDAP server 463 example code 69 exception listener 209 exception messages, JMS 489 exception report options, message 133, 281 ExceptionListener interface 340
H
handling errors 77 JMS runtime errors 209 messages 76 runtime errors using JMS 1.1 252 headers, message 257 HOSTNAME object property 49, 457
I
import statements 217 INITIAL_CONTEXT_FACTORY property 42, 43 inquire and set 78 installation directories 10 Installation Verification Test program for publish/subscribe (PSIVT) 35 IVT error recovery 34 PSIVT error recovery 37 setup 25 verifying 19 Installation Verification Test program (IVT) 31 installing WebSphere MQ classes for Java 9 WebSphere MQ classes for Java Message Service 9 interface, programming 64 interfaces JMS 199, 295 WebSphere MQ 199 introduction for programmers 63 WebSphere MQ classes for Java 3 WebSphere MQ classes for Java Message Service 3
510
Using Java
IVT (Installation Verification Test program) 31 IVTrun utility 461 IVTRun utility 31, 33, 37 IVTSetup utility 32, 461 IVTTidy utility 34, 461
J
J2EE connector architecture 81 JAAS (Java Authentication and Authorization Service) 81, 181 jar files 9 Java 2 Platform Enterprise Edition (J2EE) 81 Java 2 Security Manager, running applications under 13 Java Authentication and Authorization Service (JAAS) 81, 181 Java classes 65 See classes, WebSphere MQ classes for Java Java Development Kit (JDK) 64 Java interface, advantages 63 Java Transaction API (JTA) 449 with WebSphere Application Server V4 475 javaClassName LDAP attribute setting 464 javaClassNames LDAP attribute setting 464 javaCodebase LDAP attribute setting 464 javaContainer LDAP objectClass definition 466 javaFactory LDAP attribute setting 465 javaNamingReference LDAP objectClass definition 466 javaObject LDAP objectClass definition 466 javaReferenceAddress LDAP attribute setting 465 javaSerializedData LDAP attribute setting 465 javaSerializedObject LDAP objectClass definition 465 javax.jms package 295 JDBC coordination 87 JDK (Java Development Kit) 64 JMS administered objects 200 applications, writing 199 benefits 3 classes 295 exception listener 209 exceptions 209 reference 489 interfaces 199, 295 introduction 3 mapping of fields at send or publish 268 mapping with MQMD 265 message types 206 messages 257 model 199 objects for publish/subscribe 217
JMS (continued) objects, administering 45 objects, creating 48 objects, properties 49 publish/subscribe applications, writing 213 resources, closing in publish/subscribe mode 219 JMS 1.1 applications, writing 235 exceptions 252 model 235 JMS exception messages 489 JMS JTA/XA Interface with WebSphere Application Server V4 475 JMS Postcard accessibility 24 changing appearance 24 changing browser for help 24 default configuration 22 font and color settings 24 how it works 22 interoperability with other Postcard applications 24 receiving messages 23 sending a postcard 20 sending messages 23 sign-on 20 advanced options 20 starting 19 tidying up after use 24 using with one queue manager 20 using with two queue managers 21 jms.jar 9 JMSAdmin configuration file 42, 43 JMSAdmin utility 41, 461 JMSAdmin.config file 41 JMSBytesMessage class 300 JMSCorrelationID header field 257 JMSMapMessage class 341 JMSMessage class 349 JMSStreamMessage class 405 JMSTextMessage class 415 JNDI retrieving 200 security considerations 43 jndi.jar 9 JSSE for SSL support 89, 210, 253 JTA (Java Transaction API) 449 with WebSphere Application Server V4 475 JTA/JDBC coordination 87 installation other platforms 87 Windows 87 known problems 88 limitations 88 switch file 87 usage 88
LDAP server (continued) attribute settings javaClassName 464 javaClassNames 464 javaCodebase 464 javaFactory 465 javaReferenceAddress 465 javaSerializedData 465 configuration 463 error messages 463 iSeries OS/400 V4R5 Schema Modification 467 Microsoft Active Directory 466 Netscape Directory 466 objectClass definitions javaContainer 466 javaNamingReference 466 javaObject 466 javaSerializedObject 465 schema 463 Sun Microsystems Schema Modification Applications 467 ldap.jar 9 library, Java classes 65 listener, JMS exception 209 Load1.java 287 Load2.java 290 local publications, suppressing 225 LOCALADDRESS object property 49, 457 log file converting 41 default output location 38 logging errors 39
M
MA1G, SupportPac special considerations for 483 ManagedConnection 188 ManagedConnectionFactory 191 ManagedConnectionMetaData 193 manipulating subcontexts 45 map message 257 MapMessage interface 341 type 207 mapping properties between admin. tool and programs 457 mcd folder 471 message body 257 delivery, asynchronous 208 delivery, asynchronous using JMS 1.1 248 error 18 handling 76 headers 257 message body 273 properties 257 selectors 208, 257 selectors and SQL 258 selectors in publish/subscribe mode 224 types 206, 257 Message interface 349 MessageConsumer interface 199, 363 Index
L
LDAP naming considerations 48 LDAP schema definition 463 LDAP server 32
511
MessageListener interface 366 MessageListenerFactory.java 286 MessageProducer interface 199, 367 MessageProducer object 204 messages JMS 257 mapping between JMS and WebSphere MQ 261 poison 280 publishing 219 receiving 207 receiving in publish/subscribe mode 219 receiving using JMS 1.1 241 selecting 208, 257 sending 204 sending using JMS 1.1 240 model JMS 199 JMS 1.1 235 MOVE (administration verb) 45 MQC 179 MQChannelDefinition 102 MQChannelExit 104 MQCNO_FASTPATH_BINDING variations by environment 96 MQConnection class 313 MQConnectionConsumer class 277, 318 MQConnectionFactory class 319 MQConnectionManager 181 MQConnectionMetaData class 335 MQDeliveryMode class 337 MQDestination class 338 MQDistributionList 107 MQDistributionListItem 109 MQEnvironment 68, 74, 110 MQException 117 MQGetMessageOptions 119 MQGetMessageOptions fields platform dependency 98 MQGMO_* values variations by environment 96 MQIVP listing 17 sample application 16 tracing 17 mqjavac using to verify 29 MQManagedObject 123 MQMD (MQSeries Message Descriptor) 261 MQMD fields platform dependency 99 MQMessage 76, 126 MQMessageConsumer class 363 MQMessageProducer interface 367 MQMessageTracker 144 MQObjectMessage class 374 MQPMO_* values variations by environment 96 MQPMRF_* values variations by environment 96 MQPoolServices 146 MQPoolServicesEvent 147 MQPoolServicesEventListener 180 MQPoolToken 149 MQProcess 150
MQPutMessageOptions 152 MQPutMessageOptions fields platform dependency 98 MQQueue 76, 155 (JMS object) 47 class 375 for verification 32 MQQueueBrowser class 377 MQQueueConnection class 379 MQQueueConnectionFactory (JMS object) 47 class 381 for verification 32 interface 381 object 200 set methods 202 MQQueueEnumeration class 373 MQQueueManager 75, 163 MQQueueManager begin() method platform dependency 98 MQQueueManager constructor platform dependency 98 MQQueueReceiver class 384 MQQueueSender interface 387 MQQueueSession class 390 MQReceiveExit 182 MQRFH2 header 262 mcd folder of the 471 MQRO_* values variations by environment 97 MQSecurityExit 184 MQSendExit 186 MQSession class 277, 393 MQSimpleConnectionManager 176 MQTemporaryQueue class 413 MQTemporaryTopic class 414 MQTopic (JMS object) 47 class 416 MQTopicConnection class 420 MQTopicConnectionFactory (JMS object) 47 class 423 object 200 MQTopicPublisher class 431 MQTopicSession class 436 MQTopicSubscriber class 440 MQXAConnection class 441 MQXAConnectionFactory class 443 MQXAQueueConnection class 445 MQXAQueueConnectionFactory class 446 MQXAQueueSession class 448 MQXASession class 449 MQXATopicConnection class 451 MQXATopicConnectionFactory class 452 MQXATopicSession class 454 MSGBATCHSZ object property 49, 457 MSGRETENTION object property 49, 457 MSGSELECTION object property 49, 457 MULTICAST object property 49, 457 multithreaded programs 79 MyServerSession.java 285 MyServerSessionPool.java 285
N
NAME_PREFIX property 43 NAME_READABILITY_MARKER property 43 names, of Topics 221 naming considerations, LDAP 48 non-durable subscribers 224
O
object creation, error conditions 59 object use, error conditions 59 ObjectMessage interface 374 type 207 objects administered 200 JMS, administering 45 JMS, creating 48 JMS, properties 49 message 257 retrieving from JNDI 200 objects and properties, valid combinations 52 obtaining a session 203 using JMS 1.1 238 one-phase optimization with WebSphere Application Server V4 476 operations on queue managers 74 options connection 4 subscribers 224 overview 3
P
package com.ibm.jms 299 com.mq.ibm.jms 298 javax.jms 295 PERSISTENCE object property 49, 457 platform differences 485 point-to-point installation verification 31 poison messages 280 POLLINGINT object property 49, 457 PORT object property 49, 457 ports, specifying a range for client connections WebSphere MQ base Java 68 WebSphere MQ JMS 203 WebSphere MQ JMS 1.1 237 postcard.ini 24 prerequisite software 6 PRIORITY object property 49, 457 problems, solving 17, 38 problems, solving in publish/subscribe mode 229 processes, accessing 75 programmers, introduction 63 programming bindings connection 68 client connections 67 compiling 93 connections 67 multithreaded 79
512
Using Java
programming (continued) tracing 94 writing 67 programming interface 64 programs JMS 1.1, writing 235 JMS publish/subscribe, writing 213 JMS, writing 199 running 38, 94 tracing 38 properties client 56 dependencies 56 for Secure Sockets Layer 58 for WebSphere MQ Event Broker 57 mapping between admin. tool and programs 457 message 257 of exit strings 57 of JMS objects 49 queue, setting 204 properties and objects, valid combinations 52 PROVIDER_PASSWORD property 43 PROVIDER_URL property 42 PROVIDER_USERDN property 43 providerutil.jar 9 PROXYHOSTNAME object property 49, 457 PROXYPORT object property 49, 457 PSIVT (Installation Verification Test program) 35 PSIVTRun utility 35, 461 PSReportDump application 233 PUBACKINT object property 49, 457 publications (publish/subscribe), local suppressing 225 publish/subscribe installation verification test program (PSIVT) 35 sample application with WebSphere Application Server V4 478 setup for 26 publish/subscribe broker, connecting to 469 publishing messages 219
R
range of ports, specifying for client connections WebSphere MQ base Java 68 WebSphere MQ JMS 203 WebSphere MQ JMS 1.1 237 reading strings 77 receiving messages 207 messages in publish/subscribe mode 219 messages using JMS 1.1 241 RECEXIT object property 49, 457 RECEXITINIT object property 49, 457 report options, message 133, 281 reports, broker 233 resources closing 208 closing using JMS 1.1 252 restrictions and variations to core classes 485 retrieving objects from JNDI 200 runjms utility 38, 461 running applets 93 applications under CICS Transaction Server 485 in a Web browser 5 programs 38 standalone program 5 the IVT 31 the PSIVT 35 WebSphere MQ classes for Java programs 94 with appletviewer 5 your own programs 17 runtime creating factories 201 creating Topics 223 errors, handling 209 errors, handling using JMS 1.1 252
Q
QMANAGER object property 49, 457 Queue interface 375 object 200 queue manager configuring for clients 15 connecting to 75 disconnecting from 75 operations on 74 QUEUE object property 49, 457 queue properties setting 204 setting with set methods 206 QueueBrowser interface 377 QueueConnection interface 379 QueueReceiver interface 384 QueueRequestor class 385 queues, accessing 75
S
sample applet using to verify 29 sample application bean-managed transactions 478 bindings mode 72 container-managed transactions 477 publish/subscribe 215 publish/subscribe with WebSphere Application Server V4 478 tracing 17 using Application Server Facilities 287 using to verify 16 WebSphere MQ JMS with WebSphere Application Server V4 476 sample classpath settings 10 sample code applet 69
sample code (continued) ServerSession 283 ServerSessionPool 283 Sample1EJB.java 477 Sample2EJB.java 478 Sample3EJB.java 478 schema definition, LDAP 463 schema, LDAP server 463 scripts provided with WebSphere MQ classes for Java Message Service 461 SECEXIT object property 49, 457 SECEXITINIT object property 49, 457 Secure Sockets Layer 79, 210 certificate revocation list (CRL) 91 CipherSpecs 90, 487 CipherSuites 90 CipherSuites supported 487 distinguished names (DN) 90 enabling 90 handled by JSSE 89, 210, 253 introduction 89, 210, 253 properties 58 SSLCERTSTORES 211, 255 SSLCIPHERSUITE 210, 254 SSLPEERNAME 210, 254 sslCertStores property 92 sslCipherSuite property 90 sslPeerName property 90 sslSocketFactory property 92 using JMS 1.1 253 with user exits 79 security considerations, JNDI 43 Security policy definition file, editing 13 SECURITY_AUTHENTICATION property 42, 43 selecting a subset of messages 208, 257 selectors message 208, 257 message in publish/subscribe mode 224 message, and SQL 258 SENDEXIT object property 49, 457 SENDEXITINIT object property 49, 457 sending messages 204 messages using JMS 1.1 240 ServerSession sample code 283 ServerSessionPool sample code 283 session obtaining 203 obtaining using JMS 1.1 238 Session class 277 Session interface 199, 393 set and inquire 78 set methods on MQQueueConnectionFactory 202 using to set queue properties 206 setJMSType method 471 setting queue properties 204 queue properties with set methods 206 shutting down applications 209 software, prerequisites 6 solving problems 17 general 38 in publish/subscribe mode 229 Index
513
SPARSESUBS object property 49, 457 SQL for message selectors 258 SSL See Secure Sockets Layer SSLCERTSTORES object property 211, 255 sslCertStores property 92 SSLCIPHERSUITE object property 49, 58, 210, 254, 457 sslCipherSuite property 90 SSLCRL object property 49, 58, 457 SSLPEERNAME object property 49, 58, 210, 254, 457 sslPeerName property 90 sslSocketFactory property 92 standalone program, running 5 starting a connection 201 starting the administration tool 41 STATREFRESHINT object property 49, 457 stream message 257 StreamMessage interface 405 type 207 strings, reading and writing 77 subcontexts, manipulating 45 subscriber cleanup utility 230 subscriber options 224 subscriptions, receiving 219 subset of messages, selecting 208, 257 SUBSTORE object property 49 Sun JMS interfaces and classes 295 Sun Web site 3 SupportPac MA1G special considerations for 483 suppressing local publications 225 switch file for JTA/JDBC 87 SYNCPOINTALLGETS object property 49, 457
TopicConnectionFactory (continued) interface 423 TopicLoad.java 291 TopicPublisher 219 interface 431 TopicRequestor class 434 TopicSession 217 interface 436 TopicSubscriber 219 interface 440 trace, default output location 38 tracing programs 94 the sample application 17 WebSphere MQ for Java Message Service 38 transactions bean-managed 476 container-managed 476 sample application 477, 478 TRANSPORT object property 49, 457 transport, choosing 202 two-phase commit with WebSphere Application Server V4 476 types of JMS message 206, 257
VisiBroker using 4
W
Web browser using 5 Web server, configuring 12 WebSphere Application Server 283 configuration 44 CosNaming namespace 42 CosNaming repository 42, 44 WebSphere Application Server V4 JMS JTA/XA Interface 475 using with JMS 475 WebSphere Business Integration Event Broker, connecting to configuring a client for a multicast connection 473 configuring a client for connection through a proxy server 473 configuring a client for HTTP tunnelling 473 configuring a client for SSL authentication 472 configuring the broker for a direct connection 470 WebSphere Business Integration Message Broker, connecting to configuring a client for a multicast connection 473 configuring a client for connection through a proxy server 473 configuring a client for HTTP tunnelling 473 configuring a client for SSL authentication 472 configuring the broker for a direct connection 470 WebSphere MQ connection, losing 230 exceptions 209 interfaces 199 messages 261 WebSphere MQ classes for Java classes 101 WebSphere MQ Event Broker connecting as publish/subscribe broker 469 WebSphere MQ Event Broker properties 57 WebSphere MQ Integrator V2 connecting as publish/subscribe broker 469 transforming and routing messages 471 WebSphere MQ Message Descriptor (MQMD) 261 mapping with JMS 265 WebSphere MQ Publish/Subscribe 26 WebSphere MQ supported verbs 64 wildcards in topic names 221 writing JMS 1.1 applications 235 JMS applications 199 JMS publish/subscribe applications 213
U
unexpected application termination 230 uniform resource identifier (URI) for queue properties 204 URI for queue properties 204 USE_INITIAL_DIR_CONTEXT property 43 USECONNPOOLING object property 457 USECONPOOLING object property 49 user exits with SSL 79 writing 79, 209 writing using JMS 1.1 253 uses for WebSphere MQ 4 using WebSphere MQ base Java 15 utilities provided with WebSphere MQ classes for Java Message Service 461
T
TARGCLIENT object property 49, 457 TCP/IP client verifying 16 connection, programming 67 TEMPMODEL object property 49, 457 TemporaryQueue interface 413 TemporaryTopic interface 414 TEMPQPREFIX object property 49 termination, unexpected 230 testing WebSphere MQ classes for Java programs 94 text message 257 TextMessage interface 415 type 207 tokens, connection pooling 80 Topic interface 217, 416 names 221 names, wildcards 221 object 200 TOPIC object property 49, 457 TopicConnection 217 interface 420 TopicConnectionFactory 217
V
valid combinations of objects and properties 52 verbs, WebSphere MQ supported 64 verification with JNDI (point-to-point) 32 with JNDI (publish/subscribe) 36 without JNDI (point-to-point) 31 without JNDI (publish/subscribe) 35 verifying client mode installation 29 TCP/IP clients 16 with the sample applet 29 with the sample application 16 your installation 19 versions of software required 6
514
Using Java
writing (continued) programs 67 strings 77 user exits 79, 209 user exits using JMS 1.1
253
X
XAConnection interface 441 XAConnectionFactory interface 443 XAQueueConnection interface 379, 445 XAQueueConnectionFactory interface 381, 446 XAQueueSession interface 448 XAResource 449 XASession interface 449 XATopicConnection interface 451 XATopicConnectionFactory interface 452 XATopicSession interface 454
Z
z/OS and OS/390 differences with 97
Index
515
516
Using Java
517
518
Using Java
Printed in USA
SC34-6066-02
Spine information:
WebSphere MQ
Using Java