Skip Headers
Oracle® Fusion Middleware Programming Message-Driven Beans for Oracle WebLogic Server
11g Release 1 (10.3.3)

Part Number E15493-02
Go to Documentation Home
Home
Go to Book List
Book List
Go to Table of Contents
Contents
Go to Master Index
Master Index
Go to Feedback page
Contact Us

Go to previous page
Previous
Go to next page
Next
View PDF

7 Using EJB 3.0 Compliant MDBs

The following topics provide information on how to program and implement EJB 3.0 compliant MDBs:

Implementing EJB 3.0 Compliant MDBs

To implement EJB 3.0 compliant MDBs, follow the steps described in "Overview of the EJB 3.0 Development Process" in Programming WebLogic Enterprise JavaBeans, Version 3.0 for Oracle WebLogic Server.

Programming EJB 3.0 Compliant MDBs

To program EJB 3.0 compliant MDBs, follow the steps described in "Programming the Bean File: Typical Steps" in Programming WebLogic Enterprise JavaBeans, Version 3.0 for Oracle WebLogic Server.

You must use the @javax.ejb.MessageDriven annotation to declare the EJB type as Message-driven. You can specify the following optional attributes:

For detailed information on developing MDBs to support the messaging modes as described in MDBs and Messaging Models, see Programming and Configuring MDBs: Details.

Example MDB Using Annotations

This example demonstrates EJB 3.0 annotations for an MDB that references resources that are not injected. The references are resolved at runtime when the MDB is invoked instead of when the MDB instances are instantiated.

Example 7-1 Non-Injected Resources MDB Example

package test;
 
import javax.annotation.Resources;
import javax.annotation.Resource;
import javax.naming.*;
import javax.ejb.*;
import javax.jms.*;
 
import weblogic.javaee.MessageDestinationConfiguration;
import weblogic.javaee.TransactionTimeoutSeconds;
 
@MessageDriven(
  name = "MyMDB",
  mappedName = "JNDINameOfMDBSourceDest"
)
 
// optionally specify a connection factory
// there's no need to specify a connection factory if the source
// destination is a WebLogic JMS destination
 
@MessageDestinationConfiguration( 
  connectionFactoryJNDIName = "JNDINameOfMDBSourceCF"  
)
 
// optionally set a tx timeout, the default timeout is typically 30 seconds
 
@TransactionTimeoutSeconds(value = 60) 
 
// resources that are not injected
 
@Resources ({
  @Resource(name="targetCFRef", 
            mappedName="TargetCFJNDIName",
            type=javax.jms.ConnectionFactory.class), 
 
  @Resource(name="targetDestRef",
            mappedName="TargetDestJNDIName",
            type=javax.jms.Destination.class)
})
 
 
public class MyMDB implements MessageListener {
 
  // inject a reference to the MDB context
 
  @Resource
  private MessageDrivenContext mdctx;  
 
  // cache targetCF and targetDest for re-use (performance) 
 
  private ConnectionFactory targetCF;
  private Destination targetDest;
 
  @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void onMessage(Message message) {
 
    Connection jmsConnection = null;
 
    try {
      System.out.println("My MDB got message: " + message);
 
      if (targetCF == null) 
        targetCF = (javax.jms.ConnectionFactory)mdctx.lookup("targetCFRef");
 
      if (targetDest == null)
        targetDest = (javax.jms.Destination)mdctx.lookup("targetDestRef");
 
      jmsConnection = targetCF.createConnection();
      Session s = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      MessageProducer mp = s.createProducer(null);
 
      if (message.getJMSReplyTo() != null) 
        mp.send(message.getJMSReplyTo(), s.createTextMessage("My Reply"));
      else
        mp.send(targetDest, message);
      
    } catch (JMSException e) {
      throw new EJBException(e); 
 
    } finally {
 
      // Return JMS resources to the resource reference pool for later re-use.
      // Closing a connection automatically also closes its sessions, etc.
 
      try { if (jmsConnection != null) jmsConnection.close(); }
      catch (JMSException ignored) {};
    }
  }
}

activationConfig Properties

activationConfig properties are name-value pairs that are passed to the MDB container when an MDB is deployed. The properties can be declared in either an ejb-jar.xml deployment descriptor or using the @ActivationConfigProperty annotation on the MDB bean class. See "javax.ejb.ActivationConfigProperty" in Programming WebLogic Enterprise JavaBeans, Version 3.0 for Oracle WebLogic Server.

Example 7-2 Example @ActivationConfigProperty Code

. . .
@ActivationConfigProperties(
    {
        @ActivationConfigProperty(
            name="connectionFactoryJndiName", value="JNDINameOfMDBSourceCF"
        ),
        @ActivationConfigProperty(
            name="initialContextFactory", value="weblogic.jndi.WLInitialContextFactory"
        )
    }
)
. . .

Note:

If activationConfig properties names conflict with with existing descriptors, use the descriptor's priority order to resolve conflicts. The a descriptors priority order (from highest to lowest) is: weblogic-ejb-jar.xml, WebLogic Server 10.0 annotations, ejb-jar.xml, and finally activationConfig properties. For example, if the same descriptor exists in the weblogic-ejb-jar.xml and ejb-jar.xml, weblogic-ejb-jar.xml has the higher priority order and overrides the ejb-jar.xml value.

Table 10-4 summarizes activationConfig name-value pairs supported by WebLogic Server.