blob: e7e5954a4d405bbda470c1fab1c1c3cf7e0a7661 [file] [log] [blame]
type=page
status=published
title=Administering the Java Message Service (JMS)
next=jndi.html
prev=javamail.html
~~~~~~
= Administering the Java Message Service (JMS)
[[GSADG00020]][[abljw]]
[[administering-the-java-message-service-jms]]
== 17 Administering the Java Message Service (JMS)
The Java Message Service (JMS) API is a messaging standard that allows
Jakarta EE applications and components, including message-driven beans
(MDBs), to create, send, receive, and read messages. It enables
distributed communication that is loosely coupled, reliable, and
asynchronous.
{productName} supports JMS messaging by communicating with a JMS
provider through a Jakarta EE Connector resource adapter. By default,
{productName} provides JMS messaging through its built-in jmsra
resource adapter communicating with Open Message Queue, which is
included with {productName}. This combination, known as the JMS
Service, is tightly integrated with {productName}, providing a rich
set of `asadmin` subcommands and Administration Console pages to
simplify JMS messaging administration tasks.
{productName} also supports the Generic Resource Adapter for JMS
(GenericJMSRA) for use as a resource adapter to connect to other JMS
providers. The last section in this chapter, link:#gbtvg[Using the
Generic Resource Adapter for JMS to Integrate Supported External JMS
Providers], describes the GenericJMSRA and provides instructions for
using it to make other supported JMS providers available to {productName}.
The following topics are addressed here:
* link:#gipit[About the JMS Service]
* link:#beaof[Updating the JMS Service Configuration]
* link:#gipbg[Administering JMS Hosts]
* link:#ablkb[Administering JMS Connection Factories and Destinations]
* link:#ablkj[Administering JMS Physical Destinations]
* link:#gkxgk[Special Situations When Using the JMS Service]
* link:#gipnh[Troubleshooting the JMS Service]
* link:#gbtvg[Using the Generic Resource Adapter for JMS to Integrate
Supported External JMS Providers]
Instructions for accomplishing the task in this chapter by using the
Administration Console are contained in the Administration Console
online help.
[[gipit]][[GSADG00595]][[about-the-jms-service]]
=== About the JMS Service
To support JMS messaging, the JMS Service provides the following
administrative objects:
JMS Service Configuration::
The JMS service configuration is part of the overall configuration for
a GlassFish standalone instance or cluster. It specifies how the JMS
Service is to create and maintain connections with JMS Hosts.
JMS Hosts::
JMS hosts are the message servers that host destinations, store
messages, and interact with applications to send and receive messages
across connections. In Message Queue, JMS hosts are called brokers. +
The JMS service supports these types of JMS hosts:
* Embedded type, in which the JMS host runs in the same JVM as the
GlassFish instance; its configuration and lifecycle are managed by the JMS service.
* Local type, in which the JMS host runs separately on the same host
as the GlassFish instance; its configuration and lifecycle are managed by the JMS service.
* Remote type, in which the JMS host represents a Message Queue broker
or broker cluster that is external to the JMS service; its operation
is managed using Message Queue administrative tools.
+
For more information about JMS host types, see link:#giplw[About JMS Host Types].
JMS Connection Factory Resources::
JMS connection factory resources house the information that
applications use to connect to a JMS provider. For each JMS connection
factory, the JMS service automatically maintains a GlassFish connector
resource and a GlassFish connector connection pool in order to support
connection pooling and failover.
JMS Destination Resources::
JMS destination resources house the information that applications use
to specify the target destination of messages they produce and the
source destination of messages they consume. For each JMS destination
resource, the JMS service automatically maintains a GlassFish
administered object.
JMS Physical Destinations::
JMS physical destinations provide a means to create and manage JMS
destinations administratively instead of having them created
dynamically when needed by an application. While dynamic creation of
destinations is often sufficient during application development,
administratively created physical destinations are more suitable for
production environments.
[[gavqn]][[GSADG00773]][[jms-service-high-availability]]
==== JMS Service High Availability
Just as {productName} supports clusters of instances to provide high
availability, Message Queue supports clusters of brokers to provide
service availability or service and data availability, depending on the
type of broker cluster, as described in "link:../openmq/mq-tech-over/broker-clusters.html#GMTOV00028[Broker
Clusters]" in Open Message Queue Technical Overview.
The JMS service takes advantage of this Message Queue capability and
automatically creates and manages a Message Queue broker cluster when a
GlassFish cluster's configuration specifies Embedded or Local type JMS
hosts. Additionally, both GlassFish clusters and standalone instances
can use Message Queue broker clusters as Remote type JMS hosts.
For information about how the JMS service supports GlassFish clusters
and Message Queue broker clusters, see "link:ha-administration-guide/jms.html#GSHAG00012[Configuring
Java Message Service High Availability]" in {productName} High Availability Administration Guide.
[[beaof]][[GSADG00596]][[updating-the-jms-service-configuration]]
=== Updating the JMS Service Configuration
Because the JMS service configuration is part of the overall
configuration for a standalone instance or cluster, it is created when
the standalone instance or cluster is created. You can then update the
JMS service configuration by using the Java Message Service page for the
configuration in the Administration Console, or by using a `set`
subcommand of the following form:
[source]
----
set configs.config.config-name.jms-service.attribute-name=attribute-value
----
The attributes you can set are:
`type`::
The JMS host type the service is to use. Available choices are
`EMBEDDED`, `LOCAL` and `REMOTE`. See link:#giplw[About JMS Host
Types] for more information.
`init-timeout-in-seconds`::
The number of seconds {productName} waits for the JMS service to
start before aborting the startup.
`start-args`::
A list of arguments the JMS service passes to Embedded and Local type
JMS hosts on startup. Permissible arguments are the options supported
by the Message Queue `imqbrokerd` command, as described in
"link:../openmq/mq-admin-guide/command-line-reference.html#GMADG00280[Broker Utility]" in Open Message Queue
Administration Guide.
`default-jms-host`::
The name of the default JMS host.
`reconnect-enabled`::
When set to `true`, the JMS service attempts to reconnect to a JMS
host (or one of the JMS hosts in the AddressList) when a connection is
lost.
`reconnect-attempts`::
The number of attempts to connect (or reconnect) for each JMS host in
the AddressList before the JMS service tries the next address in the
list. A value of -1 indicates that the number of reconnect attempts is
unlimited (the JMS service attempts to connect to the first address
until it succeeds).
`reconnect-interval-in-seconds`::
The number of seconds between reconnect attempts. This interval
applies for attempts on each JMS host in the AddressList and for
successive addresses in the list. If it is too short, this time
interval does not give a JMS host time to recover. If it is too long,
the reconnect might represent an unacceptable delay.
`addresslist-behavior`::
The order of connection attempts. Available choices are:
+
`random`;;
Select a JMS host from the AddressList randomly. If there are many
clients attempting a connection using the same connection factory,
specify `random` to prevent them from all being connected to the
same JMS host.
`priority`;;
Always try to connect to the first JMS host in the AddressList and
use another one only if the first one is not available.
`addresslist-iterations`::
The number of times the JMS service iterates through the AddressList
in an effort to establish (or reestablish) a connection. A value of -1
indicates that the number of attempts is unlimited.
`mq-scheme`::
`mq-service`::
The Message Queue address scheme name and connection service name to
use for the AddressList if a non-default scheme or service is to be
used. See "link:../openmq/mq-admin-guide/administered-object-attributes.html#GMADG00622[Connection Handling]" in Open Message
Queue Administration Guide for syntax information.
[NOTE]
====
After making changes to the JMS service configuration, {productName}
instances that use the configuration must be restarted in order for the
changes to be propagated.
====
[[gkxgf]][[GSADG00774]][[setting-message-queue-broker-properties-in-the-jms-service-configuration]]
==== Setting Message Queue Broker Properties in the JMS Service Configuration
You can specify any Message Queue broker property in the JMS service
configuration by adding it by name to the Additional Properties table on
the Java Message Service page for the configuration in the
Administration Console, or by using a `set` subcommand of the following
form:
[source]
----
set configs.config.config-name.jms-service.property.broker-property-name=value
----
If the broker property name includes dots, preface the dots with two
backslashes (`\\`); for example, to set the `imq.system.max_count`
property, specify `imq\\.system\\.max_count` in the `set` subcommand.
[NOTE]
====
You can also set broker properties in the JMS host. If you set the same
broker property in both the JMS service configuration and the JMS host,
the value specified in the JMS host is used.
====
[[gipbg]][[GSADG00597]][[administering-jms-hosts]]
=== Administering JMS Hosts
A JMS host represents a Message Queue broker. JMS contains a JMS hosts
list (the `AddressList` property) that contains all the JMS hosts that
are used by {productName}. The JMS hosts list is populated with the
hosts and ports of the specified Message Queue brokers and is updated
whenever a JMS host configuration changes. When you create JMS resources
or deploy message driven beans, the resources or beans inherit the JMS
hosts list.
The following topics are addressed here:
* link:#giplw[About JMS Host Types]
* link:#gktfb[Configuring Embedded and Local JMS Hosts]
* link:#gipbh[To Create a JMS Host]
* link:#gipbz[To List JMS Hosts]
* link:#givno[To Update a JMS Host]
* link:#gipbv[To Delete a JMS Host]
For information about administering JMS hosts that are servicing
GlassFish clusters, see "link:ha-administration-guide/jms.html#GSHAG00312[Configuring GlassFish Clusters
to Use Message Queue Broker Clusters]" in {productName} High Availability Administration Guide.
[[giplw]][[GSADG00775]][[about-jms-host-types]]
==== About JMS Host Types
The JMS service uses Message Queue (MQ) brokers as JMS hosts,
integrating them in three ways:
Embedded Type::
When the JMS service configuration's `type` attribute is `EMBEDDED`,
the MQ broker is co-located in the same JVM as the {productName}
instance it services. The JMS service starts it in-process and manages
its configuration and lifecycle. +
For this type, the JMS service uses lazy initialization to start the
broker when the first JMS operation is requested instead of
immediately when the GlassFish instance is started. If necessary, you
can force startup of the broker by using the
link:reference-manual/jms-ping.html#GSRFM00144[`jms-ping`] command. +
Additionally, if the GlassFish instance is a standalone instance (not
a clustered instance), JMS operations use a Message Queue feature
called direct mode to bypass the networking stack, leading to
performance optimization.
Local Type::
When the JMS service configuration's `type` attribute is `LOCAL`, the
JMS service starts the MQ broker specified in the configuration as the
default JMS host in a separate process on the same host as the
{productName} instance. The JMS service manages its configuration
and lifecycle. +
For this type, the JMS service starts the broker immediately when the
GlassFish instance is started. +
The JMS service provides the Message Queue broker an additional port
to start the RMI registry. This port number is equal to the broker's
JMS port plus 100. For example, if the JMS port number is 37676, then
the additional port's number will be 37776. Additionally, the
`start-args` property of the JMS service configuration can be used to
specify Message Queue broker startup options.
Remote Type::
When the JMS service configuration's `type` attribute is `REMOTE`, the
JMS service uses the information defined by the default JMS host to
communicate with an MQ broker or broker cluster that has been
configured and started using Message Queue tools, as described in the
link:../openmq/mq-admin-guide.html#GMADG[Open Message Queue Administration Guide]. Ongoing
administration and tuning of the broker or broker cluster are also
performed using Message Queue tools.
[[gktfb]][[GSADG00776]][[configuring-embedded-and-local-jms-hosts]]
==== Configuring Embedded and Local JMS Hosts
Because the JMS service, not Message Queue, manages Embedded and Local
JMS hosts automatically, you should avoid using Message Queue utilities
to configure them. Instead, specify broker properties in the JMS service
configuration or in the JMS host.
Should the need to use Message Queue utilities arise, you must use the
`-varhome` option when running certain Message Queue utilities to
specify the `IMQ_VARHOME` location of the Embedded or Local JMS host.
This location depends on which GlassFish instance the JMS host is
servicing:
* For `server`, the Domain Administration Server (DAS), the
`IMQ_VARHOME` location is:
+
[source]
----
domain-root-dir/domain-dir/imq
----
* For any other GlassFish instance, the `IMQ_VARHOME` location is:
+
[source]
----
as-install/nodes/node-name/instance-name/imq
----
For example, the broker log file for an Embedded or Local JMS host
servicing the DAS is available at
domain-root-dir``/``domain-dir``/imq/instances/imqbroker/log/log.txt``, and
the broker log file for an Embedded or Local JMS host servicing any
other GlassFish instance is available at
as-install``/nodes/``node-name``/``instance-name`/imq/instances/``mq-instance-name``/log/log.txt``.
[NOTE]
====
When using Message Queue utilities on the Windows platform, you must
explicitly use the Windows executable (`.exe`) versions of the
utilities, even when running command shells such as Cygwin. For example,
instead of running `imqcmd`, you must run `imqcmd.exe`.
====
[[gipbh]][[GSADG00486]][[to-create-a-jms-host]]
==== To Create a JMS Host
The default JMS service configuration includes a JMS host,
`default_JMS_host`. For most situations, this host is sufficient, so
replacing it or creating additional JMS hosts is not often necessary and
is a task for advanced users. Use the `create-jms-host` subcommand in
remote `asadmin` mode to create an additional JMS host.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. Create the JMS host by using the link:reference-manual/create-jms-host.html#GSRFM00039[`create-jms-host`]
subcommand:
+
[source]
----
asadmin> create-jms-host --mqhost hostName --mqport portNumber
--mquser adminUser --mqpassword adminPassword --target glassfishTarget
--property mqBrokerPropList --force trueFalse jms-host-name
----
`--mqhost`::
The host name of the Message Queue broker.
`--mqport`::
The port number of the Message Queue broker.
`--mquser`::
The user name of the administrative user of the Message Queue broker.
`--mqpassword`::
The password of the administrative user of the Message Queue broker.
`--target`::
The {productName} object for which the JMS host is being created.
For details, see link:reference-manual/create-jms-host.html#GSRFM00039[`create-jms-host`(1)].
`--property`::
A list of one or more Message Queue broker properties to configure the
broker. The list is colon-separated (`:`) and has the form:
+
[source]
----
prop1Name=prop1Value:prop2Name=prop2Value:...
----
If a broker property name includes dots, preface the dots with two
backslashes (`\\`); for example, to include the `imq.system.max_count`
property, specify `imq\\.system\\.max_count` in the `--property`
option.
+
[NOTE]
====
You can also set broker properties in the JMS service configuration.
If you set the same broker property in both the JMS host and the JMS
service configuration, the value specified in the JMS host is used.
====
`--force`::
Specifies whether the subcommand overwrites the existing JMS host of
the same name. The default value is `false`.
jms-host-name::
The unique name of the JMS host.
[[GSADG00271]][[gipbb]]
Example 17-1 Creating a JMS Host
This example creates a JMS host named `MyNewHost`.
[source]
----
asadmin> create-jms-host --mqhost pigeon --mqport 7677
--mquser admin --mqpassword admin MyNewHost
Jms Host MyNewHost created.
Command create-jms-host executed successfully.
----
[[GSADG1018]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help create-jms-host` at the command line.
[[gipbz]][[GSADG00487]][[to-list-jms-hosts]]
==== To List JMS Hosts
Use the `list-jms-hosts` subcommand in remote `asadmin` mode to list the
existing JMS hosts.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the JMS hosts by using the link:reference-manual/list-jms-hosts.html#GSRFM00176[`list-jms-hosts`]
subcommand.
[[GSADG00272]][[gipdw]]
Example 17-2 Listing JMS Hosts
The following subcommand lists the existing JMS hosts.
[source]
----
asadmin> list-jms-hosts
default_JMS_host
MyNewHost
Command list-jmsdest executed successfully
----
[[givno]][[GSADG00488]][[to-update-a-jms-host]]
==== To Update a JMS Host
Use the `set` subcommand in remote `asadmin` mode to update an existing
JMS host.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. Use the link:reference-manual/get.html#GSRFM00139[`get`] subcommand to list the current
attribute values of the desired JMS host:
+
[source]
----
asadmin> get configs.config.config-name.jms-service.jms-host.jms-host-name.*
----
For information about JMS host attributes, see
link:reference-manual/create-jms-host.html#GSRFM00039[`create-jms-host`(1)].
3. Use the link:reference-manual/set.html#GSRFM00226[`set`] subcommand to modify a JMS host
attribute:
+
[source]
----
asadmin> set configs.config.config-name.jms-service.jmshost.
jms-host-name.attribute-name=attribute-value
----
The attributes you can set are:::
`host`::
The host name of the Message Queue broker.
`port`::
The port number of the Message Queue broker.
`admin-user-name`::
The user name of the administrative user of the Message Queue broker.
`admin-password`::
The password of the administrative user of the Message Queue broker.
`property.`broker-property-name::
A Message Queue broker property. The property, and the value assigned
to it, are used to configure the Message Queue broker.
+
If the broker property name includes dots, preface the dots with two
backslashes (`\\`); for example, to include the `imq.system.max_count`
property, specify `imq\\.system\\.max_count` in the `set` subcommand.
+
[NOTE]
====
You can also set broker properties in the JMS service configuration.
If you set the same broker property in both the JMS host and the JMS
service configuration, the value specified in the JMS host is used.
====
[[GSADG00273]][[givlz]]
Example 17-3 Updating a JMS Host
This example changes the value of the `host` attribute of the JMS host
`default_JMS_Host`. By default this value is `localhost`.
[source]
----
asadmin> set configs.config.server-config.jms-service.jms-host.default_JMS_host.host=
"server1.middleware.example.com"
----
[[gipbv]][[GSADG00489]][[to-delete-a-jms-host]]
==== To Delete a JMS Host
Use the `delete-jms-host` subcommand in remote `asadmin` mode to delete
a JMS host from the JMS service. If you delete the only JMS host, the
JMS service will not be able to start until you create a new JMS host.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the JMS hosts by using the link:reference-manual/list-jms-hosts.html#GSRFM00176[`list-jms-hosts`]
subcommand.
3. Delete a JMS host by using the link:reference-manual/delete-jms-host.html#GSRFM00091[`delete-jms-host`]
subcommand.
[[GSADG00274]][[gipbj]]
Example 17-4 Deleting a JMS Host
This example deletes a JMS host named `MyNewHost`.
[source]
----
asadmin> delete-jms-host MyNewHost
Command delete-jms-host executed successfully.
----
[[GSADG1019]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help delete-jms-host` at the command line.
[[ablkb]][[GSADG00598]][[administering-jms-connection-factories-and-destinations]]
=== Administering JMS Connection Factories and Destinations
The JMS API uses two kinds of administered objects. Connection factory
objects allow an application to create other JMS objects
programmatically. Destination objects serve as repositories for
messages. How these objects are created is specific to each
implementation of JMS. In {productName}, JMS is implemented by
performing the following tasks:
* Creating a connection factory
* Creating a destination, which requires creating a physical destination
and a destination resource that refers to the physical destination
JMS applications use the Java Naming and Directory Interface (JNDI) API
to access the connection factory and destination resources. A JMS
application normally uses at least one connection factory and at least
one destination. By studying the application or consulting with the
application developer, you can determine what resources must be created.
The order in which the resources are created does not matter.
The Jakarta EE standard specifies that certain default resources be made
available to applications, and defines specific JNDI names for these
default resources. {productName} makes these names available through
the use of logical JNDI names, which map Jakarta EE standard JNDI names to
specific {productName} resources. For JMS connection factory
resources, the Jakarta EE standard name
`java:comp/DefaultJMSConnectionFactory` is mapped to the
`jms/__defaultConnectionFactory` resource.
{productName} provides the following types of connection factory
objects:
* `QueueConnectionFactory` objects, used for point-to-point
communication
* `TopicConnectionFactory` objects, used for publish-subscribe
communication
* `ConnectionFactory` objects, which can be used for both point-to-point
and publish-subscribe communications (recommended for new applications)
{productName} provides the following types of destination objects:
* `Queue` objects, used for point-to-point communication
* `Topic` objects, used for publish-subscribe communication
The following topics are addressed here:
* link:#giotd[To Create a Connection Factory or Destination Resource]
* link:#giosx[To List JMS Resources]
* link:#giouw[To Delete a Connection Factory or Destination Resource]
The subcommands in this section can be used to administer both the
connection factory resources and the destination resources. For
information on JMS service support of connection pooling and failover,
see "link:ha-administration-guide/jms.html#GSHAG00213[Connection Failover]" in {productName} High Availability Administration Guide. For instructions
on administering physical destinations, see link:#ablkj[Administering
JMS Physical Destinations].
[[giotd]][[GSADG00490]][[to-create-a-connection-factory-or-destination-resource]]
==== To Create a Connection Factory or Destination Resource
For each JMS connection factory that you create, {productName}
creates a connector connection pool and connector resource. For each JMS
destination that you create, {productName} creates a connector admin
object resource. If you delete a JMS resource, {productName}
automatically deletes the connector resources.
Use the `create-jms-resource` command in remote `asadmin` mode to create
a JMS connection factory resource or a destination resource.
[TIP]
====
To specify the `addresslist` property (in the format
`host:mqport,host2:mqport,host3:mqport`) for the
`asadmin create-jms-resource` command, escape the : by using `\\`. For
example, `host1\\:mqport,host2\\:mqport,host3\\:mpqport`. For more
information about using escape characters, see the
olink:GSRFM00263[`asadmin`(1M)] help page.
====
To update a JMS connection factory, use the `set` subcommand for the
underlying connector connection pool, See link:connectors.html#gioti[To
Update a Connector Connection Pool].
To update a destination, use the `set` subcommand for the admin object
resource. See link:connectors.html#giots[To Update an Administered
Object].
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. Create a JMS resource by using the
link:reference-manual/create-jms-resource.html#GSRFM00040[`create-jms-resource`] command.
+
Information about the properties for the subcommand is included in this
help page.
3. If needed, restart the server.
+
Some properties require server restart. See
link:overview.html#ghciy[Configuration Changes That Require Restart]. If
your server needs to be restarted, see link:domains.html#ginqj[To Restart
a Domain].
[[GSADG00275]][[giovy]]
Example 17-5 Creating a JMS Connection Factory
This example creates a connection factory resource of type
`jakarta.jms.ConnectionFactory` whose JNDI name is
`jms/DurableConnectionFactory`. The `ClientId` property sets a client ID
on the connection factory so that it can be used for durable
subscriptions. The JNDI name for a JMS resource customarily includes the
`jms/` naming subcontext.
[source]
----
asadmin> create-jms-resource --restype jakarta.jms.ConnectionFactory
--description "connection factory for durable subscriptions"
--property ClientId=MyID jms/DurableConnectionFactory
Command create-jms-resource executed successfully.
----
[[GSADG00276]][[giovn]]
Example 17-6 Creating a JMS Destination
This example creates a destination resource whose JNDI name is
`jms/MyQueue`.
[source]
----
asadmin> create-jms-resource --restype jakarta.jms.Queue
--property Name=PhysicalQueue jms/MyQueue
Command create-jms-resource executed successfully.
----
[[GSADG1020]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help create-jms-resource` at the command line.
[[giosx]][[GSADG00491]][[to-list-jms-resources]]
==== To List JMS Resources
Use the `list-jms-resources` subcommand in remote `asadmin` mode to list
the existing connection factory and destination resources.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the existing JMS resources by using the
link:reference-manual/list-jms-resources.html#GSRFM00177[`list-jms-resources`] subcommand.
[[GSADG00277]][[giovz]]
Example 17-7 Listing All JMS Resources
This example lists all the existing JMS connection factory and
destination resources.
[source]
----
asadmin> list-jms-resources
jms/Queue
jms/ConnectionFactory
jms/DurableConnectionFactory
jms/Topic
Command list-jms-resources executed successfully
----
[[GSADG00278]][[giovq]]
Example 17-8 Listing a JMS Resources of a Specific Type
This example lists the resources for the resource type `javax`.
[source]
----
asadmin> list-jms-resources --restype jakarta.jms.TopicConnectionFactory
jms/DurableTopicConnectionFactory
jms/TopicConnectionFactory
Command list-jms-resources executed successfully.
----
[[GSADG1021]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help list-jms-resources` at the command line.
[[giouw]][[GSADG00492]][[to-delete-a-connection-factory-or-destination-resource]]
==== To Delete a Connection Factory or Destination Resource
Use the `delete-jms-resource` subcommand in remote `asadmin` mode to
remove the specified connection factory or destination resource.
[[GSADG1022]]
Before You Begin
Ensure that you remove all references to the specified JMS resource
before running this subcommand.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the existing JMS resources by using the
link:reference-manual/list-jms-resources.html#GSRFM00177[`list-jms-resources`] subcommand.
3. Delete the JMS resource by using the
link:reference-manual/delete-jms-resource.html#GSRFM00092[`delete-jms-resource`] subcommand.
[[GSADG00279]][[giovi]]
Example 17-9 Deleting a JMS Resource
This example deletes the `jms/Queue` resource.
[source]
----
asadmin> delete-jms-resource jms/Queue
Command delete-jms-resource executed successfully
----
[[GSADG1023]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help delete-jms-resource` at the command line.
[[ablkj]][[GSADG00599]][[administering-jms-physical-destinations]]
=== Administering JMS Physical Destinations
Messages are delivered for routing and delivery to consumers by using
physical destinations in the JMS provider. A physical destination is
identified and encapsulated by an administered object (such as a `Topic`
or `Queue` destination resource) that an application component uses to
specify the destination of messages it is producing and the source of
messages it is consuming. For instructions on configuring a destination
resource, see link:#giotd[To Create a Connection Factory or Destination
Resource].
If a message-driven bean is deployed and the physical destination it
listens to does not exist, {productName} automatically creates the
physical destination and sets the value of the `maxNumActiveConsumers`
property to `-1`. However, it is good practice to create the physical
destination beforehand. The first time that an application accesses a
destination resource, Message Queue automatically creates the physical
destination specified by the Name property of the destination resource.
This automatically created physical destination is temporary and expires
after a period specified by a Message Queue configuration property,
provided that there are no messages in it and no message producers or
consumers connected to it.
The following topics are addressed here:
* link:#gioue[To Create a JMS Physical Destination]
* link:#gioyp[To List JMS Physical Destinations]
* link:#giowx[To Purge Messages From a Physical Destination]
* link:#giouv[To Delete a JMS Physical Destination]
[[gioue]][[GSADG00493]][[to-create-a-jms-physical-destination]]
==== To Create a JMS Physical Destination
For production purposes, always create physical destinations. During the
development and testing phase, however, this step is not required. Use
the `create-jmsdest` subcommand in remote `asadmin` mode to create a
physical destination.
Because a physical destination is actually a Message Queue object rather
than a server object, you use Message Queue broker commands to update
properties. For information on Message Queue properties, see the
link:../openmq/mq-admin-guide.html#GMADG[Open Message Queue Administration Guide].
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. Create a JMS physical destination by using the
link:reference-manual/create-jmsdest.html#GSRFM00038[`create-jmsdest`] subcommand.
+
Information about the properties for the subcommand is included in this
help page.
3. If needed, restart the server.
+
Some properties require server restart. See
link:overview.html#ghciy[Configuration Changes That Require Restart]. If
your server needs to be restarted, see link:domains.html#ginqj[To Restart
a Domain].
[[GSADG00280]][[gioxt]]
Example 17-10 Creating a JMS Physical Destination
This example creates a queue named `PhysicalQueue`.
[source]
----
asadmin> create-jmsdest --desttype queue --property
User=public:Password=public PhysicalQueue
Command create-jmsdest executed successfully.
----
[[GSADG1024]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help create-jmsdest` at the command line.
[[gioyp]][[GSADG00494]][[to-list-jms-physical-destinations]]
==== To List JMS Physical Destinations
Use the `list-jmsdest` subcommand in remote `asadmin` mode to list the
existing JMS physical destinations.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the existing JMS physical destinations by using the
link:reference-manual/list-jmsdest.html#GSRFM00175[`list-jmsdest`] subcommand.
[[GSADG00281]][[gioxo]]
Example 17-11 Listing JMS Physical Destinations
This example lists the physical destinations for the default server
instance.
[source]
----
asadmin> list-jmsdest
PhysicalQueue queue {}
PhysicalTopic topic {}
Command list-jmsdest executed successfully.
----
[[GSADG1025]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help list-jmsdest` at the command line.
[[giowx]][[GSADG00495]][[to-purge-messages-from-a-physical-destination]]
==== To Purge Messages From a Physical Destination
Use the `flush-jmsdest` subcommand in remote `asadmin` mode to purge the
messages from a physical destination in the specified target's JMS
service configuration.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. Purge messages from the a JMS physical destination by using the
link:reference-manual/flush-jmsdest.html#GSRFM00136[`flush-jmsdest`] subcommand.
3. If needed, restart the server.
+
Some properties require server restart. See
link:overview.html#ghciy[Configuration Changes That Require Restart]. If
your server needs to be restarted, see link:domains.html#ginqj[To Restart
a Domain].
[[GSADG00282]][[giows]]
Example 17-12 Flushing Messages From a JMS Physical Destination
This example purges messages from the queue named `PhysicalQueue`.
[source]
----
asadmin> flush-jmsdest --desttype queue PhysicalQueue
Command flush-jmsdest executed successfully
----
[[GSADG1026]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help flush-jmsdest` at the command line.
[[giouv]][[GSADG00496]][[to-delete-a-jms-physical-destination]]
==== To Delete a JMS Physical Destination
Use the `delete-jmsdest` subcommand in remote `asadmin` mode to remove
the specified JMS physical destination.
1. Ensure that the server is running.
+
Remote `asadmin` subcommands require a running server.
2. List the existing JMS physical destinations by using the
link:reference-manual/list-jmsdest.html#GSRFM00175[`list-jmsdest`] subcommand.
3. Delete the physical resource by using the
link:reference-manual/delete-jmsdest.html#GSRFM00090[`delete-jmsdest`] subcommand.
[[GSADG00283]][[gioxx]]
Example 17-13 Deleting a Physical Destination
This example deletes the queue named `PhysicalQueue`.
[source]
----
asadmin> delete-jmsdest --desttype queue PhysicalQueue
Command delete-jmsdest executed successfully
----
[[GSADG1027]]
See Also
You can also view the full syntax and options of the subcommand by
typing `asadmin help delete-jmsdest` at the command line.
[[gkxgk]][[GSADG00600]][[special-situations-when-using-the-jms-service]]
=== Special Situations When Using the JMS Service
As mentioned earlier, Message Queue, through the built-in `jmsra`
resource adapter, is tightly integrated with {productName} to provide
JMS messaging managed through a rich set of `asadmin` subcommands and
Administration Console pages to simplify JMS messaging administration
tasks. In most instances, this tight integration is transparent and
automatic, requiring no special effort on the part of an administrator.
In certain special situations, though, an administrator must perform a
task such a setting a Message Queue broker property or a GlassFish
object attribute to enable or disable a capability of the integration.
The topics in this section describe these situations.
Restarting an Embedded or Local Broker That Has Failed::
Because the JMS service, not Message Queue, manages the lifecycle of
brokers acting as Embedded and Local JMS hosts, do not use the
`imqbrokerd` Message Queue utility to start such a broker that has
failed. Instead, restart the GlassFish instance that the broker is
servicing.
Changing the Admin User Password for an Embedded or Local Broker::
Follow these steps to change the `admin` user password for an Embedded
or Local broker:
1. [[CHDDHDIE]]
Make sure the broker is running.
2. [[CHDHDFAH]]
Use the `imqusermgr` Message Queue utility to change the password of
the `admin` user.
3. [[CHDCJEFG]]
Edit the configuration of the JMS host, changing the password of the
`admin` user to the new password.
4. [[CHDFJECE]]
Restart the GlassFish instance that the broker is servicing. +
When changing the password for the brokers in a broker cluster, first
perform steps link:#CHDDHDIE[1] and link:#CHDHDFAH[2] on each broker.
Then, perform step link:#CHDCJEFG[3]. Finally, perform
step link:#CHDFJECE[4] on each broker.
Using SSL to Connect to an Oracle Internet Directory (OID) or Oracle
Virtual Directory (OVD) User Respository::
When using SSL to connect to an OID or OVD user repository, you must
set the `imq.user_repository.ldap.ssl.socketfactory` Message Queue
broker property to
`com.sun.enterprise.security.auth.realm.ldap.CustomSocketFactory`.
[[gipnh]][[GSADG00601]][[troubleshooting-the-jms-service]]
=== Troubleshooting the JMS Service
If you encounter problems, consider the following:
* Use the link:reference-manual/jms-ping.html#GSRFM00144[`jms-ping`] subcommand to confirm that the
Message Queue broker is running.
* View the {productName} log file. For `server`, the Domain
Administrations Server (DAS), the log is available at
domain-dir``/logs/server.log``; for other GlassFish instances, the log is
available at
as-install``/nodes/``node-name``/``instance-name``/logs/server.log``.
+
If the log file indicates that a Message Queue broker acting as a Remote
JMS host did not respond to a message, stop the broker and then restart
it.
* View the broker log. For a broker associated with the Domain
Administration Server (DAS), the log is available at
domain-dir`/imq/instances/imqbroker/log/log.txt`; for brokers associated
with other GlassFish instances, the log is available at
as-install``/nodes/``node-name``/``instance-name`/imq/instances/``mq-instance-name``/log/log.txt``.
* For Remote type JMS hosts, be sure to start Message Queue brokers
first, then {productName} instances.
* If all Message Queue brokers are down, it can take up to 30 minutes
for {productName} to go down or up when you are using the default
values in JMS. You can change the default values for this timeout. For
example:
+
[source]
----
asadmin set domain1.jms-service.reconnect-interval-in-seconds=5
----
[[gbtvg]][[GSADG00602]][[using-the-generic-resource-adapter-for-jms-to-integrate-supported-external-jms-providers]]
=== Using the Generic Resource Adapter for JMS to Integrate Supported External JMS Providers
{productName} supports the integration and use of Oracle WebLogic JMS
and IBM WebSphere MQ JMS providers through the use of the Generic
Resource Adapter for JMS (GenericJMSRA). This Jakarta EE connector 1.5
resource adapter can wrap the JMS client library of Oracle WebLogic JMS
and IBM WebSphere MQ and make it available for use by GlassFish. The
adapter is a `.rar` archive that can be deployed and configured using
{productName} administration tools.
The following topics are addressed here:
* link:#gkkvc[Configuring GenericJMSRA for Supported External JMS
Providers]
* link:#gkkuy[Using GenericJMSRA with WebLogic JMS]
* link:#gkslb[Using GenericJMSRA with IBM WebSphere MQ]
[[gkkvc]][[GSADG00777]][[configuring-genericjmsra-for-supported-external-jms-providers]]
==== Configuring GenericJMSRA for Supported External JMS Providers
GenericJMSRA has three main properties that need to be configured:
`SupportXA`, `DeliveryType`, and `ProviderIntegrationMode`. The values
that need to be set for them depends on the capabilities of the JMS
provider being used, as follows:
* `SupportXA` — indicates whether the JMS provider supports XA or not.
* `DeliveryType` — indicates whether an MDB should use a
`ConnectionConsumer` or `Consumer.receive()` when consuming messages.
* `ProviderIntegrationMode` — indicates what mode of integration is
required. The available integration modes are jndi and javabean. Some
JMS providers support only one integration mode while others may offer
the choice of both
** If jndi is specified, then the resource adapter will obtain JMS
connection factories and destinations from the JMS provider's JNDI
repository.
** If javabean is specified then the resource adapter will obtain JMS
connection factories and destinations by instantiating the appropriate
classes directly.
+
Which option is specified determines which other properties need to be
set.
[[giosy]][[GSADG00497]][[to-deploy-and-configure-genericjmsra]]
===== To Deploy and Configure GenericJMSRA
Before deploying GenericJMSRA, JMS client libraries must be made
available to {productName}. For some JMS providers, client libraries
might also include native libraries. In such cases, these native
libraries must be made available to any {productName} JVMs.
1. Download the `genericra.rar` archive.
2. Deploy GenericJMSRA the same way you would deploy a connector
module.
+
See "link:application-deployment-guide/deploying-applications.html#GSDPG00069[Deploying a Connector Module]" in {productName} Application Deployment Guide.
3. Configure the resource adapter's properties.
+
See link:#gbtvu[GenericJMSRA Configuration Properties].
4. Create a connector connection pool.
+
See link:connectors.html#gioce[To Create a Connector Connection Pool].
5. Create a connector resource.
+
See link:connectors.html#giogt[To Create a Connector Resource].
6. Create an administered object resource.
+
See link:connectors.html#giolr[To Create an Administered Object].
[[gbtvu]][[GSADG00674]][[genericjmsra-configuration-properties]]
===== GenericJMSRA Configuration Properties
The following table describes the properties that can be set to when
configuring the resource adapter.
[width="100%",cols="28%,19%,14%,39%",options="header",]
|===
|Property Name |Valid Values |Default Value |Description
|`SupportsXA` |`true/false` |false |Specifies whether the JMS client
supports XA transactions.
|`DeliveryType` a|
`Synchronous/`
`Asynchronous`
|Asynchronous |Specifies whether an MDB should use a
`ConnectionConsumer` (Asynchronous) or `consumer.receive()`
(Synchronous) when consuming messages.
|`QueueConnectionFactoryClassName` |A valid class name |None |Class name
of `jakarta.jms.QueueConnectionFactory` implementation of the JMS client.
This class must be made available on the application server classpath.
Used if `ProviderIntegrationMode` is `javabean`.
|`TopicConnectionFactoryClassName` |A valid class name |None |Class name
of `jakarta.jms.TopicConnectionFactory` implementation of the JMS client.
This class must be made available on the application server classpath.
Used if `ProviderIntegrationMode` is specified as `javabean`.
|`XAConnectionFactoryClassName` |A valid class name |None |Class name of
`jakarta.jms.ConnectionFactory` implementation of the JMS client. This
class must be made available on the application server classpath. Used
if `ProviderIntegrationMode` is specified as `javabean`.
|`XAQueueConnectionFactoryClassName` |A valid class name |None |Class
name of `jakarta.jms.``XAQueueConnectionFactory` implementation of the JMS
client. This class must be made available on the application server
classpath. Used if `ProviderIntegrationMode` is specified as `javabean`.
|`XATopicConnectionFactoryClassName` |A valid class name |None |Class
name of `jakarta.jms.``XATopicConnectionFactory` implementation of the JMS
client. This class must be made available on the application server
classpath. Used if `ProviderIntegrationMode` is `javabean`.
|`TopicClassName` |A valid class name |None |Class Name of
`jakarta.jms.Topic` implementation of the JMS client. This class must be
made available on the application server classpath. Used if
`ProviderIntegrationMode` is `javabean`.
|`QueueClassName` |A valid class name |None |Class Name of
`jakarta.jms.Queue` implementation of the JMS client. This class must be
made available on the application server classpath. Used if
`ProviderIntegrationMode` is specified as a `javabean`.
|`ConnectionFactoryProperties` |Name value pairs separated by comma
|None |Specifies the `javabean` property names and values of the
`ConnectionFactory` of the JMS client. Required only if
`ProviderIntegrationMode` is `javabean`.
|`JndiProperties` |Name value pairs separated by comma |None |Specifies
the JNDI provider properties to be used for connecting to the JMS
provider's JNDI. Used only if `ProviderIntegrationMode` is `jndi`.
|`CommonSetterMethodName` |Method name |None |Specifies the common
setter method name that some JMS vendors use to set the properties on
their administered objects. Used only if `ProviderIntegrationMode` is
`javabean`. For example, in the case of Message Queue, this would be
`setProperty`.
|`UserName` |Name of the JMS user |None |User name to connect to the JMS
Provider.
|`Password` |Password for the JMS user |None |Password to connect to the
JMS provider.
|`RMPolicy` |`ProviderManaged` or `OnePerPhysicalConnection`
|`Provider``Managed` a|
The `isSameRM` method on an `XAResource` is used by the Transaction
Manager to determine if the Resource Manager instance represented by two
`XAResources` are the same. When `RMPolicy` is set to `ProviderManaged`
(the default value), the JMS provider is responsible for determining the
`RMPolicy` and the `XAResource` wrappers in GenericJMSRA merely delegate
the `isSameRM` call to the JMS provider's XA resource implementations.
This should ideally work for most JMS providers.
Some `XAResource` implementations such as WebSphere MQ rely on a
resource manager per physical connection and this causes issues when
there is inbound and outbound communication to the same queue manager in
a single transaction (for example, when an MDB sends a response to a
destination). When `RMPolicy` is set to `OnePerPhysicalConnection`, the
XAResource wrapper implementation's `isSameRM` in GenericJMSRA would
check if both the `XAResources` use the same physical connection, before
delegating to the wrapped objects.
|===
[[gbtwu]][[GSADG00675]][[connection-factory-properties]]
===== Connection Factory Properties
`ManagedConnectionFactory` properties are specified when a
`connector-connection-pool` is created. All the properties specified
while creating the resource adapter can be overridden in a
`ManagedConnectionFactory`. Additional properties available only in
`ManagedConnectionFactory` are given below.
[width="181%",cols="20%,8%,49%,23%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`ClientId` |A valid client ID |None |`ClientID` as specified by JMS 1.1
specification.
|`ConnectionFactoryJndiName` |JNDI Name |None |JNDI name of the
connection factory bound in the JNDI tree of the JMS provider. The
administrator should provide all connection factory properties (except
`clientID`) in the JMS provider itself. This property name will be used
only if `ProviderIntegratinMode` is `jndi`.
|`ConnectionValidationEnabled` |true/false |false |If set to true, the
resource adapter will use an exception listener to catch any connection
exception and will send a `CONNECTION_ERROR_OCCURED` event to
application server.
|===
[[gbtxa]][[GSADG00676]][[destination-properties]]
===== Destination Properties
Properties in this section are specified when a destination (queue or
topic) is created. All the resource adapter properties can be overridden
in a destination. Additional properties available only in the
destination are given below.
[width="100%",cols="31%,14%,11%,44%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`DestinationJndiName` |JNDI Name |None |JNDI name of the destination
bound in the JNDI tree of the JMS provider. The Administrator should
provide all properties in the JMS provider itself. This property name
will be used only if `ProviderIntegrationMode` is `jndi`.
|`DestinationProperties` |Name value pairs separated by a comma |None
|Specifies the `javabean` property names and values of the destination
of the JMS client. Required only if `ProviderIntegrationMode` is
`javabean`.
|===
[[gbtvf]][[GSADG00677]][[activation-spec-properties]]
===== Activation Spec Properties
Properties in this section are specified in the {productName}
`glassfish-ejb-jar.xml` deployment descriptor of an MDB as
`activation-config-properties`. All the resource adapter properties can
be overridden in an Activation Spec. Additional properties available
only in ActivationSpec are given below.
[width="100%",cols="43%,14%,13%,30%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`MaxPoolSize` |An integer |8 |Maximum size of server session pool
internally created by the resource adapter for achieving concurrent
message delivery. This should be equal to the maximum pool size of MDB
objects.
|`MaxWaitTime` |An integer |3 |The resource adapter will wait for the
time in seconds specified by this property to obtain a server session
from its internal pool. If this limit is exceeded, message delivery will
fail.
|`SubscriptionDurability` |Durable or Non-Durable |Non-Durable
|`SubscriptionDurability` as specified by JMS 1.1 specification.
|`SubscriptionName` | + |None |`SubscriptionName` as specified by JMS
1.1 specification.
|`MessageSelector` |A valid message selector |None |`MessageSelector` as
specified by JMS 1.1 specification.
|`ClientID` |A valid client ID |None |`ClientID` as specified by JMS 1.1
specification.
|`ConnectionFactoryJndiName` |A valid JNDI Name |None |JNDI name of
connection factory created in JMS provider. This connection factory will
be used by resource adapter to create a connection to receive messages.
Used only if `ProviderIntegrationMode` is configured as `jndi`.
|`DestinationJndiName` |A valid JNDI Name |None |JNDI name of
destination created in JMS provider. This destination will be used by
resource adapter to create a connection to receive messages from. Used
only if `ProviderIntegrationMode` is configured as `jndi`.
|`DestinationType` |`jakarta.jms.Queue` or `jakarta.jms.Topic` |Null |Type
of the destination the MDB will listen to.
|`DestinationProperties` |Name-value pairs separated by comma |None
|Specifies the `javabean` property names and values of the destination
of the JMS client. Required only if `ProviderIntegrationMode` is
`javabean`.
|`RedeliveryAttempts` |integer | + |Number of times a message will be
delivered if a message causes a runtime exception in the MDB.
|`Redelivery``Interval` |time in seconds | + |Interval between repeated
deliveries, if a message causes a runtime exception in the MDB.
|`SendBadMessagesToDMD` |true/false |False |Indicates whether the
resource adapter should send the messages to a dead message destination,
if the number of delivery attempts is exceeded.
|`DeadMessageDestinationJndiName` |a valid JNDI name. |None |JNDI name
of the destination created in the JMS provider. This is the target
destination for dead messages. This is used only if
`ProviderIntegrationMode` is `jndi`.
|`DeadMessageDestinationClassName` |class name of destination object.
|None |Used if `ProviderIntegrationMode` is `javabean`.
|`DeadMessageDestinationProperties` |Name Value Pairs separated by comma
|None |Specifies the `javabean` property names and values of the
destination of the JMS client. This is required only if
`ProviderIntegrationMode` is `javabean`.
|`DeadMessageConnectionFactoryJndiName` |a valid JNDI name |None |JNDI
name of the connection factory created in the JMS provider. This is the
target connection factory for dead messages. This is used only if
`ProviderIntegrationMode` is `jndi`.
|`DeadMessageDestinationType` |queue or topic destination |None |The
destination type for dead messages.
|`ReconnectAttempts` |integer |0 |Number of times a reconnect will be
attempted in case exception listener catches an error on connection.
|`ReconnectInterval` |time in seconds |0 |Interval between reconnects.
|===
[[gkkuy]][[GSADG00778]][[using-genericjmsra-with-weblogic-jms]]
==== Using GenericJMSRA with WebLogic JMS
You can configure GenericJMSRA to enable applications running in
{productName} to send messages to, and receive messages from, Oracle
WebLogic JMS.
GenericJMSRA should be used in conjunction with the WebLogic Server Thin
T3 Client. Due to the nature of this client, messages exchanged between
{productName} and WebLogic Server cannot be sent or received in XA
transactions. There is also only limited support for asynchronous
receipt of messages in an MDB, as described in detail in
link:#gkkvz[Limitations When Using GenericJMSRA with WebLogic JMS].
The following topics are addressed here:
* link:#gkmeb[Deploy the WebLogic Thin T3 Client JAR in {productName}]
* link:#gkmek[Configure WebLogic JMS Resources for Integration]
* link:#gkmee[Create a Resource Adapter Configuration for GenericJMSRA
to Work With WebLogic JMS]
* link:#gkkxz[Deploy the GenericJMSRA Resource Archive]
* link:#gkkwq[Configuring an MDB to Receive Messages from WebLogic JMS]
* link:#gknjj[Accessing Connections and Destinations Directly]
* link:#gkkvz[Limitations When Using GenericJMSRA with WebLogic JMS]
* link:#gktfi[Configuration Reference of GenericJMSRA Properties for
WebLogic JMS]
[[gkmeb]][[GSADG00678]][[deploy-the-weblogic-thin-t3-client-jar-in-glassfish-server]]
===== Deploy the WebLogic Thin T3 Client JAR in {productName}
WebLogic Server provides several different clients for use by standalone
applications that run outside of WebLogic Server. These client are
summarized in
"http://www.oracle.com/pls/as1111/lookup?id=SACLT117[Overview of
Stand-alone Clients"] in Programming Stand-alone Clients for Oracle
WebLogic Server. When connecting from {productName} to WebLogic JMS
resources you must use the WebLogic Thin T3 client,
`wlthint3client.jar`.
There are a couple of methods to deploy the WebLogic Thin T3 client in
{productName} and make it available to GenericJMSRA:
* To make the Thin T3 client available to all applications, copy the
`wlthint3client.jar` to the as-install``/lib`` directory under your
{productName} installation. The Thin T3 client can be found in a
WebLogic Server installation in a directory similar to
MW_HOME``/server/lib``.
* It is also possible to deploy the Thin T3 client in a less global
manner, so that it is specific to an individual application. For
information on how to do this, see
"link:application-development-guide/class-loaders.html#GSDVG00099[Application-Specific Class Loading]" in {productName} Application Development Guide.
[[gkmek]][[GSADG00679]][[configure-weblogic-jms-resources-for-integration]]
===== Configure WebLogic JMS Resources for Integration
If you need to configure the necessary WebLogic JMS resources on the
WebLogic Server from which you want to access messages using {productName}, then follow the instructions in the WebLogic Server
documentation for configuring the necessary resources, such as
destinations, and connection factories.
* JMS System Module Configuration
* Queue and Topic Destination Configuration
* Connection Factory Configuration
The example code snippets in this section refer to a WebLogic JMS
connection factory named `WLoutboundQueueFactory` and queue destination
named `WLoutboundQueue`. For conceptual overviews on configuring
WebLogic JMS resources, refer to
"http://www.oracle.com/pls/as1111/lookup?id=JMSAD123[Understanding JMS
Resource Configuration]" in Configuring and Managing JMS for Oracle
WebLogic Server. For detailed instructions on configuring WebLogic JMS
resources, refer to
"http://www.oracle.com/pls/as1111/lookup?id=WLACH01854[Configure JMS
system modules and add JMS resources]" in the WebLogic Administration
Console Online Help.
[[gkmee]][[GSADG00680]][[create-a-resource-adapter-configuration-for-genericjmsra-to-work-with-weblogic-jms]]
===== Create a Resource Adapter Configuration for GenericJMSRA to Work With WebLogic JMS
When you deploy GenericJMSRA, you also need to create a resource adapter
configuration in {productName}. You can do this using either the
Administration Console or the `asadmin` command. If you use
theAdministration Console then you need deploy the GenericJMSRA resource
archive first. Here's an example using `asadmin`:
[source]
----
asadmin create-resource-adapter-config --host localhost --port 4848 --property
SupportsXA=false:DeliveryType=Synchronous:ProviderIntegrationMode
=jndi:JndiProperties=java.naming.factory.initial\
=weblogic.jndi.WLInitialContextFactory,java.naming.provider.url\
=t3\://localhost\:7001,java.naming.factory.url.pkgs\
=weblogic.corba.client.naming genericra
----
This creates a resource adapter configuration with the name `genericra`,
and Oracle recommends not changing the default name. The resource
adapter configuration is configured with the properties specified using
the `--properties` argument; multiple properties are configured as a
colon-separated list of name-value pairs that are entered as a single
line. You will also need to change the host and port that WebLogic
Server is running on to suit your installation.
In this example, the following properties are configured:
[width="100%",cols="28%,72%",options="header",]
|===
|Property |Value
|`SupportsXA` |`false`
|`DeliveryType` |`Synchronous`
|`ProviderIntegrationMode` |`jndi`
|`JndiProperties` a|
[source]
----
java.naming.factory.initial
=weblogic.jndi.WLInitialContextFactory,java.naming.provider.url
=t3://localhost:7001,java.naming.factory.url.pkgs
=weblogic.corba.client.naming
(replace "localhost:7001" with the host:port of WebLogic Server)
----
|===
You must use the same values for `SupportsXA`, `DeliveryType` and
`ProviderIntegrationMode` as the required values that are used in this
table. The `JndiProperties` value must be set to a list of JNDI
properties needed for connecting to WebLogic JNDI.
[NOTE]
====
When using `asadmin` you need to escape each `=` and any `:` characters
by prepending a backward slash `\`. The escape sequence is not necessary
if the configuration is performed through the Administration Console.
====
For a description of all the resource adapter properties that are
relevant for WebLogic JMS, see the link:#gktfi[Configuration Reference
of GenericJMSRA Properties for WebLogic JMS].
[[gkkxz]][[GSADG00498]][[deploy-the-genericjmsra-resource-archive]]
===== Deploy the GenericJMSRA Resource Archive
1. Download the GenericJMSRA resource archive (genericra.rar).
2. Deploy the resource adapter. You can do this using either the
Administration Console or the `asadmin` deploy command. Here's an
example using the `asadmin` deploy command:
+
[source]
----
$ asadmin deploy --user admin --password adminadmin
<location of the generic resource adapter rar file>
----
If you deploy the resource adapter using the Administration Console,
then after deployment you need to create a resource adapter
configuration as described in link:#gkmee[Create a Resource Adapter
Configuration for GenericJMSRA to Work With WebLogic JMS].
[[gkkwq]][[GSADG00499]][[configuring-an-mdb-to-receive-messages-from-weblogic-jms]]
===== Configuring an MDB to Receive Messages from WebLogic JMS
In this example, all configuration information is defined in two
deployment descriptor files: `ejb-jar.xml` and the {productName}
`glassfish-ejb-jar.xml` file. To configure a MDB to receive messages
from WebLogic JMS, you would configure these deployment descriptor files
as follows:
1. Configure the ejb-jar.xml deployment descriptor:
+
[source,xml]
----
<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>SimpleMessageEJB</ejb-name>
<ejb-class>test.simple.queue.ejb.SimpleMessageBean</ejb-class>
<transaction-type>Container</transaction-type>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>SimpleMessageEJB</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>jakarta.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
----
+
[NOTE]
====
If container-managed transactions are configured, then the transactional
attribute must be set to `NotSupported`. For more information, see
link:#gkkvz[Limitations When Using GenericJMSRA with WebLogic JMS].
====
2. Configure the glassfish-ejb-jar.xml deployment descriptor:
+
[source,xml]
----
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>SimpleMessageEJB</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>genericra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>
ConnectionFactoryJndiName
</activation-config-property-name>
<activation-config-property-value>
jms/WLInboundQueueFactory
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
DestinationJndiName
</activation-config-property-name>
<activation-config-property-value>
jms/WLInboundQueue
</activation-config-property-value>
</activation-config-property>
</activation-config>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
----
where:
+
The `<resource-adapter-mid>genericra</resource-adapter-mid>` element is
used to specify the resource adapter and resource adapter configurations
that was deployed in the link:#gkmee[Create a Resource Adapter
Configuration for GenericJMSRA to Work With WebLogic JMS] instructions.
It is recommended you stick to `genericra` as is used here.
+
The `activation-config` element in `glassfish-ejb-jar.xml` is the one
which defines how and where the MDB receives messages, as follows:
* The `ConnectionFactoryJndiName` property must be set to the JNDI name
of the connection factory in the WebLogic JNDI store that will be used
to receive messages. Therefore, replace `jms/WLInboundQueueFactory` in
the example above with the JNDI name used in your environment.
* The `DestinationJndiName` property must be set to the JNDI name of the
destination (the queue or topic from which messages will be consumed) in
the WebLogic JNDI store. Therefore, replace `jms/WLInboundQueue` in the
example above with the JNDI name used in your environment. +
For a description of all the ActivationSpec properties that are relevant
for WebLogic JMS, see the link:#gktfi[Configuration Reference of
GenericJMSRA Properties for WebLogic JMS]. +
Make sure to use the appropriate WebLogic administration tools, such as
the WebLogic Administration Console or the WebLogic Scripting Tool (WLST).
For more information, see
"http://www.oracle.com/pls/as1111/lookup?id=WLACH01853[Configure
Messaging]" in WebLogic Server Administration Console Online Help and
http://www.oracle.com/pls/as1111/lookup?id=WLSTC112[WebLogic Server WLST
Online and Offline Command Reference].
[[gknjj]][[GSADG00500]][[accessing-connections-and-destinations-directly]]
===== Accessing Connections and Destinations Directly
When configuring a MDB to consume messages from WebLogic JMS your code
does not need to access the WebLogic JMS connection factory and
destination directly. You simply define them in the activation
configuration, as shown in link:#gkkwq[Configuring an MDB to Receive
Messages from WebLogic JMS]. However when configuring an MDB to send
messages, or when configuring a EJB, Servlet, or application client to
either send or receive messages, your code needs to obtain these objects
using a JNDI lookup.
[NOTE]
====
If you want configure connections and destination resources using the
Administration Console, this is explained in the Administration Console
online help. When using Administration Console, follow the instructions
for creating a new Connector Connection Pool and Admin Object Resources,
and not the instructions for creating a JMS Connection Pool and
Destination Resources. For more information about using `asadmin` to
create these resources, see link:connectors.html#gioce[To Create a
Connector Connection Pool] and link:connectors.html#giogt[To Create a
Connector Resource].
====
1. Looking up the connection factory and destination
+
The following code looks up a connection factory with the JNDI name
`jms/QCFactory` and a queue with the name `jms/outboundQueue` from the
{productName} JNDI store:
+
[source,java]
----
Context initialContect = new InitialContext();
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)
jndiContext.lookup("java:comp/env/jms/MyQCFactory");
Queue queue = (Queue) jndiContext.lookup("java:comp/env/jms/outboundQueue");
----
Note that the resources used are {productName} resources, not
WebLogic JMS resources. For every connection factory or destination that
you want to use in the WebLogic JMS JNDI store, you need to create a
corresponding connection factory or destination in the {productName}
JNDI store and configure the {productName} object to point to the
corresponding WebLogic JMS object.
2. Declaring the connection factory and destination
+
In accordance with standard Jakarta EE requirements, these resources need
to be declared in the deployment descriptor for the MDB, EJB or other
component. For example, for a session bean, configure the `ejb-jar.xml`
with `<resource-env-ref>` elements, as follows:
+
[source,xml]
----
<ejb-jar>
<enterprise-beans>
<session>
. . .
<resource-env-ref>
<resource-env-ref-name>jms/QCFactory</resource-env-ref-name>
<resource-env-ref-type>jakarta.jms.QueueConnectionFactory</resource-env-ref-type>
</resource-env-ref>
<resource-env-ref>
<resource-env-ref-name>jms/outboundQueue</resource-env-ref-name>
<resource-env-ref-type>jakarta.jms.Queue</resource-env-ref-type>
</resource-env-ref>
----
3. Create a Connector Connection Pool and Connector Resource by
entering the following `asadmin` commands, both all in one line:
+
In order to configure a JMS Connection Factory using GenericJMSRA, a
Connector connection pool and resource need to be created in {productName} using names that map to the corresponding connection factory in
the WebLogic JNDI store.
+
[source]
----
asadmin create-connector-connection-pool --host localhost --port 4848
--raname genericra --connectiondefinition jakarta.jms.QueueConnectionFactory
--target server --transactionsupport LocalTransaction
--property ConnectionFactoryJndiName=jms/WLOutboundQueueFactory
qcpool
asadmin create-connector-resource --host localhost --port 4848
--poolname qcpool --target server jms/QCFactory
----
These `asadmin` commands together creates a connection factory in
{productName} and its corresponding connection pool.
* The connection pool has the JNDI name `jms/WLoutboundQueueFactory` and
obtains connections from a connection pool named `qcpool`.
* The connection pool `qcpool` uses the resource adapter `genericra` and
contains objects of type `jakarta.jms.QueueConnectionFactory`.
* The `transactionsupport` argument is set to `LocalTransaction`, which
specifies that the connection will be used in local transactions only.
You can also specify `NoTransaction`. However, the default setting of
`XATransaction` cannot be used. For more information, see
link:#gkkvz[Limitations When Using GenericJMSRA with WebLogic JMS].
* The connection pool is configured with the properties specified using
the `properties` argument; multiple properties are configured as a
colon-separated list of name-value pairs. Only one property is
configured in this example, as follows:
+
[source]
----
ConnectionFactoryJndiName=jms/WLOutboundQueueFactory
----
The `ConnectionFactoryJndiName` property must be set to the JNDI name of
the corresponding connection factory in the WebLogic JMS JNDI store.
Therefore, replace `jms/WLOutboundQueueFactory` in the example above
with the JNDI name used in your environment.
* For a description of the `ManagedConnectionFactory` properties that
are relevant for WebLogic JMS, see the link:#gktfi[Configuration
Reference of GenericJMSRA Properties for WebLogic JMS].
4. Create a destination object that refers to a corresponding WebLogic
JMS destination by entering the following `asadmin` command, all in one
line:
+
[source]
----
asadmin create-admin-object --host localhost --port 4848 --target server
--restype jakarta.jms.Queue --property DestinationJndiName=jms/WLOutboundQueue
--raname genericra jms/outboundQueue
----
This `asadmin` command creates a destination in {productName}.
* The destination has the JNDI name `jms/outboundQueue`, uses the
resource adapter `genericra`, and is of type `jakarta.jms.Queue`.
* The destination is configured with the properties specified using the
`properties` argument; multiple properties are configured as a
colon-separated list of name-value pairs. Only one property is
configured in this example, as follows:
+
[source]
----
DestinationJndiName=jms/WLOutboundQueue
----
The `DestinationJndiName` property must be set to the JNDI name of the
corresponding destination in the WebLogic JMS JNDI store. Therefore,
replace `jms/WLOutboundQueue` in the example above with the JNDI name
used in your environment.
* For a description of the destination properties that are relevant for
WebLogic JMS, see the link:#gktfi[Configuration Reference of
GenericJMSRA Properties for WebLogic JMS].
[[gkkvz]][[GSADG00681]][[limitations-when-using-genericjmsra-with-weblogic-jms]]
===== Limitations When Using GenericJMSRA with WebLogic JMS
Due to the nature of the WebLogic T3 Thin Client there are a number of
limitations in the way in which it can be used with GenericJMSRA.
[[gknho]][[GSADG00091]][[no-support-for-xa-transactions]]
No Support for XA Transactions
WebLogic JMS does not support the optional JMS "Chapter 8" interfaces
for XA transactions in a form suitable for use outside of WebLogic
Server. Therefore, the GenericJMSRA configuration must have the
`SupportsXA` property set to `-false`. This has a number of implications
for the way in which applications may be used, as described in this
section.
Using a MDB to Receive Messages: Container-managed Transactions (CMT)
* If container-managed transactions are used, the transactional
attribute of a MDB should be set to `NotSupported`. No transaction will
be started. Messages will be received in a non-transacted session with
an acknowledgeMode of `AUTO_ACKNOWLEDGE`.
* A transactional `Required` attribute should not be used; otherwise,
MDB activation will fail with an exception:
`javax.resource.ResourceException: MDB is configured to use container managed transaction. But SupportsXA is configured to false in the resource adapter.`
The remaining transactional attributes are normally considered
inappropriate for use with a MDB. If used, the following behavior will
occur:
* If the transactional attribute is `RequiresNew`, then MDB activation
will fail with an exception:
`javax.resource.ResourceException: MDB is configured to use container managed transaction But SupportsXA is configured to false in the resource adapter.`
* If the transactional attribute is `Mandatory`, the MDB can be
activated but a `TransactionRequiredException` (or similar) will always
be thrown by the server.
* If the transactional attribute is `Supports`, then no transaction will
be started and the MDB will work as if `NotSupported` had been used.
* If the transactional attribute is `Never`, then no transaction will be
started and the MDB will work as if `NotSupported` had been used.
Using a MDB to Receive Messages: Bean-managed Transactions (BMT)
* If bean-managed transactions are configured in accordance with the EJB
specification any `UserTransaction` started by the bean will have no
effect on the consumption of messages.
* Messages will be received in a non-transacted session with an
acknowledgeMode of `AUTO_ACKNOWLEDGE`.
Accessing Connections and Destinations Directly - Container-managed
Transactions (CMT)
When accessing connections directly (such as when sending messages from
a MDB or an EJB) and container-managed transactions are being used, the
connection pool's `transaction-support` property should be set to either
`LocalTransaction` or `NoTransaction`. If the default value of
`XATransaction` is used, an exception will be thrown at runtime when
`createConnection()` is called. This is the case irrespective of the
transactional attribute of the MDB or EJB. Note that MDBs must have
their transactional attribute set to `NotSupported` as specified above;
whereas, an EJB can use any transactional attribute.
If there is no transaction in progress within the bean method (for
example, `notSupported` is being used) then it does not make any
difference whether the connection pool's `transaction-support` property
is set to `LocalTransaction` or `NoTransaction`; the transactional
behavior will be determined by the arguments to `createSession()`. If
you want the outbound message to be sent without a transaction, call
`createSession(false, ...)`. If you want the outbound message to be sent
in a local transaction call
`createSession(true, Session.SESSION_TRANSACTED)`, remembering to call
`session.commit()` or `session.rollback()`after the message is sent.
If there is a transaction in progress within the bean method (which will
only be possible for EJBs), then setting the connection pool's
`transaction-support` property to `LocalTransaction` or `NoTransaction`
gives different results:
* If it is set to `NoTransaction` then a non-transacted session will be
used.
* If it is set to `LocalTransaction` then a (local, non-XA) transacted
session will be used, which will be committed or rolled back when the
`UserTransaction` is committed or rolled back. In this case, calling
`session.commit()` or `session.rollback()` will cause an exception.
No Support for Redelivery Limits and Dead Message Queue
Due to the lack of XA support when using WebLogic JMS, there is no
support for GenericJMSRA's dead message queue feature, in which a
message that has been redelivered to a MDB a defined number of times is
sent to a dead message queue.
[[gknft]][[GSADG00092]][[limited-support-for-asynchronous-receipt-of-messages-in-a-mdb]]
Limited Support for Asynchronous Receipt of Messages In a MDB
WebLogic JMS does not support the optional JMS "Chapter 8" interfaces
for "Concurrent Processing of a Subscription's Messages" (that is,
`ServerSession`, `ServerSessionPool` and `ConnectionConsumer`) in a form
suitable for use outside of WebLogic Server. Therefore, the generic
JMSRA configuration must set the property `DeliveryType` to
`Synchronous`.
This affects the way in which MDBs consume messages from a queue or
topic as follows:
* When messages are being received from a queue, each MDB instance will
have its own session and consumer, and it will consume messages by
repeatedly calling `receive(timeout)`. This allows the use of a pool of
MDBs to process messages from the queue.
* When messages are being received from a topic, only one MDB instance
will be used irrespective of the configured pool size. This means that a
pool of multiple MDBs cannot be used to share the load of processing
messages, which may reduce the rate at which messages can be received
and processed.
+
This restriction is a consequence of the semantics of synchronously
consuming messages from topics in JMS: In the case of non-durable topic
subscriptions, each consumer receives a copy of all the messages on the
topic, so using multiple consumers would result in multiple copies of
each message being received rather than allowing the load to be shared
among the multiple MDBs. In the case of durable topic subscriptions,
only one active consumer is allowed to exist at a time.
[[gktfi]][[GSADG00682]][[configuration-reference-of-genericjmsra-properties-for-weblogic-jms]]
===== Configuration Reference of GenericJMSRA Properties for WebLogic JMS
The tables in this section list the properties that need to be set to
configure the resource adapter and any activation specs, managed
connections, and other administered objects that are relevant only when
using GenericJMSRA to communicate with WebLogic JMS. For a complete list
of properties, see the comprehensive table in link:#gbtvu[GenericJMSRA
Configuration Properties]
Resource Adapter Properties
These properties are used to configure the resource adapter itself when
it is deployed, and can be specified using the
`create-resource-adapter-config` command.
[width="100%",cols="28%,42%,30%",options="header",]
|===
|Property Name |Required Value |Description
|`SupportsXA` |`false` a|
Specifies whether the JMS client supports XA transactions.
Set to `false` for WebLogic JMS.
|`DeliveryType` |`Synchronous` a|
Specifies whether an MDB should use a `ConnectionConsumer`
(Asynchronous) or `consumer.receive()` (Synchronous) when consuming
messages.
Set to `Synchronous` for WebLogic JMS.
|`ProviderIntegrationMode` |`jndi` a|
Specifies that connection factories and destinations in GlassFish's JNDI
store are configured to refer to connection factories and destinations
in WebLogic's JNDI store.
Set to `jndi` for WebLogic JMS.
|`JndiProperties` a|
[source]
----
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory,
java.naming.provider.url=t3://localhost:7001,
java.naming.factory.url.pkgs=weblogic.corba.client.naming
(replace localhost:7001 with the host:port of WebLogic Server)
----
|JNDI properties for connect to WebLogic JNDI, specified as
comma-separated list of name=value pairs without spaces.
|`UserName` |`Name of the WebLogic JMS user` |User name to connect to
WebLogic JMS. The user name can be overridden in `ActivationSpec` and
`ManagedConnection`. If no user name is specified anonymous connections
will be used, if permitted.
|`Password` |`Password for the WebLogic JMS user` |Password to connect
to WebLogic JMS. The password can be overridden in `ActivationSpec` and
`ManagedConnection`.
|`LogLevel` |`Desired log level of JDK logger` |Used to specify the
level of logging.
|===
Connection Factory Properties
`ManagedConnectionFactory` objects are created in the {productName}
JNDI store using the Administration Console or the
`asadmin connector-connection-pool` command. All the properties that can
be set on a resource adapter configuration can be overridden by setting
them on a destination object. The properties specific to
`ManagedConnectionFactory` objects are listed in the following table.
[width="100%",cols="39%,14%,10%,37%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`ClientId` |A valid client ID |None |`ClientID` as specified by JMS 1.1
specification.
|`ConnectionFactoryJndiName` |A valid JNDI Name |None |JNDI name of
connection factory in the {productName} JNDI store. This connection
factory should be configured to refer to the physical connection factory
in the WebLogic JNDI store.
|`ConnectionValidationEnabled` |`true` or `false` |FALSE |If set to
`true`, the resource adapter will use an exception listener to catch any
connection exception and will send a `CONNECTION_ERROR_OCCURED` event to
{productName}.
|===
Destination Properties
Destination (queue or topic) objects are created in the {productName}
JNDI store using the Administration Console or the
`asadmin connector-admin-object` command. All the properties that can be
set on a resource adapter configuration can be overridden by setting
them on a destination object. The properties specific to destination
objects are listed in the following table.
[width="100%",cols="28%,14%,10%,48%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`DestinationJndiName` |A valid JNDI name |None |JNDI name of the
destination object in the {productName} JNDI store. This destination
object should be configured to refer to the corresponding physical
destination in the WebLogic JNDI store.
|===
ActivationSpec Properties
An ActivationSpec is a set of properties that configures a MDB. It is
defined either in the MDB's {productName} deployment descriptor
`glassfish-ejb-jar.xml` using `activation-config-property` elements or
in the MDB itself using annotation. All the resource adapter properties
listed in the table above can be overridden in an ActivationSpec.
Additional properties available only to a ActivationSpec are given
below.
[width="100%",cols="30%,19%,14%,37%",options="header",]
|===
|Property Name |Valid Value |Default Value |Description
|`MaxPoolSize` |An integer |8 a|
Maximum size of server session pool internally created by the resource
adapter for achieving concurrent message delivery. This should be equal
to the maximum pool size of MDB objects.
Only used for queues; ignored for topics, when a value of 1 is always
used.
|`SubscriptionDurability` |`Durable` or `Non-Durable` |`Non-Durable`
|Only used for topics. Specifies whether the subscription is durable or
non-durable.
|`SubscriptionName` | |None |Only used for topics when
`SubscriptionDurability` is `Durable`. Specifies the name of the durable
subscription.
|`MessageSelector` |A valid message selector |None |JMS message
selector.
|`ClientID` |A valid client ID |None |JMS ClientID.
|`ConnectionFactoryJndiName` |A valid JNDI Name |None |JNDI name of
connection factory in the {productName} JNDI store. This connection
factory should be configured to refer to the physical connection factory
in the WebLogic JNDI store.
|`DestinationJndiName` |A valid JNDI Name |None |JNDI name of
destination in the {productName} JNDI store. This destination should
be configured to refer to the physical destination in the WebLogic JNDI
store.
|`DestinationType` |`jakarta.jms.Queue` or `jakarta.jms.Topic` |Null
|Specifies whether the configured `DestinationJndiName` refers to a
queue or topic.
|`ReconnectAttempts` |integer |0 |Number of times a reconnect will be
attempted in case exception listener catches an error on connection.
|`ReconnectInterval` |time in seconds |0 |Interval between reconnection
attempts.
|===
[[gkslb]][[GSADG00779]][[using-genericjmsra-with-ibm-websphere-mq]]
==== Using GenericJMSRA with IBM WebSphere MQ
You can configure GenericJMSRA to enable applications running in
{productName} to send messages to, and receive messages from, IBM
WebSphere MQ. {productName}only supports using GenericJMSRA with
WebSphere MQ version 6.0 and WebSphere MQ version 7.0
These instructions assume that the WebSphere MQ broker and {productName} are deployed and running on the same physical host/machine. If
you have the WebSphere MQ broker running on a different machine and need
to access it remotely, refer to the WebSphere MQ documentation for
configuration details. The resource adapter configuration and other
application server related configuration remains unchanged.
The following topics are addressed here:
* link:#gksiw[Preliminary Setup Procedures for WebSphere MQ Integration]
* link:#gksli[Configure the WebSphere MQ Administered Objects]
* link:#gksni[Create a Resource Adapter Configuration for GenericJMSRA
to Work With WebSphere MQ]
* link:#gksnh[Deploy the GenericJMSRA Archive]
* link:#gkson[Create the Connection Factories and Administered Objects
in {productName}]
* link:#gktmn[Configuring an MDB to Receive Messages from WebSphere MQ]
[[gksiw]][[GSADG00683]][[preliminary-setup-procedures-for-websphere-mq-integration]]
===== Preliminary Setup Procedures for WebSphere MQ Integration
Before you can configure WebSphere MQ to exchange messages with
{productName}, you must complete the following tasks:
* The following permissions must be added to the `server.policy` and the
`client.policy` file to deploy GenericJMSRA and to run the client
application.
** Use a text editor to modify the `server.policy` file in the
`${appserver-install-dir}/domains/domain1/config/`directory by adding
the following line to the default grant block:
+
[source]
----
permission java.util.logging.LoggingPermission "control";
permission java.util.PropertyPermission "*", "read,write";
----
** If you use an application client in your application, edit the
client's `client.policy` file in the
`${appserver-install-dir}/lib/appclient/` directory by adding the
following permission:
+
[source]
----
permission javax.security.auth.PrivateCredentialPermission
"javax.resource.spi.security.PasswordCredential * \"*\"","read";
----
* To integrate {productName}with WebSphere MQ 6.0 or 7.0, copy the
necessary JAR files to the as-install``/lib`` directory:
** For WebSphere MQ 6.0, copy these JAR files to the as-install``/lib``
directory:
+
[source]
----
/opt/mqm/java/lib/com.ibm.mq.jar
/opt/mqm/java/lib/com.ibm.mq.jms.Nojndi.jar
/opt/mqm/java/lib/com.ibm.mq.soap.jar
/opt/mqm/java/lib/com.ibm.mqjms.jar
/opt/mqm/java/lib/com.ibm.mqetclient.jar
/opt/mqm/java/lib/commonservices.jar
/opt/mqm/java/lib/dhbcore.jar
/opt/mqm/java/lib/rmm.jar
/opt/mqm/java/lib/providerutil.jar
/opt/mqm/java/lib/CL3Export.jar
/opt/mqm/java/lib/CL3Nonexport.jar
----
where `/opt/mqm` is the location of the WebSphere MQ 6.0 installation.
** For WebSphere MQ 7.0, copy these JAR files to the as-install``/lib``
directory:
+
[source]
----
/opt/mqm/java/lib/com.ibm.mq.jar,
/opt/mqm/java/lib/com.ibm.mq.jms.Nojndi.jar,
/opt/mqm/java/lib/com.ibm.mq.soap.jar,
/opt/mqm/java/lib/com.ibm.mqjms.jar,
/opt/mqm/java/lib/com.ibm.mq.jmqi.jar,
/opt/mqm/java/lib/com.ibm.mq.commonservices.jar,
/opt/mqm/java/lib/dhbcore.jar,
/opt/mqm/java/lib/rmm.jar,
/opt/mqm/java/lib/providerutil.jar,
/opt/mqm/java/lib/CL3Export.jar,
/opt/mqm/java/lib/CL3Nonexport.jar
----
where `/opt/mqm` is the location of the WebSphere MQ 7.0 installation.
* Set the `LD_LIBRARY_PATH` environment variable to the `java/lib`
directory, and then restart {productName}. For example, in a
UNIX—based system, with WebSphere MQ installed under `/opt/mqm`, you
would enter:
+
[source]
----
$ export LD_LIBRARY_PATH=/opt/mqm/java/lib
----
[[gksli]][[GSADG00501]][[configure-the-websphere-mq-administered-objects]]
===== Configure the WebSphere MQ Administered Objects
This section provides an example of how you could configure the
necessary administered objects, such as destinations and connection
factories, on the WebSphere MQ instance from which you want to access
messages using {productName}. Therefore, you will need to change the
administered object names to suit your installation.
[[GSADG1028]]
Before You Begin
If WebSphere MQ created a user and a group named `mqm` during the
installation, then you must specify a password for the `mqm` user using
the `$ passwd mqm` command.
image:img/websphere-mq.png[
"This graphic represents all of the administered objects created in this
example configuration."]
1. Switch to the `mqm` user: +
`$ su mqm`
2. For Linux, set the following kernel version: +
`$ export LD_ASSUME_KERNEL=2.2.5`
3. Create a new MQ queue manager named "QM1": +
`$ crtmqm QM1`
4. Start the new MQ queue manager. +
In the image above, `QM1` is associated with the IBM WebSphere MQ broker. +
`$ strmqm QM1`
5. Start the MQ listener: +
`$ runmqlsr -t tcp -m QM1 -p 1414 &`
6. Modify the default JMSAdmin console configuration as follows:
[arabic]
.. Edit the JMSAdmin script in the `/opt/mqm/java/bin` directory to
change the JVM to a location of a valid JVM your system.
.. Set the relevant environment variable required for JMSAdmin by
sourcing the `setjmsenv` script located in the `/opt/mqm/java/bin` directory.
+
[source]
----
$ cd /opt/mqm/java/bin
$ source setjmsenv
----
where `/opt/mqm` is the location of the WebSphere MQ installation.
.. Change the JMSAdmin.config file to indicate the Initial Context Factory
you will be using by setting the following name-value pairs and
commenting out the rest:
+
[source]
----
INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory
PROVIDER_URL=file:/opt/tmp
----
7. Create WebSphere MQ queues using the runmqsc console and MQJMS_PSQ.mqsc script. +
`$ runmqsc QM1 < MQJMS_PSQ.mqsc`
8. Create user defined physical queue for your application using
runmqsc console and an appropriate physical queue name. An example of
how this could be done is shown below. +
In the image above, `ORANGE.LOCAL.QUEUE` is associated with `QM1`.
+
[source]
----
$ runmqsc QM1
> DEFINE QLOCAL(ORANGE.LOCAL.QUEUE)
> end
----
9. Start the WebSphere MQ Broker: +
`$ strmqbrk -m QM1`
10. In the WebSphere MQ JMSAdmin console, use the following commands to
create the connection factories, XA connection factories, and
destinations for your application, as shown in the following sample,
which lists each of the various JMS administered objects. +
In the image above, `QCF` (for `QM1`) and `TQueue` (associated with
`ORANGE.LOCAL.QUEUE`) are defined in the `FileSystem Naming Context`.
+
[source]
----
$ ./JMSAdmin
InitCtx>def qcf<JNDI name to be given to the Queue Connection Factory>
hostname<IBM MQ server hostname> port(1414) channel(SYSTEM.DEF.SVRCONN)
transport(CLIENT) qmanager<name of queue manager defined>
For example:
def qcf(QCF) hostname(localhost) port(1414) channel(SYSTEM.DEF.SVRCONN)
transport(CLIENT) qmanager(QM1)
InitCtx%def xaqcf<JNDI name to be given to the XA Queue Connection Factory>
hostname<IBM MQ server hostname> port(1414) channel(SYSTEM.DEF.SVRCONN)
transport(CLIENT) qmanager<name of queue manager defined>
For example:
def xaqcf(XAQCF) hostname(localhost) port(1414) channel(SYSTEM.DEF.SVRCONN)
transport(CLIENT) qmanager(QM1)
InitCtx%def q<JNDI Name to be given to the Queue> queue<physical queue name>
qmanager(name of queue manager defined )
For example: def q(TQueue) queue(ORANGE.LOCAL.QUEUE) qmanager(QM1)
InitCtx%def tcf<JNDI Name to be given to the Topic Connection Factory>
qmanager(name of queue manager defined )
For example: def tcf(TCF) qmanager(QM1)
InitCtx%def xatcf<JNDI Name to be given to the XA Topic Connection Factory>
qmanager(name of queue manager defined )
For example: def xatcf(XATCF) qmanager(QM1)
InitCtx%def t<JNDI Name to be given to the Topic> topic<sample topic name>
For example: def t(TTopic) topic(topic)
----
[[gksni]][[GSADG00684]][[create-a-resource-adapter-configuration-for-genericjmsra-to-work-with-websphere-mq]]
===== Create a Resource Adapter Configuration for GenericJMSRA to Work With WebSphere MQ
Before deploying GenericJMSRA, you need to create a resource adapter
configuration in {productName}. You can do this using either the
Administration Console or the `asadmin` command. Use the following
`asadmin` command to create a resource adapter configuration for
`genericra` to configure it to work with WebSphere MQ.
[source]
----
asadmin> create-resource-adapter-config
--user <adminname> --password <admin password>
--property SupportsXA=true:ProviderIntegrationMode
=jndi:UserName=mqm:Password=###:RMPolicy
=OnePerPhysicalConnection:JndiProperties
=java.naming.factory.url.pkgs\\
=com.ibm.mq.jms.naming,java.naming.factory.initial\\
=com.sun.jndi.fscontext.RefFSContextFactory,java.naming.provider.url\\
=file\\:\\/\\/opt\\/tmp:LogLevel=finest genericra
----
[NOTE]
====
When using `asadmin` you need to escape each `=` and any `:` characters
by prepending a backward slash `\`. The escape sequence is not necessary
if the configuration is performed through the Administration Console.
Also , ensure that the provider URL is configured correctly depending on
the platform. For example, on Windows systems it should be
`file:/C:/opt/tmp` and on UNIX—based systems it is `file://opt/tmp`.
====
This creates a resource adapter configuration with the name `genericra`,
and Oracle recommends not changing the default name. The resource
adapter configuration is configured with the properties specified using
the `--properties` argument; multiple properties are configured as a
colon-separated list of name-value pairs that are entered as a single
line.
In this example, the following properties are configured:
[NOTE]
====
The tables in this section describe the GenericJMSRA properties that are
relevant only when integrating with WebSphere MQ. For a complete list of
properties, see the comprehensive table in link:#gbtvu[GenericJMSRA
Configuration Properties].
====
[width="100%",cols="25%,45%,30%",options="header",]
|===
|Property Name |Required Value |Description
|`SupportsXA`
|`true`
|Set the supports distributed transactions attribute to `true`.
The level of transactional support the adapter provides
-- none, local, or XA -- depends on the capabilities of the
Enterprise Information System (EIS) being adapted. If an adapter
supports XA transactions and this attribute is XA, the application can
use distributed transactions to coordinate the EIS resource with JDBC
and JMS resources.
|`ProviderIntegrationMode`
|`jndi`
|Specifies that connection factories
and destinations in GlassFish's JNDI store are configured to refer to
connection factories and destinations in WebSphere MQ's JNDI store.
|`JndiProperties`
a|
[source]
----
JndiProperties=java.naming.factory.url.pkgs\\=com.ibm.mq.jms.naming,
java.naming.factory.initial\\=com.sun.jndi.fscontext.RefFSContextFactory,
java.naming.provider.url\\=file\\:\\/\\/opt\\/tmp:LogLevel=finest genericra
----
|JNDI properties for connecting to WebSphere MQ's JNDI, specified as
comma-separated list of name=value pairs without spaces.
|`UserName`
|`Name of the WebSphere MQ user`
a|
User name to connect to WebSphere MQ.
The user name can be overridden in `ActivationSpec` and
`ManagedConnection`. If no user name is specified anonymous connections
will be used, if permitted.
|`Password`
|`Password for the WebSphere MQ user`
a|
Password to connect to WebSphere MQ.
The password can be overridden in `ActivationSpec` and
`ManagedConnection`.
|`RMIPolicy`
|`OnePerPhysicalConnection`
a|
Some XAResource implementations, such as WebSphere MQ, rely on a
Resource Manager per Physical Connection, and this causes issues when
there is inbound and outbound communication to the same queue manager in
a single transaction (for example, when an MDB sends a response to a
destination).
When RMPolicy is set to `OnePerPhysicalConnection`, the XAResource
wrapper implementation's `isSameRM` in GenericJMSRA would check if both
the XAResources use the same physical connection, before delegating to
the wrapped objects. Therefore, ensure that this attribute is set to
`OnePerPhysicalConnection` if the application uses XA.
|`LogLevel`
|`Desired log level of JDK logger`
|Used to specify the level of logging.
|===
[NOTE]
====
You must use the values for `SupportsXA`, `RMPolicy` and
`ProviderIntegrationMode` as the required values that are used in this
table.
====
[[gksnh]][[GSADG00685]][[deploy-the-genericjmsra-archive]]
===== Deploy the GenericJMSRA Archive
For instructions on downloading and deploying GenericJMSRA, see
link:#gkkxz[Deploy the GenericJMSRA Resource Archive].
[[gkson]][[GSADG00686]][[create-the-connection-factories-and-administered-objects-in-glassfish-server]]
===== Create the Connection Factories and Administered Objects in {productName}
In order to configure a JMS Connection Factory using GenericJMSRA, a
Connector Connection Pool and resource needs to be created in {productName}, as described in this section.
Using the example WebSphere MQ configuration in link:#gksli[Configure
the WebSphere MQ Administered Objects], you will see `mypool` (pointing
to `GenericJMSRA` and `QCF`) and `jms/MyQCF` (for `mypool`) created in
{productName}.
[NOTE]
====
If you want configure connections and destination resources using the
Administration Console, this is explained in the Administration Console
online help. When using Administration Console, following the,
instructions for creating a new Connector Connection Pool and Admin
Object Resources, and not the instructions for creating a JMS Connection
Pool and Destination Resources. For more information about using
`asadmin` to create these resources, see link:connectors.html#gioce[To
Create a Connector Connection Pool] and link:connectors.html#giogt[To
Create a Connector Resource].
====
[[gksro]][[GSADG00502]][[creating-connections-and-destinations]]
Creating Connections and Destinations
In order to configure a JMS Connection Factory, using GenericJMSRA, a
Connector Connection Pool and Destination resources need to be created
in {productName} using names that map to the corresponding connection
and destination resources in WebSphere MQ. The connections and
destination name in these steps map to the example WebSphere MQ
configuration in link:#gksli[Configure the WebSphere MQ Administered
Objects].
1. Create connection pools that point to the connection pools in
WebSphere MQ.
+
The following `asadmin` command creates a Connection Pool called
`mypool` and points to the `XAQCF` created in WebSphere MQ:
+
[source]
----
asadmin create-connector-connection-pool -- raname genericra connectiondefinition
jakarta.jms.QueueConnectionFactory --transactionsupport XATransaction
--property ConnectionFactoryJndiName=QCF mypool
----
The following `asadmin` command creates a Connection Pool called
`mypool2` and points to the `XATCF` created in WebSphere MQ:
+
[source]
----
asadmin create-connector-connection-pool
-- raname genericra connectiondefinition jakarta.jms.TopicConnectionFactory
--transactionsupport XATransaction
--property ConnectionFactoryJndiName=XATCF mypool2
----
2. Create the connector resources.
+
The following `asadmin` command creates a connector resource named
`jms/MyQCF` and binds this resource to JNDI for applications to use:
+
[source]
----
asadmin create-connector-resource --poolname mypool jms/MyQCF
----
The following `asadmin` command creates a connector resource named
`jms/MyTCF` and binds this resource to JNDI for applications to use:
+
[source]
----
asadmin create-connector-resource --poolname mypool2 jms/MyTCF
----
3. Create the JMS destination resources as administered objects.
+
In the image above, `jms/MyQueue` (pointing to `GenericJMSRA` and
`TQueue`) is created in {productName}.
+
The following `asadmin` command creates a `jakarta.jms.Queue` administered
object and binds it to the {productName} JNDI tree at `jms/MyQueue`
and points to the `jms/TQueue` created in WebSphere MQ.
+
[source]
----
asadmin create-admin-object --raname genericra --restype jakarta.jms.Queue
--property DestinationJndiName=TQueue jms/MyQueue
----
The following `asadmin` command creates a `jakarta.jms.Topic` administered
object and binds it to the {productName} JNDI tree at `jms/MyTopic`
and points to the `jms/TTopic` created in WebSphere MQ.
+
[source]
----
asadmin create-admin-object --raname genericra --restype jakarta.jms.Topic
--property DestinationJndiName=TTopic jms/MyTopic
----
[[gktmn]][[GSADG00687]][[configuring-an-mdb-to-receive-messages-from-websphere-mq]]
===== Configuring an MDB to Receive Messages from WebSphere MQ
The administered object names in the sample deployment descriptor below
map to the example WebSphere MQ configuration in link:#gksli[Configure
the WebSphere MQ Administered Objects]. The deployment descriptors need
to take into account the resource adapter and the connection resources
that have been created. A sample `sun-ejb-jar.xml` for a Message Driven
Bean that listens to a destination called `TQueue` in WebSphere MQ, and
publishes back reply messages to a destination resource named
`jms/replyQueue` in {productName}, as shown below.
[source,xml]
----
<sun-ejb-jar>
<enterprise-beans>
<unique-id.1</unique-id>
<ejb>
<ejb-name>SimpleMessageEJB</ejb-name>
<jndi-name>jms/SampleQueue</jndi-name>
<!-- QCF used to publish reply messages -->
<resource-ref>
<res-ref-name>jms/MyQueueConnectionFactory</res-ref-name>
<jndi-name>jms/MyQCF</jndi-name>
<default-resource-principal>
<name>mqm</name>
<password>mqm</password>
</default-resource-principal>
</resource-ref>
<!-- reply destination resource> Creating of this replyQueue destination resource is not
shown above, but the steps are similar to creating the "jms/MyQueue" resource -->
<resource-env-ref>
<resource-env-ref-name>jms/replyQueue</resource-env-ref-name>
<jndi-name>jms/replyQueue</jndi-name>
</resource-env-ref>
<!-- Activation related RA specific configuration for this MDB -->
<mdb-resource-adapter>
<!-- resource-adapter-mid points to the Generic Resource Adapter for JMS -->
<resource-adapter-mid>genericra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>DestinationType</activation-config-property-name>
<activation-config-property-value>javax>jms>Queue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>ConnectionFactoryJndiName</activation-config-property-name>
<activation-config-property-value>QCF</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>DestinationJndiName</activation-config-property-name>
<activation-config-property-value>TQueue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>MaxPoolSize</activation-config-property-name>
<activation-config-property-value>32</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>RedeliveryAttempts</activation-config-property-name>
<activation-config-property-value>0</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>ReconnectAttempts</activation-config-property-name>
<activation-config-property-value>4</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>ReconnectInterval</activation-config-property-name>
<activation-config-property-value>10</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>RedeliveryInterval</activation-config-property-name>
<activation-config-property-value>1</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>SendBadMessagesToDMD</activation-config-property-name>
<activation-config-property-value>false</activation-config-property-value>
</activation-config-property>
</activation-config>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
----
The business logic encoded in Message Driven Bean could then lookup the
configured `QueueConnectionFactory/Destination` resource to create a
connection as shown below.
[source,java]
----
Context context = null;
ConnectionFactory connectionFactory = null;
logger.info("In PublisherBean>ejbCreate()");
try {
context = new InitialContext();
queue = (javax.jms.Queue) context.lookup ("java:comp/env/jms/replyQueue");
connectionFactory = (ConnectionFactory) context>lookup("java:comp/env/jms/MyQueueConnectionFactory");
connection = connectionFactory>createConnection();
} catch (Throwable t) {
logger.severe("PublisherBean>ejbCreate:" + "Exception: " + t.toString());
}
----