Class MessageBeanContainer

java.lang.Object
com.sun.ejb.containers.BaseContainer
org.glassfish.ejb.mdb.MessageBeanContainer
All Implemented Interfaces:
com.sun.ejb.Container, com.sun.enterprise.container.common.spi.JavaEEContainer, org.glassfish.ejb.api.MessageBeanProtocolManager, org.glassfish.enterprise.iiop.spi.EjbContainerFacade

public final class MessageBeanContainer extends com.sun.ejb.containers.BaseContainer implements org.glassfish.ejb.api.MessageBeanProtocolManager
This class provides container functionality specific to message-driven EJBs. At deployment time, one instance of this class is created for each message-driven bean in an application.

The 3 states of a Message-driven EJB (an EJB can be in only 1 state at a time):

 1. POOLED : ready for invocations, no transaction in progress
 2. INVOKING : processing an invocation
 3. DESTROYED : does not exist
 
A Message-driven Bean can hold open DB connections across invocations. It's assumed that the Resource Manager can handle multiple incomplete transactions on the same connection.
Author:
Kenneth Saks
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static enum 
     

    Nested classes/interfaces inherited from class com.sun.ejb.containers.BaseContainer

    com.sun.ejb.containers.BaseContainer.ContainerInfo, com.sun.ejb.containers.BaseContainer.ContainerType, com.sun.ejb.containers.BaseContainer.PreInvokeException
  • Field Summary

    Fields inherited from class com.sun.ejb.containers.BaseContainer

    cacheProbeListener, cacheProbeNotifier, callFlowInfo, componentId, CONTAINER_INITIALIZING, CONTAINER_ON_HOLD, CONTAINER_STARTED, CONTAINER_STOPPED, CONTAINER_UNDEPLOYED, containerInfo, containerState, containerStateManager, containerTransactionManager, debugMonitorFlag, ejbActivateMethod, ejbClass, ejbContainerUtilImpl, ejbDescriptor, ejbGeneratedOptionalLocalBusinessIntfClass, ejbHome, ejbHomeImpl, ejbHomeStub, ejbIntfMethodInfo, ejbIntfMethods, ejbLocalBusinessHome, ejbLocalBusinessHomeImpl, ejbLocalHome, ejbLocalHomeImpl, EJBLocalObject_getPrimaryKey, EJBObject_getPrimaryKey, ejbOptionalLocalBusinessHome, ejbOptionalLocalBusinessHomeImpl, ejbOptionalLocalBusinessHomeIntf, ejbPassivateMethod, ejbProbeListener, ejbProbeNotifier, ejbRemoteBusinessHome, ejbRemoteBusinessHomeImpl, ejbRemoteBusinessHomeStub, ejbRemoveMethod, envProps, hasLocalBusinessView, hasLocalHomeView, hasOptionalLocalBusinessView, hasRemoteBusinessView, hasRemoteHomeView, homeIntf, injectionManager, interceptorManager, invocationInfoMap, invocationManager, isBeanManagedTran, isLocal, isMessageDriven, isRemote, isSession, isSingleton, isStatefulSession, isStatelessSession, isWebServiceEndpoint, loader, localBusinessHomeIntf, localBusinessIntfs, localHomeIntf, metadata, methodMonitorMap, monitorOn, namingManager, NO_PARAMS, optIntfClassLoader, poolProbeListener, remoteBusinessHomeIntf, remoteBusinessIntfInfo, remoteHomeRefFactory, remoteIntf, scheduleIds, securityManager, sfsbSerializedClass, SINGLETON_BEAN_POOL_PROP, timerProbeListener, timerProbeNotifier, transactionManager, webServiceEndpointIntf, webServiceInvocationInfoMap

    Fields inherited from interface com.sun.ejb.Container

    SEC_CHECKED, SEC_EXCLUDED, SEC_NOT_INITIALIZED, SEC_UNCHECKED, secAttrStrings, TX_BEAN_MANAGED, TX_MANDATORY, TX_NEVER, TX_NOT_INITIALIZED, TX_NOT_SUPPORTED, TX_REQUIRED, TX_REQUIRES_NEW, TX_SUPPORTS, txAttrStrings
  • Method Summary

    Modifier and Type
    Method
    Description
    protected com.sun.ejb.containers.EJBContextImpl
     
    protected com.sun.ejb.ComponentContext
    _getContext(com.sun.ejb.EjbInvocation inv)
     
    void
    activateEJB(Object ctx, Object instanceKey)
     
    protected void
     
    protected void
    afterBegin(com.sun.ejb.containers.EJBContextImpl context)
     
    protected void
    afterCompletion(com.sun.ejb.containers.EJBContextImpl ctx, int status)
     
    void
    afterMessageDelivery(com.sun.appserv.connectors.internal.api.ResourceHandle resourceHandle)
     
    protected void
    beforeCompletion(com.sun.ejb.containers.EJBContextImpl context)
     
    void
    beforeMessageDelivery(Method method, MessageBeanContainer.MessageDeliveryType deliveryType, boolean txImported, com.sun.appserv.connectors.internal.api.ResourceHandle resourceHandle)
    Actual message delivery happens in three steps : 1) beforeMessageDelivery(Message, MessageListener) This is our chance to make the message delivery itself part of the instance's global transaction.
    protected boolean
    callEJBTimeout(com.sun.ejb.containers.RuntimeTimerState timerState, com.sun.ejb.containers.EJBTimerService timerService)
    Override callEJBTimeout from BaseContainer since delivery to message driven beans is a bit different from session/entity.
    com.sun.ejb.containers.EJBObjectImpl
     
    org.glassfish.ejb.api.MessageBeanListener
    createMessageBeanListener(com.sun.appserv.connectors.internal.api.ResourceHandle resource)
    The following are implementation for methods required by the * MessageBeanProtocalManager interface.
    Generates the appropriate Proxy based on the message listener type.
     
    void
    destroyMessageBeanListener(org.glassfish.ejb.api.MessageBeanListener listener)
     
    protected void
    doConcreteContainerShutdown(boolean appBeingUndeployed)
    Called by BaseContainer during container shutdown sequence
    protected void
    forceDestroyBean(com.sun.ejb.containers.EJBContextImpl ejbContext)
    Force destroy the EJB.
    com.sun.ejb.containers.EJBObjectImpl
    getEJBObjectImpl(byte[] instanceKey)
     
     
    protected com.sun.ejb.monitoring.stats.EjbMonitoringStatsProvider
    getMonitoringStatsProvider(String appName, String modName, String ejbName)
     
    com.sun.enterprise.deployment.runtime.BeanPoolDescriptor
     
    protected void
     
    protected boolean
     
    boolean
     
    boolean
    passivateEJB(com.sun.ejb.ComponentContext context)
     
    void
    postInvoke(com.sun.ejb.EjbInvocation inv)
     
    void
    preInvoke(com.sun.ejb.EjbInvocation inv)
     
    protected void
    registerMonitorableComponents(Method[] msgListenerMethods)
     
    void
    releaseContext(com.sun.ejb.EjbInvocation inv)
    Return instance to a pooled state.
    protected void
    removeBean(com.sun.ejb.containers.EJBLocalRemoteObject ejbo, Method removeMethod, boolean local)
     
    boolean
     
    void
    setEJBHome(jakarta.ejb.EJBHome ejbHome)
     
    void
    startApplication(boolean deploy)
    Called when the application containing this message-bean has successfully gotten through the initial load phase of each module.
    protected static int
    stringToInt(String val, String appName, Logger logger)
     
    boolean
    userTransactionMethodsAllowed(org.glassfish.api.invocation.ComponentInvocation inv)
     
    protected int
    validateValue(int value, int lowLimit, int highLimit, int deft, String emsg, String appName, Logger logger)
     

    Methods inherited from class com.sun.ejb.containers.BaseContainer

    _constructEJBInstance, addInvocationInfo, addProxyInterfacesSetClass, adjustHomeTargetMethodInfo, adjustInvocationInfo, assertValidLocalObject, assertValidRemoteObject, authorize, authorizeLocalGetPrimaryKey, authorizeLocalMethod, authorizeRemoteGetPrimaryKey, authorizeRemoteMethod, cancelTimers, checkExceptionClientTx, checkExists, checkUnfinishedTx, checkUserTransactionLookup, cleanupInstance, containerStateToString, createCallFlowAgent, createEjbInstanceAndContext, createEjbInstanceForInterceptors, createEjbInvocation, createEjbInvocation, createEJBLocalObjectImpl, createMonitoringRegistry, createRemoteReferenceWithId, delistExtendedEntityManagers, doAfterBegin, doEJBHomeRemove, doFlush, doTimerInvocationInit, enlistExtendedEntityManagers, externalPostInvoke, externalPreInvoke, findFlushEnabledAttr, getApplicationId, getClassLoader, getComponentId, getContainerClassLoader, getContainerId, getContainerInfo, getContext, getDebugMonitorFlag, getDescriptor, getEJBClass, getEjbDescriptor, getEJBHome, getEJBHomeInvocationHandler, getEJBHomeStub, getEJBLocalBusinessHome, getEJBLocalHome, getEJBLocalHomeInvocationHandler, getEJBLocalObjectForPrimaryKey, getEJBLocalObjectForPrimaryKey, getEJBLocalObjectImpl, getEJBMetaData, getEJBObjectForPrimaryKey, getInvocationKey, getJaccEjb, getJavaGlobalJndiNamePrefix, getMonitoringMethodsArray, getMonitoringMethodsArray, getPassByReference, getPre30LifecycleMethodNames, getProtocolManager, getSecurityManager, getTargetObject, getTimeoutMethod, getTxAttr, getTxAttr, getTxAttrForLifecycleCallback, getUserTransaction, getUseThreadPoolId, incrementCreatedTimedObject, incrementDeliveredTimedObject, incrementRemovedTimedObject, initializeProtocolManager, injectEjbInstance, instantiateEJBLocalBusinessObjectImpl, instantiateEJBLocalObjectImpl, instantiateEJBLocalObjectImpl, instantiateEJBObjectImpl, instantiateEJBObjectImpl, instantiateOptionalEJBLocalBusinessObjectImpl, instantiateRemoteBusinessObjectImpl, intercept, intercept, invokeBeanMethod, invokeFindByPrimaryKey, invokeTargetBeanMethod, isApplicationException, isEjbTimeoutMethod, isHAEnabled, isIdentical, isLocalInterfaceSupported, isLocalObject, isRemoteInterfaceSupported, isRemoteObject, isStopped, isSystemUncheckedException, isTimedObject, isUndeployed, lookupExtendedEntityManager, onEnteringContainer, onLeavingContainer, onReady, onShutdown, onTermination, postCreate, postEjbTimeout, postFind, postInvoke, postInvokeNoTx, postInvokeTx, postProcessInvocationInfo, preInitialize, preInvokeNoTx, preInvokeTx, prepareEjbTimeoutParams, preSelect, registerMonitorableComponents, registerSystemInterceptor, registerTimerMonitorableComponent, releaseTargetObject, removeBeanUnchecked, removeBeanUnchecked, resumeTransaction, setDebugMonitorFlag, setEJBMetaData, setStartedState, setStoppedState, setUndeployedState, suspendTransaction, toString, undeploy, useClientTx, validateEMForClientTx, validateTxAttr, webServicePostInvoke

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Method Details

    • startApplication

      public void startApplication(boolean deploy)
      Called when the application containing this message-bean has successfully gotten through the initial load phase of each module. Now we can "turn on the spigot" and allow incoming requests, which could result in the creation of message-bean instances.
      Specified by:
      startApplication in interface com.sun.ejb.Container
      Overrides:
      startApplication in class com.sun.ejb.containers.BaseContainer
      Parameters:
      deploy - true if this method is called during application deploy
    • registerMonitorableComponents

      protected void registerMonitorableComponents(Method[] msgListenerMethods)
    • getMonitoringStatsProvider

      protected com.sun.ejb.monitoring.stats.EjbMonitoringStatsProvider getMonitoringStatsProvider(String appName, String modName, String ejbName)
      Specified by:
      getMonitoringStatsProvider in class com.sun.ejb.containers.BaseContainer
    • scanForEjbCreateMethod

      public boolean scanForEjbCreateMethod()
      Overrides:
      scanForEjbCreateMethod in class com.sun.ejb.containers.BaseContainer
    • initializeHome

      protected void initializeHome() throws Exception
      Overrides:
      initializeHome in class com.sun.ejb.containers.BaseContainer
      Throws:
      Exception
    • addLocalRemoteInvocationInfo

      protected void addLocalRemoteInvocationInfo() throws Exception
      Overrides:
      addLocalRemoteInvocationInfo in class com.sun.ejb.containers.BaseContainer
      Throws:
      Exception
    • isCreateHomeFinder

      protected boolean isCreateHomeFinder(Method method)
      Overrides:
      isCreateHomeFinder in class com.sun.ejb.containers.BaseContainer
    • stringToInt

      protected static int stringToInt(String val, String appName, Logger logger)
    • validateValue

      protected int validateValue(int value, int lowLimit, int highLimit, int deft, String emsg, String appName, Logger logger)
    • getMonitorAttributeValues

      public String getMonitorAttributeValues()
    • userTransactionMethodsAllowed

      public boolean userTransactionMethodsAllowed(org.glassfish.api.invocation.ComponentInvocation inv)
      Specified by:
      userTransactionMethodsAllowed in interface com.sun.ejb.Container
      Overrides:
      userTransactionMethodsAllowed in class com.sun.ejb.containers.BaseContainer
    • setEJBHome

      public void setEJBHome(jakarta.ejb.EJBHome ejbHome) throws Exception
      Throws:
      Exception
    • getEJBObjectImpl

      public com.sun.ejb.containers.EJBObjectImpl getEJBObjectImpl(byte[] instanceKey)
      Specified by:
      getEJBObjectImpl in class com.sun.ejb.containers.BaseContainer
    • createEJBObjectImpl

      public com.sun.ejb.containers.EJBObjectImpl createEJBObjectImpl() throws jakarta.ejb.CreateException
      Specified by:
      createEJBObjectImpl in class com.sun.ejb.containers.BaseContainer
      Throws:
      jakarta.ejb.CreateException
    • removeBean

      protected void removeBean(com.sun.ejb.containers.EJBLocalRemoteObject ejbo, Method removeMethod, boolean local) throws jakarta.ejb.RemoveException, jakarta.ejb.EJBException
      Specified by:
      removeBean in class com.sun.ejb.containers.BaseContainer
      Throws:
      jakarta.ejb.RemoveException
      jakarta.ejb.EJBException
    • callEJBTimeout

      protected boolean callEJBTimeout(com.sun.ejb.containers.RuntimeTimerState timerState, com.sun.ejb.containers.EJBTimerService timerService) throws Exception
      Override callEJBTimeout from BaseContainer since delivery to message driven beans is a bit different from session/entity.
      Overrides:
      callEJBTimeout in class com.sun.ejb.containers.BaseContainer
      Throws:
      Exception
    • forceDestroyBean

      protected void forceDestroyBean(com.sun.ejb.containers.EJBContextImpl ejbContext)
      Force destroy the EJB. Called from postInvokeTx. Note: EJB2.0 section 18.3.1 says that discarding an EJB means that no methods other than finalize() should be invoked on it.
      Specified by:
      forceDestroyBean in class com.sun.ejb.containers.BaseContainer
    • preInvoke

      public void preInvoke(com.sun.ejb.EjbInvocation inv)
      Specified by:
      preInvoke in interface com.sun.ejb.Container
      Overrides:
      preInvoke in class com.sun.ejb.containers.BaseContainer
    • _getContext

      protected com.sun.ejb.ComponentContext _getContext(com.sun.ejb.EjbInvocation inv)
      Specified by:
      _getContext in class com.sun.ejb.containers.BaseContainer
    • releaseContext

      public void releaseContext(com.sun.ejb.EjbInvocation inv)
      Return instance to a pooled state.
      Specified by:
      releaseContext in class com.sun.ejb.containers.BaseContainer
    • postInvoke

      public void postInvoke(com.sun.ejb.EjbInvocation inv)
      Specified by:
      postInvoke in interface com.sun.ejb.Container
      Overrides:
      postInvoke in class com.sun.ejb.containers.BaseContainer
    • createMessageBeanListener

      public org.glassfish.ejb.api.MessageBeanListener createMessageBeanListener(com.sun.appserv.connectors.internal.api.ResourceHandle resource) throws org.glassfish.ejb.api.ResourcesExceededException
      The following are implementation for methods required by the * MessageBeanProtocalManager interface. *
      Specified by:
      createMessageBeanListener in interface org.glassfish.ejb.api.MessageBeanProtocolManager
      Throws:
      org.glassfish.ejb.api.ResourcesExceededException
    • destroyMessageBeanListener

      public void destroyMessageBeanListener(org.glassfish.ejb.api.MessageBeanListener listener)
      Specified by:
      destroyMessageBeanListener in interface org.glassfish.ejb.api.MessageBeanProtocolManager
    • isDeliveryTransacted

      public boolean isDeliveryTransacted(Method method)
      Specified by:
      isDeliveryTransacted in interface org.glassfish.ejb.api.MessageBeanProtocolManager
      Parameters:
      method - One of the methods used to deliver messages, e.g. onMessage method for jakarta.jms.MessageListener. Note that if the method is not one of the methods for message delivery, the behavior of this method is not defined.
    • getPoolDescriptor

      public com.sun.enterprise.deployment.runtime.BeanPoolDescriptor getPoolDescriptor()
      Specified by:
      getPoolDescriptor in interface org.glassfish.ejb.api.MessageBeanProtocolManager
    • createMessageBeanProxy

      public Object createMessageBeanProxy(InvocationHandler handler) throws Exception
      Generates the appropriate Proxy based on the message listener type.
      Specified by:
      createMessageBeanProxy in interface org.glassfish.ejb.api.MessageBeanProtocolManager
      Parameters:
      handler - InvocationHandler responsible for calls on the proxy
      Returns:
      an object implementing MessageEndpoint and the appropriate MDB view
      Throws:
      Exception
    • _constructEJBContextImpl

      protected com.sun.ejb.containers.EJBContextImpl _constructEJBContextImpl(Object instance)
      Overrides:
      _constructEJBContextImpl in class com.sun.ejb.containers.BaseContainer
    • afterBegin

      protected void afterBegin(com.sun.ejb.containers.EJBContextImpl context)
      Specified by:
      afterBegin in class com.sun.ejb.containers.BaseContainer
    • beforeCompletion

      protected void beforeCompletion(com.sun.ejb.containers.EJBContextImpl context)
      Specified by:
      beforeCompletion in class com.sun.ejb.containers.BaseContainer
    • afterCompletion

      protected void afterCompletion(com.sun.ejb.containers.EJBContextImpl ctx, int status)
      Specified by:
      afterCompletion in class com.sun.ejb.containers.BaseContainer
    • passivateEJB

      public boolean passivateEJB(com.sun.ejb.ComponentContext context)
      Specified by:
      passivateEJB in class com.sun.ejb.containers.BaseContainer
    • activateEJB

      public void activateEJB(Object ctx, Object instanceKey)
    • doConcreteContainerShutdown

      protected void doConcreteContainerShutdown(boolean appBeingUndeployed)
      Called by BaseContainer during container shutdown sequence
      Specified by:
      doConcreteContainerShutdown in class com.sun.ejb.containers.BaseContainer
    • beforeMessageDelivery

      public void beforeMessageDelivery(Method method, MessageBeanContainer.MessageDeliveryType deliveryType, boolean txImported, com.sun.appserv.connectors.internal.api.ResourceHandle resourceHandle)
      Actual message delivery happens in three steps : 1) beforeMessageDelivery(Message, MessageListener) This is our chance to make the message delivery itself part of the instance's global transaction. 2) onMessage(Message, MessageListener) This is where the container delegates to the actual ejb instance's onMessage method. 3) afterMessageDelivery(Message, MessageListener) Perform transaction cleanup and error handling. We use the EjbInvocation manager's thread-specific state to track the invocation across these three calls.
    • deliverMessage

      public Object deliverMessage(Object[] params) throws Throwable
      Throws:
      Throwable
    • afterMessageDelivery

      public void afterMessageDelivery(com.sun.appserv.connectors.internal.api.ResourceHandle resourceHandle)