[ 
https://issues.apache.org/jira/browse/JAMES-767?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12630266#action_12630266
 ] 

Markus Wiederkehr commented on JAMES-767:
-----------------------------------------

Okay, here is what I have figured out so far. I have included the source code 
of excalibur-thread-impl-2.1.jar in my Eclipse project. This jar-file contains 
the class DefaultThreadPool in question.

This is the critical code:

73:  public void dispose()
74:  {
75:    m_pool.dispose();
76:    this.destroy();
77:  }

DefaultThreadPool extends ThreadGroup so this.destroy() in line 76 actually 
call ThreadGroup.destroy().

I put an invocation of ThreadGroup.list() between lines 75 and 76 and this is 
what I get as output:

org.apache.avalon.excalibur.thread.impl.DefaultThreadPool[name=default,maxpri=10]
    Thread[default Worker #0,5,default]

So the ThreadGroup cannot be destroyed because there is still a worker thread 
lingering around.

The m_pool in line 75 is actually a SoftResourceLimitingPool from 
excalibur-pool-impl-2.1.jar. This SoftResourceLimitingPool extends DefaultPool 
which has the following dispose method:

    public final void dispose()
    {
        try
        {
            m_mutex.acquire();
            try
            {
                while( m_ready.size() > 0 )
                {
                    this.removePoolable( (Poolable)m_ready.remove() );
                }
            }
            finally
            {
                m_mutex.release();
            }
        }
        catch( Exception e )
        {
            if( getLogger().isWarnEnabled() )
            {
                getLogger().warn( "Caught an exception disposing of pool", e );
            }
        }

        this.m_disposed = true;
    }

So it removes all elements from its ready pool. But if you take a look at the 
base class AbstractPool you see that there is also a list of active elements 
m_active, which seems to be ignored in the dispose method in DefaultPool.

So to summarize it looks like active threads in the pool are not terminated and 
as a result the TreadGroup cannot be destroyed.

Maybe someone can take it from here?

> exception when shutting down server
> -----------------------------------
>
>                 Key: JAMES-767
>                 URL: https://issues.apache.org/jira/browse/JAMES-767
>             Project: James
>          Issue Type: Bug
>    Affects Versions: 2.3.0
>         Environment: Mac OS X 10.4.8, intel Mac 2.16 GHz dual core, Java VM 
> build 1.5.0_06-112
>            Reporter: Ray Kiddy
>            Priority: Minor
>
> I have set up a James server to test a mail client. I configure it with the 
> IP address of the machine. I do not use DNS, but instead us e-mail addresses 
> like "[EMAIL PROTECTED]". When I shut down the server with ctl-C, I get:
> ^CJVM exiting abnormally. Shutting down Phoenix.
> org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleException: 
> Component named "thread-manager" failed to pass through the Destruction 
> stage. (Reason: java.lang.IllegalThreadStateException).
>         at 
> org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleHelper.fail(LifecycleHelper.java:354)
>         at 
> org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleHelper.shutdown(LifecycleHelper.java:288)
>         at 
> org.apache.avalon.phoenix.components.application.DefaultApplication.shutdown(DefaultApplication.java:566)
>         at 
> org.apache.avalon.phoenix.components.application.DefaultApplication.doRunPhase(DefaultApplication.java:482)
>         at 
> org.apache.avalon.phoenix.components.application.DefaultApplication.runPhase(DefaultApplication.java:409)
>         at 
> org.apache.avalon.phoenix.components.application.DefaultApplication.stop(DefaultApplication.java:233)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.stop(ContainerUtil.java:292)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.shutdown(ContainerUtil.java:66)
>         at 
> org.apache.avalon.phoenix.components.kernel.DefaultKernel.shutdown(DefaultKernel.java:346)
>         at 
> org.apache.avalon.phoenix.components.kernel.DefaultKernel.removeApplication(DefaultKernel.java:455)
>         at 
> org.apache.avalon.phoenix.components.deployer.DefaultDeployer.undeploy(DefaultDeployer.java:244)
>         at 
> org.apache.avalon.phoenix.components.deployer.DefaultDeployer.dispose(DefaultDeployer.java:154)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.dispose(ContainerUtil.java:306)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.shutdown(ContainerUtil.java:67)
>         at 
> org.apache.avalon.phoenix.components.embeddor.DefaultEmbeddor.shutdownComponents(DefaultEmbeddor.java:598)
>         at 
> org.apache.avalon.phoenix.components.embeddor.DefaultEmbeddor.dispose(DefaultEmbeddor.java:342)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.dispose(ContainerUtil.java:306)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.shutdown(ContainerUtil.java:67)
>         at 
> org.apache.avalon.phoenix.frontends.CLIMain.shutdown(CLIMain.java:326)
>         at 
> org.apache.avalon.phoenix.frontends.CLIMain.forceShutdown(CLIMain.java:295)
>         at 
> org.apache.avalon.phoenix.frontends.ShutdownHook.run(CLIMain.java:386)
> Caused by: java.lang.IllegalThreadStateException
>         at java.lang.ThreadGroup.destroy(ThreadGroup.java:750)
>         at 
> org.apache.avalon.excalibur.thread.impl.DefaultThreadPool.dispose(DefaultThreadPool.java:76)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.dispose(ContainerUtil.java:306)
>         at 
> org.apache.avalon.cornerstone.blocks.threads.AbstractThreadManager.dispose(AbstractThreadManager.java:69)
>         at 
> org.apache.avalon.framework.container.ContainerUtil.dispose(ContainerUtil.java:306)
>         at 
> org.apache.avalon.phoenix.containerkit.lifecycle.LifecycleHelper.shutdown(LifecycleHelper.java:274)
>         ... 19 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to