Class AbstractJmsListeningContainer
- All Implemented Interfaces:
Aware
,BeanNameAware
,DisposableBean
,InitializingBean
,Lifecycle
,Phased
,SmartLifecycle
- Direct Known Subclasses:
AbstractMessageListenerContainer
JmsAccessor
base class.
This class provides basic lifecycle management, in particular management
of a shared JMS Connection. Subclasses are supposed to plug into this
lifecycle, implementing the sharedConnectionEnabled()
as well
as the doInitialize()
and doShutdown()
template methods.
This base class does not assume any specific listener programming model or listener invoker mechanism. It just provides the general runtime lifecycle management needed for any kind of JMS-based listening mechanism that operates on a JMS Connection/Session.
For a concrete listener programming model, check out the
AbstractMessageListenerContainer
subclass. For a concrete listener
invoker mechanism, check out the DefaultMessageListenerContainer
class.
- Since:
- 2.0.3
- Author:
- Juergen Hoeller
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
Exception that indicates that the initial setup of this container's shared JMS Connection failed. -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final Condition
protected final Lock
protected final Lock
Fields inherited from class org.springframework.jms.support.destination.JmsDestinationAccessor
RECEIVE_TIMEOUT_INDEFINITE_WAIT, RECEIVE_TIMEOUT_NO_WAIT
Fields inherited from class org.springframework.jms.support.JmsAccessor
logger
Fields inherited from interface org.springframework.context.SmartLifecycle
DEFAULT_PHASE
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
Delegates tovalidateConfiguration()
andinitialize()
.protected Connection
Create a shared Connection for this container.void
destroy()
Callsshutdown()
when the BeanFactory destroys the container instance.protected abstract void
Register any invokers within this container.protected void
doRescheduleTask
(Object task) Reschedule the given task object immediately.protected abstract void
Close the registered invokers.protected void
doStart()
Start the shared Connection, if any, and notify all invoker tasks.protected void
doStop()
Notify all invoker tasks and stop the shared Connection, if any.protected void
Establish a shared Connection for this container.protected final String
Return the bean name that this listener container has been assigned in its containing bean factory, if any.Return the JMS client ID for the shared Connection created and used by this container, if any.int
Determine the number of currently paused tasks, if any.int
getPhase()
Return the lifecycle phase in which this container will be started and stopped.protected final Connection
Return the shared JMS Connection maintained by this container.void
Initialize this container.final boolean
isActive()
Return whether this container is currently active, that is, whether it has been set up but not shut down yet.boolean
Returnstrue
if thisLifecycle
component should get started automatically by the container at the time that the containingApplicationContext
gets refreshed.final boolean
Determine whether this container is currently running, that is, whether it has been started and not stopped yet.protected void
logRejectedTask
(Object task, RuntimeException ex) Log a task that has been rejected bydoRescheduleTask(java.lang.Object)
.protected void
prepareSharedConnection
(Connection connection) Prepare the given Connection, which is about to be registered as shared Connection for this container.protected final void
Refresh the shared Connection that this container holds.protected final void
Release the shared Connection, if any.protected final boolean
Take the given task object and reschedule it, either immediately if this container is currently running, or later once this container has been restarted.protected void
Try to resume all paused tasks.protected boolean
Check whether this container's listeners are generally allowed to run.void
setAutoStartup
(boolean autoStartup) Set whether to automatically start the container after initialization.void
setBeanName
(String beanName) Set the name of the bean in the bean factory that created this bean.void
setClientId
(String clientId) Specify the JMS client ID for a shared Connection created and used by this container.void
setPhase
(int phase) Specify the lifecycle phase in which this container should be started and stopped.protected abstract boolean
Return whether a shared JMS Connection should be maintained by this container base class.void
shutdown()
Stop the shared Connection, calldoShutdown()
, and close this container.void
start()
Start this container.protected void
Start the shared Connection.void
stop()
Stop this container.protected void
Stop the shared Connection.protected void
Validate the configuration of this container.Methods inherited from class org.springframework.jms.support.destination.JmsDestinationAccessor
getDestinationResolver, isPubSubDomain, receiveFromConsumer, resolveDestinationName, setDestinationResolver, setPubSubDomain
Methods inherited from class org.springframework.jms.support.JmsAccessor
convertJmsAccessException, createConnection, createSession, getConnectionFactory, getSessionAcknowledgeMode, isClientAcknowledge, isSessionTransacted, obtainConnectionFactory, setConnectionFactory, setSessionAcknowledgeMode, setSessionAcknowledgeModeName, setSessionTransacted
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.springframework.context.SmartLifecycle
stop
-
Field Details
-
lifecycleLock
-
lifecycleCondition
-
Constructor Details
-
AbstractJmsListeningContainer
public AbstractJmsListeningContainer()
-
-
Method Details
-
setClientId
Specify the JMS client ID for a shared Connection created and used by this container.Note that client IDs need to be unique among all active Connections of the underlying JMS provider. Furthermore, a client ID can only be assigned if the original ConnectionFactory hasn't already assigned one.
-
getClientId
Return the JMS client ID for the shared Connection created and used by this container, if any. -
setAutoStartup
public void setAutoStartup(boolean autoStartup) Set whether to automatically start the container after initialization.Default is "true"; set this to "false" to allow for manual startup through the
start()
method. -
isAutoStartup
public boolean isAutoStartup()Description copied from interface:SmartLifecycle
Returnstrue
if thisLifecycle
component should get started automatically by the container at the time that the containingApplicationContext
gets refreshed.A value of
false
indicates that the component is intended to be started through an explicitLifecycle.start()
call instead, analogous to a plainLifecycle
implementation.The default implementation returns
true
.- Specified by:
isAutoStartup
in interfaceSmartLifecycle
- See Also:
-
setPhase
public void setPhase(int phase) Specify the lifecycle phase in which this container should be started and stopped.The startup order proceeds from lowest to highest, and the shutdown order is the reverse of that. The default is
SmartLifecycle.DEFAULT_PHASE
meaning that this container starts as late as possible and stops as soon as possible.- See Also:
-
getPhase
public int getPhase()Return the lifecycle phase in which this container will be started and stopped.- Specified by:
getPhase
in interfacePhased
- Specified by:
getPhase
in interfaceSmartLifecycle
- See Also:
-
setBeanName
Description copied from interface:BeanNameAware
Set the name of the bean in the bean factory that created this bean.Invoked after population of normal bean properties but before an init callback such as
InitializingBean.afterPropertiesSet()
or a custom init-method.- Specified by:
setBeanName
in interfaceBeanNameAware
- Parameters:
beanName
- the name of the bean in the factory. Note that this name is the actual bean name used in the factory, which may differ from the originally specified name: in particular for inner bean names, the actual bean name might have been made unique through appending "#..." suffixes. Use theBeanFactoryUtils.originalBeanName(String)
method to extract the original bean name (without suffix), if desired.
-
getBeanName
Return the bean name that this listener container has been assigned in its containing bean factory, if any. -
afterPropertiesSet
public void afterPropertiesSet()Delegates tovalidateConfiguration()
andinitialize()
.- Specified by:
afterPropertiesSet
in interfaceInitializingBean
- Overrides:
afterPropertiesSet
in classJmsAccessor
-
validateConfiguration
protected void validateConfiguration()Validate the configuration of this container.The default implementation is empty. To be overridden in subclasses.
-
destroy
public void destroy()Callsshutdown()
when the BeanFactory destroys the container instance.- Specified by:
destroy
in interfaceDisposableBean
- See Also:
-
initialize
Initialize this container.Creates a JMS Connection, starts the
Connection
(if"autoStartup"
hasn't been turned off), and callsdoInitialize()
.- Throws:
JmsException
- if startup failed
-
shutdown
Stop the shared Connection, calldoShutdown()
, and close this container.- Throws:
JmsException
- if shutdown failed
-
isActive
public final boolean isActive()Return whether this container is currently active, that is, whether it has been set up but not shut down yet. -
start
Start this container.- Specified by:
start
in interfaceLifecycle
- Throws:
JmsException
- if starting failed- See Also:
-
doStart
Start the shared Connection, if any, and notify all invoker tasks.- Throws:
JMSException
- if thrown by JMS API methods- See Also:
-
stop
Stop this container.- Specified by:
stop
in interfaceLifecycle
- Throws:
JmsException
- if stopping failed- See Also:
-
doStop
Notify all invoker tasks and stop the shared Connection, if any.- Throws:
JMSException
- if thrown by JMS API methods- See Also:
-
isRunning
public final boolean isRunning()Determine whether this container is currently running, that is, whether it has been started and not stopped yet. -
runningAllowed
protected boolean runningAllowed()Check whether this container's listeners are generally allowed to run.This implementation always returns
true
; the default 'running' state is purely determined bystart()
/stop()
.Subclasses may override this method to check against temporary conditions that prevent listeners from actually running. In other words, they may apply further restrictions to the 'running' state, returning
false
if such a restriction prevents listeners from running. -
rescheduleTaskIfNecessary
Take the given task object and reschedule it, either immediately if this container is currently running, or later once this container has been restarted.If this container has already been shut down, the task will not get rescheduled at all.
- Parameters:
task
- the task object to reschedule- Returns:
- whether the task has been rescheduled (either immediately or for a restart of this container)
- See Also:
-
resumePausedTasks
protected void resumePausedTasks()Try to resume all paused tasks. Tasks for which rescheduling failed simply remain in paused mode. -
getPausedTaskCount
public int getPausedTaskCount()Determine the number of currently paused tasks, if any. -
doRescheduleTask
Reschedule the given task object immediately.To be implemented by subclasses if they ever call
rescheduleTaskIfNecessary
. This implementation throws an UnsupportedOperationException.- Parameters:
task
- the task object to reschedule- See Also:
-
logRejectedTask
Log a task that has been rejected bydoRescheduleTask(java.lang.Object)
.The default implementation simply logs a corresponding message at warn level.
- Parameters:
task
- the rejected task objectex
- the exception thrown fromdoRescheduleTask(java.lang.Object)
-
doInitialize
Register any invokers within this container.Subclasses need to implement this method for their specific invoker management process.
A shared JMS Connection, if any, will already have been started at this point.
- Throws:
JMSException
- if registration failed- See Also:
-
doShutdown
Close the registered invokers.Subclasses need to implement this method for their specific invoker management process.
A shared JMS Connection, if any, will automatically be closed afterwards.
- Throws:
JMSException
- if shutdown failed- See Also:
-