Package javax.jms
The Java Message Service (JMS) API provides a common way for Java programs to create, send, receive and read an enterprise messaging system's messages.
JMS Applications
A JMS application is composed of the following parts:
- JMS provider - a messaging system that implements the JMS API in addition to the other administrative and control functionality required of a full-featured messaging product
- JMS clients - the Java language programs that send and receive messages
- Messages - objects that are used to communicate information between the clients of an application
- Administered objects - provider-specific objects that clients look up and use to interact portably with a JMS provider
- Non-JMS clients - clients that use a message system's native client API instead of the JMS API. If the application predated the availability of the JMS API, it is likely that it will include both JMS clients and non-JMS clients.
Administration
JMS providers differ significantly in their implementations of underlying messaging technology. There are also major differences in how a JMS provider's system is installed and administered.
For JMS clients to be portable, they must be isolated from these proprietary aspects of a provider. This is done by defining JMS administered objects that are created and customised by a provider's administrator and later used by clients. The client uses them through JMS interfaces that are portable. The administrator creates them using provider-specific facilities.
There are two types of JMS administered objects:
ConnectionFactory
- the object a client uses to create a connection with a JMS providerDestination
- the object a client uses to specify the destination of messages it is sending and the source of messages it receives
Administered objects are placed by an administrator in a JNDI (Java Naming and Directory Interface) namespace. A JMS client typically notes in its documentation the JMS administered objects it requires and how the JNDI names of these objects should be provided to it.
Two Messaging Styles
JMS supports two styles of messaging:
- point-to-point (PTP) messaging using queues
- publish-and-subscribe (pub/sub)messaging using topics
These two styles represent two of the dominant approaches to messaging currently in use.
JMS APIs
For historical reasons JMS offers four alternative sets of interfaces for sending and receiving messages:
- JMS 1.0 defined two domain-specific APIs, one for point-to-point messaging (queues) and one for pub/sub (topics). Although these remain part of JMS for reasons of backwards compatibility they should be considered to be completely superseded by the later APIs.
- JMS 1.1 introduced a new unified API which offered a single set of interfaces that could be used for both point-to-point and pub/sub messaging. This is referred to here as the classic API.
- JMS 2.0 introduces a simplified API which offers all the features of the classic API but which requires fewer interfaces and is simpler to use.
Each API offers a different set of interfaces for connecting to a JMS provider and for sending and receiving messages. However they all share a common set of interfaces for representing messages and message destinations and to provide various utility features.
All interfaces are in the javax.jms
package.
Interfaces common to multiple APIs
The main interfaces common to multiple APIs are as follows:
Message
,BytesMessage
,MapMessage
,ObjectMessage
,StreamMessage
andTextMessage
- a message sent to or received from a JMS provider.Queue
- an administered object that encapsulates the identity of a message destination for point-to-point messagingTopic
- an administered object that encapsulates the identity of a message destination for pub/sub messaging.Destination
- the common supertype ofQueue
andTopic
Classic API interfaces
The main interfaces provided by the classic API are as follows:ConnectionFactory
- an administered object used by a client to create aConnection
. This interface is also used by the simplified API.Connection
- an active connection to a JMS providerSession
- a single-threaded context for sending and receiving messagesMessageProducer
- an object created by a Session that is used for sending messages to a queue or topicMessageConsumer
- an object created by a Session that is used for receiving messages sent to a queue or topic
Simplified API interfaces
The simplified API provides the same messaging functionality as the classic API but requires fewer interfaces and is simpler to use. The main interfaces provided by the simplified API are as follows:ConnectionFactory
- an administered object used by a client to create aJMSContext
. This interface is also used by the classic API.JMSContext
- an active connection to a JMS provider and a single-threaded context for sending and receiving messagesJMSProducer
- an object created by aJMSContext
that is used for sending messages to a queue or topicJMSConsumer
- an object created by aJMSContext
that is used for receiving messages sent to a queue or topic
Legacy domain-specific API interfaces
Although the domain-specific API remains part of JMS for reasons of backwards compatibility it should be considered to be completely superseded by the classic and simplified APIs.
The main interfaces provided by the domain-specific API for point-to-point messaging are as follows:
QueueConnectionFactory
- an administered object used by a client to create aQueueConnection
.QueueConnection
- an active connection to a JMS providerQueueSession
- a single-threaded context for sending and receiving messagesQueueSender
- an object created by aQueueSession
that is used for sending messages to a queueQueueReceiver
- an object created by aQueueSession
that is used for receiving messages sent to a queue
TopicConnectionFactory
- an administered object used by a client to create aTopicConnection
.TopicConnection
- an active connection to a JMS providerTopicSession
- a single-threaded context for sending and receiving messagesTopicPublisher
- an object created by aTopicSession
that is used for sending messages to a topicTopicSubscriber
- an object created by aTopicSession
that is used for receiving messages sent to a topic
Terminology for sending and receiving messages
The term consume is used in this document to mean the receipt of a message by a JMS client; that is, a JMS provider has received a message and has given it to its client. Since JMS supports both synchronous and asynchronous receipt of messages, the term consume is used when there is no need to make a distinction between them.
The term produce is used as the most general term for sending a message. It means giving a message to a JMS provider for delivery to a destination.
Developing a JMS Application
Broadly speaking, a JMS application is one or more JMS clients that exchange messages. The application may also involve non-JMS clients; however, these clients use the JMS provider's native API in place of the JMS API.
A JMS application can be architected and deployed as a unit. In many cases, JMS clients are added incrementally to an existing application.
The message definitions used by an application may originate with JMS, or they may have been defined by the non-JMS part of the application.
Developing a JMS Client
A typical JMS client using the classic API executes the following JMS setup procedure:
- Use JNDI to find a
ConnectionFactory
object - Use JNDI to find one or more
Destination
objects - Use the ConnectionFactory to create a JMS
Connection
object with message delivery inhibited - Use the Connection to create one or more JMS
Session
objects - Use a Session and the Destinations to create the
MessageProducer
andMessageConsumer
objects needed - Tell the
Connection
to start delivery of messages
In contrast, a typical JMS client using the simplified API does the following:
- Use JNDI to find a
ConnectionFactory
object - Use JNDI to find one or more
Destination
objects - Use the
ConnectionFactory
to create aJMSContext
object - Use the
JMSContext
to create theJMSProducer
andJMSConsumer
objects needed. - Delivery of message is started automatically
At this point a client has the basic JMS setup needed to produce and consume messages.
Package Specification
Java Message Service 2.0 specification
Related Documentation
Java Platform, Enterprise Edition (Java EE) Technical Documentation
-
ClassDescriptionA
BytesMessage
object is used to send a message containing a stream of uninterpreted bytes.ACompletionListener
is implemented by the application and may be specified when a message is sent asynchronously.AConnection
object is a client's active connection to its JMS provider.For application servers,Connection
objects provide a special facility for creating aConnectionConsumer
(optional).AConnectionFactory
object encapsulates a set of connection configuration parameters that has been defined by an administrator.AConnectionMetaData
object provides information describing theConnection
object.The delivery modes supported by the JMS API arePERSISTENT
andNON_PERSISTENT
.ADestination
object encapsulates a provider-specific address.If a JMS provider detects a serious problem with aConnection
object, it informs theConnection
object'sExceptionListener
, if one has been registered.This exception is thrown when a method is invoked at an illegal or inappropriate time or if the provider is not in an appropriate state for the requested operation.This unchecked exception is thrown when a method is invoked at an illegal or inappropriate time or if the provider is not in an appropriate state for the requested operation, and the method signature does not permit aIllegalStateRuntimeException
to be thrown.This exception must be thrown when a client attempts to set a connection's client ID to a value that is rejected by a provider.This unchecked exception must be thrown when a client attempts to set a connection's client ID to a value that is rejected by a provider, and the method signature does not permit aInvalidClientIDException
to be thrown.This exception must be thrown when a destination either is not understood by a provider or is no longer valid.This unchecked exception must be thrown when a destination either is not understood by a provider or is no longer valid, and the method signature does not permit aInvalidDestinationException
to be thrown.This exception must be thrown when a JMS client attempts to give a provider a message selector with invalid syntax.This unchecked exception must be thrown when a JMS client attempts to give a provider a message selector with invalid syntax, and the method signature does not permit aInvalidSelectorException
to be thrown.This annotation may be used to specify the JNDI lookup name of ajavax.jms.ConnectionFactory
to be used when injecting ajavax.jms.JMSContext
object.An application may use this annotation to specify a JMSConnectionFactory
resource that it requires in its operational environment.Specifies one or moreJMSConnectionFactoryDefinition
annotations.A client using the simplified JMS API introduced for JMS 2.0 uses aJMSConsumer
object to receive messages from a queue or topic.AJMSContext
is the main interface in the simplified JMS API introduced for JMS 2.0.An application may use this annotation to specify a JMSDestination
resource that it requires in its operational environment.Specifies one or moreJMSDestinationDefinition
annotations.This is the root class of all checked exceptions in the JMS API.This annotation may be used to specify the userName and password to be used when injecting ajavax.jms.JMSContext
object.AJMSProducer
is a simple object used to send messages on behalf of aJMSContext
.This is the root class of all unchecked exceptions in the JMS API.This exception must be thrown when a provider rejects a user name/password submitted by a client.This unchecked exception must be thrown when a provider rejects a user name/password submitted by a client, or for any case where a security restriction prevents a method from completing, and the method signature does not permit aJMSSecurityException
to be thrown.This annotation may be used to specify the session mode to be used when injecting ajavax.jms.JMSContext
object.AMapMessage
object is used to send a set of name-value pairs.TheMessage
interface is the root interface of all JMS messages.A client uses aMessageConsumer
object to receive messages from a destination.This exception must be thrown when an unexpected end of stream has been reached when aStreamMessage
orBytesMessage
is being read.This exception must be thrown when a JMS client attempts to use a data type not supported by a message or attempts to read data in a message as the wrong type.This unchecked exception must be thrown when a JMS application attempts to use a data type not supported by a message or attempts to read data in a message as the wrong type, and the method signature does not permit aMessageFormatException
to be thrown.AMessageListener
object is used to receive asynchronously delivered messages.This exception must be thrown when a JMS client attempts to read a write-only message.This exception must be thrown when a JMS client attempts to write to a read-only message.This unchecked exception must be thrown when a JMS client attempts to write to a read-only message.A client uses aMessageProducer
object to send messages to a destination.AnObjectMessage
object is used to send a message that contains a serializable object in the Java programming language ("Java object").AQueue
object encapsulates a provider-specific queue name.A client uses aQueueBrowser
object to look at messages on a queue without removing them.AQueueConnection
object is an active connection to a point-to-point JMS provider.A client uses aQueueConnectionFactory
object to createQueueConnection
objects with a point-to-point JMS provider.A client uses aQueueReceiver
object to receive messages that have been delivered to a queue.TheQueueRequestor
helper class simplifies making service requests.A client uses aQueueSender
object to send messages to a queue.AQueueSession
object provides methods for creatingQueueReceiver
,QueueSender
,QueueBrowser
, andTemporaryQueue
objects.This exception is thrown when a provider is unable to allocate the resources required by a method.This unchecked exception is thrown when a provider is unable to allocate the resources required by a method.AServerSession
object is an application server object that is used by a server to associate a thread with a JMS session (optional).AServerSessionPool
object is an object implemented by an application server to provide a pool ofServerSession
objects for processing the messages of aConnectionConsumer
(optional).ASession
object is a single-threaded context for producing and consuming messages.AStreamMessage
object is used to send a stream of primitive types in the Java programming language.ATemporaryQueue
object is a uniqueQueue
object created for the duration of aConnection
.ATemporaryTopic
object is a uniqueTopic
object created for the duration of aConnection
.ATextMessage
object is used to send a message containing ajava.lang.String
.ATopic
object encapsulates a provider-specific topic name.ATopicConnection
object is an active connection to a publish/subscribe JMS provider.A client uses aTopicConnectionFactory
object to createTopicConnection
objects with a publish/subscribe JMS provider.A client uses aTopicPublisher
object to publish messages on a topic.TheTopicRequestor
helper class simplifies making service requests.ATopicSession
object provides methods for creatingTopicPublisher
,TopicSubscriber
, andTemporaryTopic
objects.A client uses aTopicSubscriber
object to receive messages that have been published to a topic.This exception is thrown when an operation is invalid because a transaction is in progress.This unchecked exception is thrown when an operation is invalid because a transaction is in progress.This exception must be thrown when a call toSession.commit
results in a rollback of the current transaction.This unchecked exception must be thrown when a call toJMSContext.commit
results in a rollback of the current transaction.TheXAConnection
interface extends the capability ofConnection
by providing anXASession
(optional).TheXAConnectionFactory
interface is a base interface for theXAQueueConnectionFactory
andXATopicConnectionFactory
interfaces.TheXAJMSContext
interface extends the capability ofJMSContext
by adding access to a JMS provider's support for the Java Transaction API (JTA) (optional).AnXAQueueConnection
provides the same create options asQueueConnection
(optional).AnXAQueueConnectionFactory
provides the same create options as aQueueConnectionFactory
(optional).AnXAQueueSession
provides a regularQueueSession
, which can be used to createQueueReceiver
,QueueSender
, andQueueBrowser
objects (optional).TheXASession
interface extends the capability ofSession
by adding access to a JMS provider's support for the Java Transaction API (JTA) (optional).AnXATopicConnection
provides the same create options asTopicConnection
(optional).AnXATopicConnectionFactory
provides the same create options as aTopicConnectionFactory
(optional).AnXATopicSession
provides a regularTopicSession
.