org.springframework.ejb.access
Class AbstractRemoteSlsbInvokerInterceptor

java.lang.Object
  extended by org.springframework.jndi.JndiAccessor
      extended by org.springframework.jndi.JndiLocatorSupport
          extended by org.springframework.jndi.JndiObjectLocator
              extended by org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
                  extended by org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor
All Implemented Interfaces:
Advice, Interceptor, MethodInterceptor, InitializingBean
Direct Known Subclasses:
SimpleRemoteSlsbInvokerInterceptor

public abstract class AbstractRemoteSlsbInvokerInterceptor
extends AbstractSlsbInvokerInterceptor

Superclass for interceptors proxying remote Stateless Session Beans.

Such an interceptor must be the last interceptor in the advice chain. In this case, there is no target object.

Author:
Rod Johnson, Juergen Hoeller

Field Summary
 
Fields inherited from class org.springframework.jndi.JndiLocatorSupport
CONTAINER_PREFIX
 
Fields inherited from class org.springframework.jndi.JndiAccessor
logger
 
Constructor Summary
AbstractRemoteSlsbInvokerInterceptor()
           
 
Method Summary
protected abstract  Object doInvoke(MethodInvocation invocation)
          Perform the given invocation on the current EJB home.
 Object invoke(MethodInvocation invocation)
          Fetches an EJB home object and delegates to doInvoke.
protected  boolean isConnectFailure(RemoteException ex)
          Determine whether the given RMI exception indicates a connect failure.
protected  boolean isHomeRefreshable()
          Return whether the cached EJB home object is potentially subject to on-demand refreshing.
protected  Object lookup()
          This overridden lookup implementation performs a narrow operation after the JNDI lookup, provided that a home interface is specified.
protected  EJBObject newSessionBeanInstance()
          Return a new instance of the stateless session bean.
protected  Object refreshAndRetry(MethodInvocation invocation)
          Refresh the EJB home object and retry the given invocation.
protected  void removeSessionBeanInstance(EJBObject ejb)
          Remove the given EJB instance.
 void setHomeInterface(Class homeInterface)
          Set a home interface that this invoker will narrow to before performing the parameterless SLSB create() call that returns the actual SLSB proxy.
 void setRefreshHomeOnConnectFailure(boolean refreshHomeOnConnectFailure)
          Set whether to refresh the EJB home on connect failure.
 
Methods inherited from class org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
afterPropertiesSet, create, getCreateMethod, getHome, refreshHome, setCacheHome, setLookupHomeOnStartup
 
Methods inherited from class org.springframework.jndi.JndiObjectLocator
getExpectedType, getJndiName, setExpectedType, setJndiName
 
Methods inherited from class org.springframework.jndi.JndiLocatorSupport
convertJndiName, isResourceRef, lookup, lookup, setResourceRef
 
Methods inherited from class org.springframework.jndi.JndiAccessor
getJndiEnvironment, getJndiTemplate, setJndiEnvironment, setJndiTemplate
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AbstractRemoteSlsbInvokerInterceptor

public AbstractRemoteSlsbInvokerInterceptor()
Method Detail

setHomeInterface

public void setHomeInterface(Class homeInterface)
Set a home interface that this invoker will narrow to before performing the parameterless SLSB create() call that returns the actual SLSB proxy.

Default is none, which will work on all J2EE servers that are not based on CORBA. A plain javax.ejb.EJBHome interface is known to be sufficient to make a WebSphere 5.0 Remote SLSB work. On other servers, the specific home interface for the target SLSB might be necessary.


setRefreshHomeOnConnectFailure

public void setRefreshHomeOnConnectFailure(boolean refreshHomeOnConnectFailure)
Set whether to refresh the EJB home on connect failure. Default is "false".

Can be turned on to allow for hot restart of the EJB server. If a cached EJB home throws an RMI exception that indicates a remote connect failure, a fresh home will be fetched and the invocation will be retried.

See Also:
ConnectException, ConnectIOException, NoSuchObjectException

isHomeRefreshable

protected boolean isHomeRefreshable()
Description copied from class: AbstractSlsbInvokerInterceptor
Return whether the cached EJB home object is potentially subject to on-demand refreshing. Default is "false".

Overrides:
isHomeRefreshable in class AbstractSlsbInvokerInterceptor

lookup

protected Object lookup()
                 throws NamingException
This overridden lookup implementation performs a narrow operation after the JNDI lookup, provided that a home interface is specified.

Overrides:
lookup in class JndiObjectLocator
Returns:
the located target object
Throws:
NamingException - if the JNDI lookup failed or if the located JNDI object is not assigable to the expected type
See Also:
setHomeInterface(java.lang.Class), PortableRemoteObject.narrow(java.lang.Object, java.lang.Class)

invoke

public Object invoke(MethodInvocation invocation)
              throws Throwable
Fetches an EJB home object and delegates to doInvoke. If configured to refresh on connect failure, it will call refreshAndRetry on corresponding RMI exceptions.

Throws:
Throwable
See Also:
AbstractSlsbInvokerInterceptor.getHome(), doInvoke(org.aopalliance.intercept.MethodInvocation), refreshAndRetry(org.aopalliance.intercept.MethodInvocation), ConnectException, ConnectIOException, NoSuchObjectException

isConnectFailure

protected boolean isConnectFailure(RemoteException ex)
Determine whether the given RMI exception indicates a connect failure. Default implementation delegates to RmiClientInterceptorUtils.

Parameters:
ex - the RMI exception to check
Returns:
whether the exception should be treated as connect failure
See Also:
RmiClientInterceptorUtils.isConnectFailure(java.rmi.RemoteException)

refreshAndRetry

protected Object refreshAndRetry(MethodInvocation invocation)
                          throws Throwable
Refresh the EJB home object and retry the given invocation. Called by invoke on connect failure.

Parameters:
invocation - the AOP method invocation
Returns:
the invocation result, if any
Throws:
Throwable - in case of invocation failure
See Also:
invoke(org.aopalliance.intercept.MethodInvocation)

doInvoke

protected abstract Object doInvoke(MethodInvocation invocation)
                            throws Throwable
Perform the given invocation on the current EJB home. Template method to be implemented by a subclass.

Parameters:
invocation - the AOP method invocation
Returns:
the invocation result, if any
Throws:
Throwable - in case of invocation failure
See Also:
AbstractSlsbInvokerInterceptor.getHome(), newSessionBeanInstance()

newSessionBeanInstance

protected EJBObject newSessionBeanInstance()
                                    throws NamingException,
                                           InvocationTargetException
Return a new instance of the stateless session bean. To be invoked by concrete remote SLSB invoker subclasses.

Can be overridden to change the algorithm.

Throws:
NamingException - if thrown by JNDI
InvocationTargetException - if thrown by the create method
See Also:
AbstractSlsbInvokerInterceptor.create()

removeSessionBeanInstance

protected void removeSessionBeanInstance(EJBObject ejb)
Remove the given EJB instance. To be invoked by concrete remote SLSB invoker subclasses.

Parameters:
ejb - the EJB instance to remove
See Also:
EJBObject.remove()


Copyright (c) 2002-2007 The Spring Framework Project.