DefaultMessageListenerContainer
is implemented as a JMS poller. While the Spring container is shutting itself down, as each
in-progress JMS Consumer.receive()
call completes, any non-null
return value will be a JMS message that the DMLC will
discard due to the shutdown in progress. That will result in the received message never being processed.
To prevent message loss during restart operations, set acceptMessagesWhileStopping
to true
so that such messages will be
processed before shut down.
Noncompliant code example
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <!-- Noncompliant -->
<property name="connectionFactory" ref="connFactory" />
<property name="destination" ref="dest" />
<property name="messageListener" ref="serviceAdapter" />
<property name="autoStartup" value="true" />
<property name="concurrentConsumers" value="10" />
<property name="maxConcurrentConsumers" value="10" />
<property name="clientId" value="myClientID" />
</bean>
Compliant solution
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connFactory" />
<property name="destination" ref="dest" />
<property name="messageListener" ref="serviceAdapter" />
<property name="autoStartup" value="true" />
<property name="concurrentConsumers" value="10" />
<property name="maxConcurrentConsumers" value="10" />
<property name="clientId" value="myClientID" />
<property name="acceptMessagesWhileStopping" value="true" />
</bean>