« Return to Thread: Is Spring able to destroy cleanly PooledSpringXAConnection(s) ?

Re: Is Spring able to destroy cleanly PooledSpringXAConnection(s) ?

by kdefombelle :: Rate this Message:

Reply to Author | View in Thread

I patched the PoledSpringXAConnection with this :
public void destroy() throws JMSException {
        LOGGER.warn("destroy... ");
        Iterator cacheIter = cache.entrySet().iterator();
        while(cacheIter.hasNext()) {
            Entry entry = (Entry) cacheIter.next();
            ((Connection) entry.getValue()).close();
        }
    }
and my Spring with the following :
<bean id="connectionFactory" class="org.jencks.pool.PooledSpringXAConnectionFactory" destroy-method="destroy">

And the hanging still occurs, so Jencks is not the cause of my hanging
Sorry for the suspision...

Karim

kdefombelle wrote:
I use jencks to do JMS resource enlistement in XA transactions in a Spring environnement.
I work on an external ActiveMQ broker.
I have hanging at the end of the program if i don't shutdown the broker(i do not want to..), and my theory is when Spring close the connection(s), it calls close on a PooledSpringXAConnection : that does nothing to keep alive the connection in the pool.
Is it possible that theses unclosed connections are responsible for my hanging ?
Is there a clean destroy method or a workaround I can use to cleanly destroy the jencks pool at the end of my program to avoid hanging (if this is the cause of my hanging..) or Spring does and i a searching in the wrong way ?

I do this at the end of my program :
        if(listenerContainer!=null) {
            listenerContainer.stop();
        }
        if(applicationContext!=null) {
            applicationContext.close();
        }

My Spring conf is the following :

<bean id="connectionFactory" class="org.jencks.pool.PooledSpringXAConnectionFactory">
        <property name="connectionFactory">
                <bean class="org.apache.activemq.spring.ActiveMQXAConnectionFactory">
                        <property name="brokerURL" value="${broker.url}/>
                        <property name="prefetchPolicy" ref="prefetchPolicy"/>
                </bean>
        </property>
        <property name="transactionManager" ref="myTransactionManager" />
</bean>

<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="concurrentConsumers" value="${concurrent.consumers}" />
        <property name="destinationName" value="${jms.destination}" />
        <property name="messageListener" ref="messageListener" />
        <property name="receiveTimeout" value="${receive.timeout.millis}" />
        <property name="autoStartup" value="false" />
        <property name="transactionManager" ref="jtaTransactionManager"/>
        <property name="connectionFactory" ref="connectionFactory" />  
</bean>

The log4j at the execution end gives me

main] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:601) - Closing application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27756227]
 [main] org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:241) - Publishing event in context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27756227]: org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext: display name [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=27756227]; startup date [Thu Nov 15 19:07:02 CET 2007]; root of context hierarchy]
 [main] org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:273) - Destroying singletons in {org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [fwk-propertyConfigurer,xxx,jtaTM,trService,trSession,trSessionProvider,trSessionPool,prefetchPolicy,redeliveryPolicy,listenerContainerParent,messageListener,connectionFactory,listenerContainer,tradeRepositoryImporter,jamonInterceptor,fwk-jamonAutoProxyCreator,errorHandler,jmsTemplate]; root of BeanFactory hierarchy}
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:87) - Applying DestructionAwareBeanPostProcessors to bean with name 'listenerContainer'
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:99) - Invoking destroy() on bean with name 'listenerContainer'
 [main] org.springframework.jms.listener.AbstractMessageListenerContainer.shutdown(AbstractMessageListenerContainer.java:520) - Shutting down message listener container
 [main] org.springframework.jms.listener.DefaultMessageListenerContainer.destroyListener(DefaultMessageListenerContainer.java:725) - Waiting for shutdown of message listener invokers
 [main] org.springframework.jms.listener.DefaultMessageListenerContainer.destroyListener(DefaultMessageListenerContainer.java:729) - Still waiting for shutdown of 1 message listener invokers
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:705) - Triggering beforeCommit synchronization
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:718) - Triggering beforeCompletion synchronization
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:188) - Removed value [org.springframework.jms.connection.JmsResourceHolder@13f347] for key [org.jencks.pool.PooledSpringXAConnectionFactory@1bef4c6] from thread [DefaultMessageListenerContainer-1]
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXASession.close(PooledSpringXASession.java:93) - ---->>>>> PooledSpringXASession.close() called
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXASession.close(PooledSpringXASession.java:113) - ---->>>>> ignoreClose IS TRUE!  KEEPING SESSION OPEN!
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:538) - Initiating transaction commit
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCommit(AbstractPlatformTransactionManager.java:731) - Triggering afterCommit synchronization
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionManager.java:747) - Triggering afterCompletion synchronization
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXAConnection$Synchronization.afterCompletion(PooledSpringXAConnection.java:322) - -->> PooledSpringXAConnection.[synchronization].afterCompletion() CALLED...
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(TransactionSynchronizationManager.java:188) - Removed value [org.jencks.pool.PooledSpringXASession@1dba9f9] for key [ActiveMQConnection {id=ID:kdefombelle-4368-1195150028871-1:0,clientId=ID:kdefombelle-4368-1195150028871-2:0,started=true}] from thread [DefaultMessageListenerContainer-1]
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXAConnection$Synchronization.afterCompletion(PooledSpringXAConnection.java:328) - -->> RETURNING JMS SESSION TO POOL...
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXASession.close(PooledSpringXASession.java:93) - ---->>>>> PooledSpringXASession.close() called
 [DefaultMessageListenerContainer-1] org.jencks.pool.PooledSpringXASession.close(PooledSpringXASession.java:98) - ---->>>>> ignoreClose = false, so returning session pool...
 [DefaultMessageListenerContainer-1] org.jencks.pool.XASessionPool.passivateObject(XASessionPool.java:93) - ---->>>>> SESSION HAS BEEN RETURNED TO POOL: org.jencks.pool.PooledSpringXASession@1dba9f9
 [DefaultMessageListenerContainer-1] org.springframework.transaction.support.TransactionSynchronizationManager.clearSynchronization(TransactionSynchronizationManager.java:270) - Clearing transaction synchronization
 [main] org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:322) - Retrieved dependent beans for bean 'trSessionPool': [trSessionProvider]
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:87) - Applying DestructionAwareBeanPostProcessors to bean with name 'trSessionPool'
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:99) - Invoking destroy() on bean with name 'trSessionPool'
 [main] org.springframework.aop.target.CommonsPoolTargetSource.destroy(CommonsPoolTargetSource.java:264) - Closing Commons ObjectPool
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:87) - Applying DestructionAwareBeanPostProcessors to bean with name 'trSession'
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:153) - Invoking custom destroy method on bean with name 'trSession'
 
[main] org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:322) - Retrieved dependent beans for bean 'trService': [trSessionPool]
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:87) - Applying DestructionAwareBeanPostProcessors to bean with name 'trService'
 [main] org.springframework.beans.factory.support.DisposableBeanAdapter.invokeCustomDestroyMethod(DisposableBeanAdapter.java:153) - Invoking custom destroy method on bean with name 'trService'
 
Thanks for any info...

 « Return to Thread: Is Spring able to destroy cleanly PooledSpringXAConnection(s) ?