Package org.springframework.ejb.access
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 Object
doInvoke(MethodInvocation invocation)
Perform the given invocation on the current EJB home.protected Method
getCreateMethod(Object home)
Check for EJB3-style home object that serves as EJB component directly.Object
invokeInContext(MethodInvocation invocation)
Fetches an EJB home object and delegates todoInvoke
.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
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
setRefreshHomeOnConnectFailure(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, lookup, 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
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:AbstractSlsbInvokerInterceptor
Return whether the cached EJB home object is potentially subject to on-demand refreshing. Default is "false".- Overrides:
isHomeRefreshable
in classAbstractSlsbInvokerInterceptor
getCreateMethod
protected Method getCreateMethod(Object home) throws EjbAccessException
Check for EJB3-style home object that serves as EJB component directly.- Overrides:
getCreateMethod
in classAbstractSlsbInvokerInterceptor
- Parameters:
home
- the EJB home object- Returns:
- the create method
- Throws:
EjbAccessException
- if the method couldn't be retrieved
invokeInContext
@Nullable 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:
invokeInContext
in 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
@Nullable 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
@Nullable 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(@Nullable 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()