@ -77,7 +80,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -77,7 +80,7 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -85,7 +88,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -85,7 +88,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -199,9 +204,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -199,9 +204,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
*/
publicvoidinitialize()throwsJmsException{
try{
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
this.active=true;
this.lifecycleMonitor.notifyAll();
this.lifecycleCondition.signalAll();
}
finally{
this.lifecycleLock.unlock();
}
doInitialize();
}
@ -218,13 +227,18 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -218,13 +227,18 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
*/
publicvoidshutdown()throwsJmsException{
logger.debug("Shutting down JMS listener container");
booleanwasRunning;
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
wasRunning=this.running;
this.running=false;
this.active=false;
this.pausedTasks.clear();
this.lifecycleMonitor.notifyAll();
this.lifecycleCondition.signalAll();
}
finally{
this.lifecycleLock.unlock();
}
// Stop shared Connection early, if necessary.
@ -256,9 +270,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -256,9 +270,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
*thatis,whetherithasbeensetupbutnotshutdownyet.
*/
publicfinalbooleanisActive(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.active;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -288,11 +306,15 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -288,11 +306,15 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
}
// Reschedule paused tasks, if any.
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
this.running=true;
this.lifecycleMonitor.notifyAll();
this.lifecycleCondition.signalAll();
resumePausedTasks();
}
finally{
this.lifecycleLock.unlock();
}
// Start the shared Connection, if any.
if(sharedConnectionEnabled()){
@ -321,9 +343,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -321,9 +343,13 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
*@see#stopSharedConnection
*/
protectedvoiddoStop()throwsJMSException{
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
this.running=false;
this.lifecycleMonitor.notifyAll();
this.lifecycleCondition.signalAll();
}
finally{
this.lifecycleLock.unlock();
}
if(sharedConnectionEnabled()){
@ -370,12 +396,16 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -370,12 +396,16 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -385,13 +415,17 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -385,13 +415,17 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -435,7 +469,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -435,7 +469,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -446,6 +481,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -446,6 +481,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
}
}
}
finally{
this.sharedConnectionLock.unlock();
}
}
/**
@ -454,7 +492,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -454,7 +492,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -465,6 +504,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -465,6 +504,9 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
}
}
}
finally{
this.sharedConnectionLock.unlock();
}
}
/**
@ -473,11 +515,15 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -473,11 +515,15 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -493,13 +539,17 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -493,13 +539,17 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
thrownewIllegalStateException(
"This listener container does not maintain a shared Connection");
}
synchronized(this.sharedConnectionMonitor){
this.sharedConnectionLock.lock();
try{
if(this.sharedConnection==null){
thrownewSharedConnectionNotInitializedException(
"This listener container's shared Connection has not been initialized yet");
}
returnthis.sharedConnection;
}
finally{
this.sharedConnectionLock.unlock();
}
}
@ -543,7 +593,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -543,7 +593,8 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -561,15 +612,22 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@@ -561,15 +612,22 @@ public abstract class AbstractJmsListeningContainer extends JmsDestinationAccess
@ -190,6 +193,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -190,6 +193,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -221,7 +226,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -221,7 +226,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
privateObjectcurrentRecoveryMarker=newObject();
privatefinalObjectrecoveryMonitor=newObject();
privatefinalLockrecoveryLock=newReentrantLock();
/**
@ -241,6 +246,25 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -241,6 +246,25 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -364,12 +388,16 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -364,12 +388,16 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -380,9 +408,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -380,9 +408,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*@see#getActiveConsumerCount()
*/
publicfinalintgetConcurrentConsumers(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.concurrentConsumers;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -404,9 +436,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -404,9 +436,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -417,9 +453,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -417,9 +453,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*@see#getActiveConsumerCount()
*/
publicfinalintgetMaxConcurrentConsumers(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.maxConcurrentConsumers;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -446,18 +486,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -446,18 +486,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -472,18 +520,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -472,18 +520,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
Assert.isTrue(idleConsumerLimit>0,"'idleConsumerLimit' must be 1 or higher");
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
this.idleConsumerLimit=idleConsumerLimit;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
*Returnthelimitforthenumberofidleconsumers.
*/
publicfinalintgetIdleConsumerLimit(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.idleConsumerLimit;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -515,18 +571,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -515,18 +571,26 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -556,9 +620,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -556,9 +620,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -567,9 +635,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -567,9 +635,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*@since5.3.5
*/
publicintgetIdleReceivesPerTaskLimit(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.idleReceivesPerTaskLimit;
}
finally{
this.lifecycleLock.unlock();
}
}
@ -585,7 +657,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -585,7 +657,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
// Prepare taskExecutor and maxMessagesPerTask.
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
if(this.taskExecutor==null){
this.taskExecutor=createDefaultTaskExecutor();
}
@ -598,6 +671,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -598,6 +671,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
this.maxMessagesPerTask=10;
}
}
finally{
this.lifecycleLock.unlock();
}
// Proceed with actual listener initialization.
super.initialize();
@ -612,11 +688,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -612,11 +688,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*/
@Override
protectedvoiddoInitialize()throwsJMSException{
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
for(inti=0;i<this.concurrentConsumers;i++){
scheduleNewInvoker();
}
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -625,44 +705,46 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -625,44 +705,46 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@Override
protectedvoiddoShutdown()throwsJMSException{
logger.debug("Waiting for shutdown of message listener invokers");
// Re-interrupt current thread, to allow other threads to react.
Thread.currentThread().interrupt();
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -670,9 +752,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -670,9 +752,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*/
@Override
publicvoidstart()throwsJmsException{
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
this.stopCallback=null;
}
finally{
this.lifecycleLock.unlock();
}
super.start();
}
@ -691,7 +777,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -691,7 +777,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
// Not started, already stopped, or previous stop attempt in progress
// -> return immediately, no stop process to control anymore.
@ -700,6 +787,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -700,6 +787,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
this.stopCallback=callback;
}
finally{
this.lifecycleLock.unlock();
}
stop();
}
@ -713,9 +803,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -713,9 +803,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*@see#getActiveConsumerCount()
*/
publicfinalintgetScheduledConsumerCount(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.scheduledInvokers.size();
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -728,9 +822,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -728,9 +822,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
*@see#getActiveConsumerCount()
*/
publicfinalintgetActiveConsumerCount(){
synchronized(this.lifecycleMonitor){
this.lifecycleLock.lock();
try{
returnthis.activeInvokerCount;
}
finally{
this.lifecycleLock.unlock();
}
}
/**
@ -749,9 +847,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -749,9 +847,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -760,11 +862,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -760,11 +862,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -831,7 +937,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -831,7 +937,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -840,6 +947,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -840,6 +947,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
}
}
finally{
this.lifecycleLock.unlock();
}
}
}
@ -1072,10 +1182,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1072,10 +1182,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
// Re-interrupt current thread, to allow other threads to react.
@ -1084,6 +1193,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1084,6 +1193,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
this.interrupted=true;
}
}
finally{
this.lifecycleLock.unlock();
}
returntrue;
}
}
@ -1129,9 +1241,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1129,9 +1241,13 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@Override
publicvoidrun(){
synchronized(lifecycleMonitor){
lifecycleLock.lock();
try{
activeInvokerCount++;
lifecycleMonitor.notifyAll();
lifecycleCondition.signalAll();
}
finally{
lifecycleLock.unlock();
}
booleanmessageReceived=false;
try{
@ -1161,7 +1277,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1161,7 +1277,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -1171,14 +1288,21 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1171,14 +1288,21 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
alreadyRecovered=true;
}
}
finally{
recoveryLock.unlock();
}
if(alreadyRecovered){
handleListenerSetupFailure(ex,true);
}
}
finally{
synchronized(lifecycleMonitor){
lifecycleLock.lock();
try{
decreaseActiveInvokerCount();
lifecycleMonitor.notifyAll();
lifecycleCondition.signalAll();
}
finally{
lifecycleLock.unlock();
}
if(!messageReceived){
this.idleTaskExecutionCount++;
@ -1186,14 +1310,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1186,14 +1310,15 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -1209,6 +1334,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1209,6 +1334,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
}
}
finally{
lifecycleLock.unlock();
}
}
}
@ -1216,7 +1344,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1216,7 +1344,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
booleanmessageReceived=false;
booleanactive=true;
while(active){
synchronized(lifecycleMonitor){
lifecycleLock.lock();
try{
booleaninterrupted=false;
booleanwasWaiting=false;
while((active=isActive())&&!isRunning()){
@ -1229,7 +1358,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1229,7 +1358,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
}
wasWaiting=true;
try{
lifecycleMonitor.wait();
lifecycleCondition.await();
}
catch(InterruptedExceptionex){
// Re-interrupt current thread, to allow other threads to react.
@ -1244,6 +1373,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1244,6 +1373,9 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -1289,17 +1421,25 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1289,17 +1421,25 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -1311,19 +1451,27 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@@ -1311,19 +1451,27 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
@ -80,7 +82,7 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -80,7 +82,7 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@Nullable
privateSet<MessageConsumer>consumers;
privatefinalObjectconsumersMonitor=newObject();
privatefinalLockconsumersLock=newReentrantLock();
/**
@ -261,10 +263,14 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -261,10 +263,14 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
logger.debug("Trying to recover from JMS Connection exception: "+ex);
@ -282,7 +288,8 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -282,7 +288,8 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@ -295,6 +302,9 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -295,6 +302,9 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
}
}
}
finally{
this.consumersLock.unlock();
}
}
/**
@ -355,7 +365,8 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -355,7 +365,8 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
*/
@Override
protectedvoiddoShutdown()throwsJMSException{
synchronized(this.consumersMonitor){
this.consumersLock.lock();
try{
if(this.consumers!=null){
logger.debug("Closing JMS MessageConsumers");
for(MessageConsumerconsumer:this.consumers){
@ -369,6 +380,9 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
@@ -369,6 +380,9 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta