Enhanced Support for Using WebLogic JMS with EJBs and Servlets (2024)

Enabling WebLogic JMS Wrappers

WebLogic Server uses JMS wrappers that make it easier to use WebLogic JMS inside a Java EE component, such as an EJB or a servlet, while also providing a number of enhanced usability and performance features:

  • Automatic pooling of JMS connection and session objects (and some pooling of message producer objects as well)

  • Automatic transaction enlistment for WebLogic JMS implementations and for third-party JMS providers that support two-phase commit transactions (XA protocol)

  • Testing of the JMS connection, as well as reestablishment after a failure

  • Security credentials that are managed by the EJB or servlet container

The following sections provide information on how to use WebLogic JMS wrappers:

  • Declaring JMS Objects as Resources In the EJB or Servlet Deployment Descriptors

  • Referencing a Packaged JMS Application Module In Deployment Descriptor Files

  • Declaring JMS Destinations and Connection Factories Using Annotations

  • Avoid Transactional XA Interfaces

Declaring a JMSContext Object Using @Inject Annotation

WebLogic Server 12.2.1 release supports the JMS 2.0 simplified API, which enables you to inject a JMSContext object into the application using the @Inject annotation as follows:

@Inject@JMSConnectionFactory("myJMSCF")@JMSPasswordCredential( userName="admin", password="mypassword")private JMSContext context;

The @Inject annotation determines when the container should create the JMSContext object.

Note:

  • Injection should be enabled for the class. Depending on the class being used and the archive in which it is packaged, it may be necessary to specify a beans.xml file. For more information, see Using Contexts and Dependency Injection for the Java EE Platform in Developing Applications forOracle WebLogic Server.

  • If the injected JMSContext is null and if your application fails, then review the server log. If the connection factory could not be found, you can see that error in the server log. If there is no error in the server log then the application failure is probably due to a missing beans.xml file.

Specifying a Lookup Name in JMSContext Injection

When injecting a JMSContext object, you can use the @JMSConnectionFactory annotation to specify the product-specific global JNDI look up name of a connection factory to be used by the container.

Note:

When you provide a product-specific global JNDI name for the connection factory annotation, you cannot override it using a resource reference in the deployment descriptor of the container.

Alternatively, you can specify a fully qualified resource reference name of the form java:comp/env/res-ref-name as follows:

@Inject@JMSConnectionFactory("java:comp/env/res-ref-name")private JMSContext context;

In this case, the resource reference name must be defined using a <resource-ref> element in the deployment descriptor that maps it to an appropriate product-specific global JNDI name. See Declaring a Wrapped JMS Factory using Deployment Descriptors.

If no lookup name is provided for the @JMSConnectionFactory annotation, then the Java EE platform default JMS connection factory (java:comp/DefaultJMSConnectionFactory) will be used.

Determining the Authentication Type for JMSContext Injection

The JMSContext injection cannot use the resource reference to determine whether the connection factory should use container authentication or application authentication. Instead, you can use the @JMSPasswordCredential annotation to specify the type of authentication required.

If you specify the @JMSPasswordCredential annotation then the connection factory will use password authentication, and the specified user and password. If the @JMSPasswordCredential annotation is not defined then the connection factory will use container authentication.

Declaring JMS Objects as Resources In the EJB or Servlet Deployment Descriptors

The following sections provide information on declaring JMS objects as resources:

  • Declaring a Wrapped JMS Factory using Deployment Descriptors

  • Declaring JMS Destinations using Deployment Descriptors

For more information about packaging EJBs, see Implementing Enterprise JavaBeansin Developing Enterprise JavaBeans,Version 2.1, for Oracle WebLogic Server. For more information about programming servlets, see Creating and Configuring Servlets in Developing Web Applications,Servlets, and JSPs for Oracle WebLogic Server.

Declaring a Wrapped JMS Factory using Deployment Descriptors

Note:

New applications will likely use EJB 3.0 annotations instead of deployment descriptors. Annotations are described in Declaring JMS Destinations and Connection Factories Using Annotations.

You can declare a JMS connection factory as part of an EJB or servlet by defining a resource-ref element in the ejb-jar.xml or web.xml file, respectively. This process creates a "wrapped" JMS connection factory that can benefit from the more advanced session pooling, automatic transaction enlistment, connection monitoring, and container-managed security features described in Improving Performance Through Pooling.

Here is an example of such a connection factory element:

<resource-ref> <res-ref-name>jms/QCF</res-ref-name> <res-type>javax.jms.QueueConnectionFactory</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope></resource-ref>

This element declares that a JMS QueueConnectionFactory object be bound into JNDI, at the location:

java:comp/env/jms/QCF

This JNDI name is only valid inside the context of the EJB or servlet where the resource-ref is declared, which is what the java:comp/env JNDI context signifies.

In addition to this element, there must be a matching resource-description element in the ejb-jar.xml (for EJBs) or weblogic.xml (for servlets) file that tells the Java EE container which JMS connection factory to put in that location. Here is an example:

<resource-description> <res-ref-name>jms/QCF</res-ref-name> <jndi-name>weblogic.jms.ConnectionFactory</jndi-name></resource-description>

The connection factory specified here must already exist in the global JNDI tree. (This example uses one of the default JMS connection factories that is automatically created when the built-in WebLogic JMS server is used). To use another WebLogic JMS connection factory from the same cluster, include that connection factory's JNDI name inside the jndi-name element. To use a connection factory from another vendor, or from another WebLogic Server cluster, create a Foreign JMS Server.

If the JNDI name specified in the resource-description element is incorrect, then the application is still deployed. However, you will receive an error when you try to use the connection factory.

Declaring JMS Destinations using Deployment Descriptors

You can define a JMS destination resource in a web module, EJB module, application client module, or in an application deployment descriptor using the jms-destination or resource-env-ref descriptor elements.

Note:

New applications will likely use EJB 3.2 annotations instead of deployment descriptors. Annotations are described in Declaring JMS Destinations and Connection Factories Using Annotations.

The transaction enlistment, pooling, connection monitoring features take place in the connection factory, not in the destinations. However, this feature is useful for consistency, and to make an application less dependent on a particular configuration of WebLogic Server, since destinations can easily be modified by simply changing the corresponding jms-destination or resource-env-ref description, without having to recompile the source code

Declaring JMS Destinations Using the jms-destination Element

You can define a JMS destination resource using the jms-destination element in the ejb-jar.xml or web.xml deployment descriptors. It creates the destination and binds it to the appropriate naming context based on the namespace specified.

The following example defines a queue destination myQueue1 that is bound to JNDI at the location java:app/MyJMSDestination:

<jms-destination> <description>JMS Destination definition</description> <name>java:app/MyJMSDestination</name> <interface-name>javax.jms.Queue</interface-name> <destination-name>myQueue1</destination-name> <property> <name>Property1</name> <value>10</value> </property> <property> <name>Property2</name> <value>20</value> </property></jms-destination>

For more information about the jms-destination element and its attributes, see the schema at http://xmlns.jcp.org/xml/ns/javaee/javaee_7.xsd.

Declaring JMS Destinations Using the resource-env-ref Element

You can also bind a JMS queue or topic destination into the java:comp/env JNDI tree by declaring it as a resource-env-ref element in the ejb-jar.xml or web.xml deployment descriptors.

For resource-env-ref description, the queue or topic destination specified in the descriptor must already exist in the global JNDI tree. Again, if the destination does not exist, then the application is deployed, but an exception is thrown when you try to use the destination.

Here is an example of such a queue destination element:

<resource-env-ref> <resource-env-ref-name>jms/TESTQUEUE</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type></resource-env-ref>

This element declares that a JMS Queue destination object will be bound into JNDI, at the location:

java:comp/env/jms/TESTQUEUE

As with a referenced connection factory, this JNDI name is only valid inside the context of the EJB or servlet where the resource-ref is declared.

You must also define a matching resource-env-description element in the weblogic-ejb-jar.xml or weblogic.xml file. This provides a layer of indirection that enables you to easily modify referenced destinations just by changing the corresponding resource-env-ref deployment descriptors.

<resource-env-description> <resource-env-ref-name>jms/TESTQUEUE</resource-env-ref-name> <jndi-name>jmstest.destinations.TESTQUEUE</jndi-name></resource-env-description>

Referencing a Packaged JMS Application Module In Deployment Descriptor Files

When you package a JMS module with an enterprise application, you must reference the JMS resources within the module in all applicable descriptor files of the Java EE application components, including:

  • The WebLogic enterprise descriptor file, weblogic-application.xml

  • Any WebLogic deployment descriptor file, such as weblogic-ejb-jar.xml or weblogic.xml

  • Any Java EE descriptor file, such as EJB (ejb-jar.xml) or WebApp (web.xml) files

Referencing Application Modules in a weblogic-application.xml Descriptor

When including JMS modules in an enterprise application, you must list each JMS module as a module element of type JMS in the weblogic-application.xml descriptor file packaged with the application, and a path that is relative to the root of the Java EE application. Here is an example of a reference to a JMS module name Workflows:

<module> <name>Workflows</name> <type>JMS</type> <path>jms/Workflows-jms.xml</path></module>

Referencing JMS Resources in a WebLogic Application

Within any weblogic-foo descriptor file, such as EJB (weblogic-ejb-jar.xml) or WebApp (weblogic.xml), the name of the JMS module is followed by a number (#) separator character, which is followed by the name of the resource inside the module. For example, a JMS module named Workflows that contains a queue named OrderQueue, would have a name of Workflows#OrderQueue.

<resource-env-description> <resource-env-ref-name>jms/OrderQueue</resource-env-ref-name> <resource-link>Workflows#OrderQueue</resource-link></resource-env-description>

Note that the <resource-link> element is unique to WebLogic Server, and is how the resources that are defined in a JMS module are referenced (linked) from the other Java EE Application components.

Referencing JMS Resources in a Java EE Application

The name element of a JMS connection factory resource specified in the JMS module must match the res-ref-name element defined in the referring EJB or WebApp application descriptor file. The res-ref-name element maps the resource name (used by java:comp/env) to a module referenced by an EJB.

For queue or topic destination resources specified in the JMS module, the name element must match the resource-env-ref field defined in the referring module descriptor file.

That name is how the link is made between the resource referenced in the EJB or web application module and the resource defined in the JMS module. For example:

<resource-ref> <res-ref-name>jms/OrderQueueFactory</res-ref-name> <res-type>javax.jms.ConnectionFactory</res-type></resource-ref><resource-env-ref> <resource-env-ref-name>jms/OrderQueue</resource-env-ref-name> <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type> </resource-env-ref>

Declaring JMS Destinations and Connection Factories Using Annotations

WebLogic Server 10.0 and later releases support the EJB 3.0 programming model which uses annotations to configure metadata, eliminating the need for deployment descriptors. You can declare JMS objects using the @Resources annotation as described in Standard JDK Annotations Used By EJB 3.0 in Developing Enterprise JavaBeansfor Oracle WebLogic Server.

Injecting Resource Dependency into a Class

If you apply the @Resource to a class, then the resource is made available in the comp/env context. The following is an example of how to inject a WebLogic JMS destination and connection factory resource in a Java EE application, including EJBs, MDBs, and servlets.

Example 4-1 is a Wrapped JMS Pooling Annotation example:

Example 4-1 Wrapped JMS Pooling Annotation Example

...// The "name=" or "type=" are not always required,// "mappedName=" is usually sufficient.@Resource(name="ReplyQueue", type=javax.jms.Queue.class, mappedName="jms/ReplyQueue") Destination rq;...@Resource(name="ReplyConnectionFactory", type=javax.jms.ConnectionFactory.class, mappedName = "jms/ConnectionFactory") ConnectionFactory cf;...

Non-Injected EJB 3.0 Resource Reference Annotations

Injected resource dependencies are resolved when the host EJB or servlet is instantiated. You may not want injected resource because:

  • The injection may prevent applications from deploying successfully if the container attempts to resolve references during deployment.

  • You might want to defer reference resolution until the application is first invoked.

You can setup a non-injected resource reference by placing the @Resources annotation above the class definition. An application can resolve such references at runtime by looking up the reference in the bean context. As a best practice, the bean or servlet should also cache the result in order to avoid the overhead of repeated lookups as shown in Example 4-2:

For a full example, see EJB 3.0 Wrapper Without Injection.

Example 4-2 Non-Injected Resource Example

...@Resources ({ @Resource(name="targetCFRef", mappedName="TargetCFJNDIName", type=javax.jms.ConnectionFactory.class), @Resource(name="targetDestRef", mappedName="TargetDestJNDIName", type=javax.jms.Destination.class)}) @Stateless(mappedName="StatelessBean")public class MyStatelessBean implements MyStateless { @Resource private SessionContext sctx; // inject the bean context private ConnectionFactory targetCF; private Destination targetDest; public void completeWorkOrder() { // Lookup the JMS resources and cache for re-use. Note that a // "java:/comp/env" prefix isn't needed for EJB3.0 bean contexts. if (targetCF == null) targetCF = (javax.jms.ConnectionFactory)sctx.lookup("targetCFRef"); if (targetDest == null) targetDest = (javax.jms.Destination)sctx.lookup("targetDestRef");...

Avoid Transactional XA Interfaces

With resource wrapping, do not use the javax.jms XA transactional XA interfaces. The container uses them internally if the JMS code is used inside a transaction context. This allows your EJB application code to run EJBs in an environment where transactions are present or in a non-transactional environment, just by changing the deployment descriptors.

Disabling Wrapping and Pooling

It is sometimes desirable to leverage resource references but disable resource reference wrapping and pooling. To do this, use the deployment descriptor approach, but change the res-type to java.lang.Object.class in the resource-ref stanza for the connection factory. There is currently no known way to disable wrapping and pooling using annotations.

What's Happening Under the JMS Wrapper Covers

This section explains what is actually taking place under the covers when WebLogic Server creates a set of wrappers around the JMS objects. For example, the code fragment in Sending a JMS Message in a Java EE Container, shows an instance of a WebLogic-specific wrapper class being returned, rather than the actual JMS connection factory because the connection factory was looked up from the java:comp/env JNDI tree. This wrapper object intercepts certain calls to the JMS provider and inserts the correct Java EE behavior, as described in the following sections.

  • Automatically Enlisting Transactions

  • Container-Managed Security

  • Connection Testing

  • Java EE Compliance

  • Pooled JMS Connection Objects

  • Monitoring Pooled Connections

Automatically Enlisting Transactions

Automatically Enlisting Transaction works for either WebLogic JMS implementations or for third-party JMS providers that support two-phase commit transactions (XA protocol). If a wrapped JMS connection sends or receives a message inside a transaction context, then the JMS session being used to send or receive the message is automatically enlisted in the transaction through the XA capabilities of the JMS provider. This is the case whether the transaction was started implicitly because the JMS code was invoked inside an EJB with container-managed transactions enabled, or whether the transaction was started manually using the UserTransaction interface in a servlet or an EJB that supports bean-managed transactions.

However, if an EJB or servlet attempts to send or receive a message inside a transaction context and the JMS provider does not support XA, the send() or receive() call throws the following exception:

[J2EE:160055] Unable to use a wrapped JMS session in the transaction because two-phase commit is not available.

Therefore, if you are using a JMS provider that doesn't support XA to send or receive a message inside a transaction, then either declare the EJB with a transaction mode of NotSupported or suspend the transaction using one of the JTA APIs.

Enhanced Support for Using WebLogic JMS with EJBs and Servlets (2024)
Top Articles
Ford Ranger 2024: Bảng giá xe Ranger 2024 08/2024
How to Move Fans from Spotify to a Mailing List for Better Engagement
Stretchmark Camouflage Highland Park
Instructional Resources
Sissy Hypno Gif
Richard Sambade Obituary
Gameplay Clarkston
Category: Star Wars: Galaxy of Heroes | EA Forums
Overzicht reviews voor 2Cheap.nl
What's New on Hulu in October 2023
Moe Gangat Age
Programmieren (kinder)leicht gemacht – mit Scratch! - fobizz
Walthampatch
House Party 2023 Showtimes Near Marcus North Shore Cinema
Hoe kom ik bij mijn medische gegevens van de huisarts? - HKN Huisartsen
180 Best Persuasive Essay Topics Ideas For Students in 2024
Q Management Inc
Second Chance Maryland Lottery
Salem Oregon Costco Gas Prices
24 Hour Drive Thru Car Wash Near Me
Forum Phun Extra
Craigslist Prescott Az Free Stuff
Football - 2024/2025 Women’s Super League: Preview, schedule and how to watch
Mj Nails Derby Ct
‘The Boogeyman’ Review: A Minor But Effectively Nerve-Jangling Stephen King Adaptation
Cain Toyota Vehicles
Rs3 Ushabti
Reicks View Farms Grain Bids
Roanoke Skipthegames Com
Spectrum Outage in Queens, New York
Lesson 1.1 Practice B Geometry Answers
Ipcam Telegram Group
Ancestors The Humankind Odyssey Wikia
Urban Blight Crossword Clue
Baddies Only .Tv
Housing Assistance Rental Assistance Program RAP
Most popular Indian web series of 2022 (so far) as per IMDb: Rocket Boys, Panchayat, Mai in top 10
Craigslist West Seneca
Pensacola 311 Citizen Support | City of Pensacola, Florida Official Website
Afspraak inzien
USB C 3HDMI Dock UCN3278 (12 in 1)
Cnp Tx Venmo
Dwc Qme Database
Todd Gutner Salary
Ts In Baton Rouge
Suppress Spell Damage Poe
Barber Gym Quantico Hours
Vcuapi
The Significance Of The Haitian Revolution Was That It Weegy
Pulpo Yonke Houston Tx
Public Broadcasting Service Clg Wiki
Latest Posts
Article information

Author: Errol Quitzon

Last Updated:

Views: 6340

Rating: 4.9 / 5 (59 voted)

Reviews: 82% of readers found this page helpful

Author information

Name: Errol Quitzon

Birthday: 1993-04-02

Address: 70604 Haley Lane, Port Weldonside, TN 99233-0942

Phone: +9665282866296

Job: Product Retail Agent

Hobby: Computer programming, Horseback riding, Hooping, Dance, Ice skating, Backpacking, Rafting

Introduction: My name is Errol Quitzon, I am a fair, cute, fancy, clean, attractive, sparkling, kind person who loves writing and wants to share my knowledge and understanding with you.