Class AbstractRemoteSlsbInvokerInterceptor
- java.lang.Object
- org.springframework.jndi.JndiAccessor
- org.springframework.jndi.JndiLocatorSupport
- org.springframework.jndi.JndiObjectLocator
- org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
- org.springframework.ejb.access.AbstractRemoteSlsbInvokerInterceptor
- All Implemented Interfaces:
Advice,Interceptor,MethodInterceptor,InitializingBean
- Direct Known Subclasses:
SimpleRemoteSlsbInvokerInterceptor
public abstract class AbstractRemoteSlsbInvokerInterceptor extends AbstractSlsbInvokerInterceptor
Base class for interceptors proxying remote Stateless Session Beans. Designed for EJB 2.x, but works for EJB 3 Session Beans as well.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
Constructors Constructor Description AbstractRemoteSlsbInvokerInterceptor()
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected abstract ObjectdoInvoke(MethodInvocation invocation)Perform the given invocation on the current EJB home.protected MethodgetCreateMethod(Object home)Check for EJB3-style home object that serves as EJB component directly.ObjectinvokeInContext(MethodInvocation invocation)Fetches an EJB home object and delegates todoInvoke.protected booleanisConnectFailure(RemoteException ex)Determine whether the given RMI exception indicates a connect failure.protected booleanisHomeRefreshable()Return whether the cached EJB home object is potentially subject to on-demand refreshing.protected Objectlookup()This overridden lookup implementation performs a narrow operation after the JNDI lookup, provided that a home interface is specified.protected ObjectnewSessionBeanInstance()Return a new instance of the stateless session bean.protected ObjectrefreshAndRetry(MethodInvocation invocation)Refresh the EJB home object and retry the given invocation.protected voidremoveSessionBeanInstance(EJBObject ejb)Remove the given EJB instance.voidsetHomeInterface(Class<?> homeInterface)Set a home interface that this invoker will narrow to before performing the parameterless SLSBcreate()call that returns the actual SLSB proxy.voidsetRefreshHomeOnConnectFailure(boolean refreshHomeOnConnectFailure)Set whether to refresh the EJB home on connect failure.Methods inherited from class org.springframework.ejb.access.AbstractSlsbInvokerInterceptor
afterPropertiesSet, create, getHome, invoke, refreshHome, setCacheHome, setExposeAccessContext, 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
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 SLSBcreate()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.EJBHomeinterface 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.
isHomeRefreshable
protected boolean isHomeRefreshable()
Description copied from class:AbstractSlsbInvokerInterceptorReturn whether the cached EJB home object is potentially subject to on-demand refreshing. Default is "false".- Overrides:
isHomeRefreshablein classAbstractSlsbInvokerInterceptor
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:
lookupin classJndiObjectLocator- 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<?>),javax.rmi.PortableRemoteObject#narrow
getCreateMethod
protected Method getCreateMethod(Object home) throws EjbAccessException
Check for EJB3-style home object that serves as EJB component directly.- Overrides:
getCreateMethodin classAbstractSlsbInvokerInterceptor- Parameters:
home- the EJB home object- Returns:
- the create method
- Throws:
EjbAccessException- if the method couldn't be retrieved
invokeInContext
public Object invokeInContext(MethodInvocation invocation) throws Throwable
Fetches an EJB home object and delegates todoInvoke.If configured to refresh on connect failure, it will call
refreshAndRetry(org.aopalliance.intercept.MethodInvocation)on corresponding RMI exceptions.- Specified by:
invokeInContextin classAbstractSlsbInvokerInterceptor- Parameters:
invocation- the AOP method invocation- Returns:
- the invocation result, if any
- Throws:
Throwable- in case of invocation failure- See Also:
AbstractSlsbInvokerInterceptor.getHome(),doInvoke(org.aopalliance.intercept.MethodInvocation),refreshAndRetry(org.aopalliance.intercept.MethodInvocation)
isConnectFailure
protected boolean isConnectFailure(RemoteException ex)
Determine whether the given RMI exception indicates a connect failure.The 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:
AbstractSlsbInvokerInterceptor.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 subclasses.- 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 Object 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 JNDIInvocationTargetException- 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()