You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Gary Tully (JIRA)" <ji...@apache.org> on 2009/07/08 15:28:07 UTC

[jira] Commented: (AMQ-1875) Transport threads spawned from daemon threads should themselves be daemon threads

    [ https://issues.apache.org/activemq/browse/AMQ-1875?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=52734#action_52734 ] 

Gary Tully commented on AMQ-1875:
---------------------------------

you can achieve what you want though config by adding daemon=true as a query parameter to the brokerUrl passed to your ActiveMQConnectionFactory

{code}tcp://localhost:61616?daemon=true{code}

> Transport threads spawned from daemon threads should themselves be daemon threads
> ---------------------------------------------------------------------------------
>
>                 Key: AMQ-1875
>                 URL: https://issues.apache.org/activemq/browse/AMQ-1875
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Transport
>    Affects Versions: 5.1.0
>         Environment: Windows XP, JDK 1.6.0r6
>            Reporter: Justin Lebar
>             Fix For: 5.4.0
>
>
> When a thread opens a connection over TCP, ActiveMQ spawns a transport thread.  The transport thread doesn't die until the connection is closed.  That's fine if the connection was opened by a non-daemon thread.  However, if the connection was opened by a daemon thread, the transport thread spawned is still set as a non-daemon thread.  If the daemon thread keeps its connection open, the process never dies, because a non-daemon is still alive.
> I think AMQ transport threads should inherit their daemon-ness from their parent thread, and they should be responsible for cleaning themselves up when the application quits, if necessary.
> Below is some code which exhibits the described behavior.  Run it and examine it with jstack or put a breakpoint right after the connection.start() to see that the transport thread is non-daemon.
> {code}
> import javax.jms.*;
> import org.apache.activemq.ActiveMQConnectionFactory;
> import org.apache.activemq.pool.PooledConnectionFactory;
> public class DaemonThreadTest {
>    public static void main(String[] args) throws Exception {
>        {
>            Thread t = new Thread(new Runnable() {
>                public void run() {
>                    try {
>                        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( "", "", "tcp://localhost:61616"));
>                        Connection connection = connectionFactory.createConnection();
>                        connection.start();
>                        while (true) {
>                             // Do some stuff, expecting the JVM to kill us when we're done.
>                        }
>                        // Unreached
>                        connection.close();
>                    } catch (Exception e) {
>                        e.printStackTrace();
>                    }
>                }
>            });
>            t.setDaemon(true);
>            t.start();
>            // An infinite wait because I'm lazy.  You could replace this with a sleep, so long as you wait
>            // long enough for the daemon to initialize its connection.
>            Object lock = new Object();
>            synchronized(lock) {
>                lock.wait();
>            }
>        }
>    }
> }
> {code}

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