type=page
status=published
title=Overview of the JMS API
next=jms-concepts002.html
prev=jms-concepts.html
~~~~~~
Overview of the JMS API
=======================

[[BNCDR]]

[[overview-of-the-jms-api]]
Overview of the JMS API
-----------------------

This overview defines the concept of messaging, describes the JMS API
and where it can be used, and explains how the JMS API works within the
Java EE platform.

The following topics are addressed here:

* link:#BNCDS[What Is Messaging?]
* link:#BNCDT[What Is the JMS API?]
* link:#BNCDU[When Can You Use the JMS API?]
* link:#BNCDW[How Does the JMS API Work with the Java EE Platform?]

[[BNCDS]]

[[what-is-messaging]]
What Is Messaging?
~~~~~~~~~~~~~~~~~~

Messaging is a method of communication between software components or
applications. A messaging system is a peer-to-peer facility: A messaging
client can send messages to, and receive messages from, any other
client. Each client connects to a messaging agent that provides
facilities for creating, sending, receiving, and reading messages.

Messaging enables distributed communication that is loosely coupled. A
component sends a message to a destination, and the recipient can
retrieve the message from the destination. What makes the communication
loosely coupled is that the destination is all that the sender and
receiver have in common. The sender and the receiver do not have to be
available at the same time in order to communicate. In fact, the sender
does not need to know anything about the receiver; nor does the receiver
need to know anything about the sender. The sender and the receiver need
to know only which message format and which destination to use. In this
respect, messaging differs from tightly coupled technologies, such as
Remote Method Invocation (RMI), which require an application to know a
remote application's methods.

Messaging also differs from electronic mail (email), which is a method
of communication between people or between software applications and
people. Messaging is used for communication between software
applications or software components.

[[BNCDT]]

[[what-is-the-jms-api]]
What Is the JMS API?
~~~~~~~~~~~~~~~~~~~~

The Java Message Service is a Java API that allows applications to
create, send, receive, and read messages. The JMS API defines a common
set of interfaces and associated semantics that allow programs written
in the Java programming language to communicate with other messaging
implementations.

The JMS API minimizes the set of concepts a programmer must learn in
order to use messaging products but provides enough features to support
sophisticated messaging applications. It also strives to maximize the
portability of JMS applications across JMS providers.

JMS enables communication that is not only loosely coupled but also

* Asynchronous: A receiving client does not have to receive messages at
the same time the sending client sends them. The sending client can send
them and go on to other tasks; the receiving client can receive them
much later.
* Reliable: A messaging provider that implements the JMS API can ensure
that a message is delivered once and only once. Lower levels of
reliability are available for applications that can afford to miss
messages or to receive duplicate messages.

The current version of the JMS specification is Version 2.0. You can
download a copy of the specification from the Java Community Process
website: `http://www.jcp.org/en/jsr/detail?id=343`.

[[BNCDU]]

[[when-can-you-use-the-jms-api]]
When Can You Use the JMS API?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

An enterprise application provider is likely to choose a messaging API
over a tightly coupled API, such as a remote procedure call (RPC), under
the following circumstances.

* The provider wants the components not to depend on information about
other components' interfaces, so components can be easily replaced.
* The provider wants the application to run whether or not all
components are up and running simultaneously.
* The application business model allows a component to send information
to another and to continue to operate without receiving an immediate
response.

For example, components of an enterprise application for an automobile
manufacturer can use the JMS API in situations like the following.

* The inventory component can send a message to the factory component
when the inventory level for a product goes below a certain level so the
factory can make more cars.
* The factory component can send a message to the parts components so
the factory can assemble the parts it needs.
* The parts components in turn can send messages to their own inventory
and order components to update their inventories and to order new parts
from suppliers.
* Both the factory and the parts components can send messages to the
accounting component to update budget numbers.
* The business can publish updated catalog items to its sales force.

Using messaging for these tasks allows the various components to
interact with one another efficiently, without tying up network or other
resources. link:#BNCDV[Figure 48-1] illustrates how this simple example
might work.

[[BNCDV]]

.*Figure 48-1 Messaging in an Enterprise Application*
image:img/javaeett_dt_026.png[
"Diagram showing messaging between various departments in an enterprise"]

Manufacturing is only one example of how an enterprise can use the JMS
API. Retail applications, financial services applications, health
services applications, and many others can make use of messaging.

[[BNCDW]]

[[how-does-the-jms-api-work-with-the-java-ee-platform]]
How Does the JMS API Work with the Java EE Platform?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

When the JMS API was first introduced, its most important purpose was to
allow Java applications to access existing messaging-oriented middleware
(MOM) systems. Since that time, many vendors have adopted and
implemented the JMS API, so a JMS product can now provide a complete
messaging capability for an enterprise.

The JMS API is an integral part of the Java EE platform, and application
developers can use messaging with Java EE components. JMS 2.0 is part of
the Java EE 8 release.

The JMS API in the Java EE platform has the following features.

* Application clients, Enterprise JavaBeans (EJB) components, and web
components can send or synchronously receive a JMS message. Application
clients can in addition set a message listener that allows JMS messages
to be delivered to it asynchronously by being notified when a message is
available.
* Message-driven beans, which are a kind of enterprise bean, enable the
asynchronous consumption of messages in the EJB container. An
application server typically pools message-driven beans to implement
concurrent processing of messages.
* Message send and receive operations can participate in Java
Transaction API (JTA) transactions, which allow JMS operations and
database accesses to take place within a single transaction.

The JMS API enhances the other parts of the Java EE platform by
simplifying enterprise development, allowing loosely coupled, reliable,
asynchronous interactions among Java EE components and legacy systems
capable of messaging. A developer can easily add new behavior to a Java
EE application that has existing business events by adding a new
message-driven bean to operate on specific business events. The Java EE
platform, moreover, enhances the JMS API by providing support for JTA
transactions and allowing for the concurrent consumption of messages.
For more information, see the Enterprise JavaBeans specification, v3.2.

The JMS provider can be integrated with the application server using the
Java EE Connector architecture. You access the JMS provider through a
resource adapter. This capability allows vendors to create JMS providers
that can be plugged in to multiple application servers, and it allows
application servers to support multiple JMS providers. For more
information, see the Java EE Connector architecture specification, v1.7.
