Home Javacertification Bcd-guide Chapter 10. Message-Driven Bean Component Contract

Ask Questions?

View Latest Questions



Chapter 10. Message-Driven Bean Component Contract
Posted on: April 18, 2011 at 12:00 AM
This page discusses - Chapter 10. Message-Driven Bean Component Contract

Chapter 10. Message-Driven Bean Component Contract

Identify correct and incorrect statements or examples about the client view of a message-driven bean, and the life cycle of a message-driven bean.

To a client, a message-driven bean is simply a JMS message consumer. The client sends messages to the Destination (Queue or Topic) for which the message-driven bean is the MessageListener just as it would to any other Destination. The message-driven bean, like any other JMS message consumer, handles the processing of the messages.

From the perspective of the client, the existence of a message-driven bean is completely hidden behind the JMS destination for which the message-driven bean is the message listener.

A client locates the JMS Destination associated with a message-driven bean by using JNDI. For example, the Queue for the StockInfo message-driven bean can be located using the following code segment:

Context initialContext = new InitialContext();
Queue stockInfoQueue = (javax.jms.Queue)initialContext.lookup
Message-driven beans don't have home/local home and remote/local interfaces.

A client's JNDI name space may be configured to include the JMS Destinations of message-driven beans installed in MULTIPLE EJB Containers located on MULTIPLE machines on a NETWORK. The actual locations of an enterprise bean and EJB Container are, in general, transparent to the client using the enterprise bean.

When a client sends a message to a Destination for which a message-driven bean is the consumer, the container selects one of its METHOD-READY instances and invokes the instance's onMessage method.

The following steps describe the lifecyle of a message-driven bean instance:

  • A message-driven bean instance's life starts when the container invokes newInstance() on the message-driven bean class to create a new instance. Next, the container calls setMessageDrivenContext(...) followed by ejbCreate() on the instance.

  • The message-driven bean instance is now READY to be delivered a message sent to its Destination by any client.

  • When the CONTAINER no longer needs the instance (which usually happens when the container wants to reduce the number of instances in the METHOD-READY POOL), the container invokes ejbRemove() on it. This ends the life of the message-driven bean instance.

The table defines the methods of a message-driven bean class in which the message-driven bean instances can access the methods of the javax.ejb.MessageDrivenContext interface, the java:comp/env environment naming context, resource managers, and other enterprise beans.

Table 10.1. Operations allowed in the methods of a message-driven bean class

Bean methodBean method can perform the following operations
Container-managed transaction demarcationBean-managed transaction demarcation

JNDI access to java:comp/env

JNDI access to java:comp/env



JNDI access to java:comp/env

MessageDrivenContext methods: getUserTransaction()

JNDI access to java:comp/env


MessageDrivenContext methods: getRollbackOnly(), setRollbackOnly()

JNDI access to java:comp/env

Resource manager access

Enterprise bean access

MessageDrivenContext methods: getUserTransaction()

UserTransaction methods

JNDI access to java:comp/env

Resource manager access

Enterprise bean access

Additional restrictions:

  • The getRollbackOnly() and setRollbackOnly() methods of the MessageDrivenContext interface should be used ONLY in the message-driven bean methods that execute in the context of a transaction. The Container must throw the java.lang.IllegalStateException if the methods are invoked while the instance is not associated with a transaction.

The reasons for disallowing operations in the table:

  • Invoking the getCallerPrincipal() and isCallerInRole(...) methods is DISALLOWED in the message-driven bean methods because the Container DOES NOT HAVE a client security context. The Container MUST throw and log the java.lang.IllegalStateException if either of these methods is invoked.

  • Invoking the getRollbackOnly() and setRollbackOnly() methods is DISALLOWED in the message-driven bean methods for which the Container DOES NOT HAVE a meaningful transaction context, and for all message-driven beans with bean-managed transaction demarcation (BMT).

  • The UserTransaction interface is UNAVAILABLE to message-driven beans with container-managed transaction demarcation (CMT).

  • Invoking getEJBHome() or getEJBLocalHome() is DISALLOWED in message-driven bean methods because THERE ARE NO EJBHome or EJBLocalHome objects for message-driven beans. The Container MUST throw and log the java.lang.IllegalStateException if these methods are invoked.

  • Visit http://java.boot.by  for the updates.