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 ("java:comp/env/jms/stockInfoQueue");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 method | Bean method can perform the following operations | |
---|---|---|
Container-managed transaction demarcation | Bean-managed transaction demarcation | |
constructor | - | - |
setMessageDrivenContext | JNDI access to java:comp/env | JNDI access to java:comp/env |
ejbCreate() ejbRemove() | JNDI access to java:comp/env | MessageDrivenContext methods: getUserTransaction() JNDI access to java:comp/env |
onMessage() | 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). 0
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.