Return-Path: Delivered-To: apmail-geronimo-activemq-commits-archive@www.apache.org Received: (qmail 36161 invoked from network); 6 Mar 2006 12:02:56 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 6 Mar 2006 12:02:56 -0000 Received: (qmail 22202 invoked by uid 500); 6 Mar 2006 12:03:42 -0000 Delivered-To: apmail-geronimo-activemq-commits-archive@geronimo.apache.org Received: (qmail 22175 invoked by uid 500); 6 Mar 2006 12:03:42 -0000 Mailing-List: contact activemq-commits-help@geronimo.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: activemq-dev@geronimo.apache.org Delivered-To: mailing list activemq-commits@geronimo.apache.org Received: (qmail 22164 invoked by uid 99); 6 Mar 2006 12:03:42 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Mar 2006 04:03:42 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Mon, 06 Mar 2006 04:03:31 -0800 Received: (qmail 35606 invoked by uid 65534); 6 Mar 2006 12:02:17 -0000 Message-ID: <20060306120217.35569.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r383521 [9/30] - in /incubator/activemq/site: ./ rpc/ Date: Mon, 06 Mar 2006 11:52:07 -0000 To: activemq-commits@geronimo.apache.org From: foconer@apache.org X-Mailer: svnmailer-1.0.7 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Modified: incubator/activemq/site/Fanout+Transport+Reference URL: http://svn.apache.org/viewcvs/incubator/activemq/site/Fanout%2BTransport%2BReference?rev=383521&r1=383520&r2=383521&view=diff ============================================================================== --- incubator/activemq/site/Fanout+Transport+Reference (original) +++ incubator/activemq/site/Fanout+Transport+Reference Mon Mar 6 03:51:26 2006 @@ -1,342 +1,21 @@ - - - - - - - ActiveMQ - Fanout Transport Reference - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - -
-
-
- - - - - -
-
-

- Home -

-
-
- -
-
-
-

Overview

- - - - -

Utilities

- - - - -

External Tools

- - - - -

Related Projects

- - - - -

Support

- - - - -

Tools we use

- -

- -
-

Feeds

- -
-
-
-
- Print -
Fanout Transport Reference
-
- - -
- -
- -
-

The Fanout Transport

- -

The Fanout transport layers reconnect and replication logic on top of any of the other transports. It is used replicate commands to multiple brokers.

- -

Configuration Syntax

- -

fanout:(discoveryURI)?transportOptions
-or
-fanout:discoveryURI

- -
Transport Options
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Option NameDefault ValueDescription
initialReconnectDelay10How long to wait before the first reconnect attempt
maxReconnectDelay30000The maximum amount of time we ever wait between reconnect attempts
useExponentialBackOfftrueShould an exponential backoff be used btween reconnect attempts
backOffMultiplier2The exponent used in the exponential backoff attempts
maxReconnectAttempts0If not 0, then this is the maximum number of reconnect attempts before an error is sent back to the client
- -
Example URI
- -
-
fanout:(static:(tcp://localhost:61616,tcp://remotehost:61616))?initialReconnectDelay=100
-
-
-
-
-
- - -
-
-
- -
Powered by Atlassian Confluence
- -
-
- +Server returned HTTP response code: 500 for URL: http://docs.codehaus.org/rpc/xmlrpc com.openxource.unity.providers.confluence.ConfluencePageProviderImpl.getPage(ConfluencePageProviderImpl.java:78) + com.openxource.unity.beans.impl.UnityPageRendererImpl.getFragment(UnityPageRendererImpl.java:249) + com.openxource.unity.beans.impl.UnityPageRendererImpl.renderPage(UnityPageRendererImpl.java:155) + com.openxource.unity.servlets.ContentServlet.doGet(ContentServlet.java:69) + javax.servlet.http.HttpServlet.service(HttpServlet.java:689) + javax.servlet.http.HttpServlet.service(HttpServlet.java:802) + org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) + org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) + org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) + org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) + org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) + org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) + org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) + org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) + org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199) + org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282) + org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744) + org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674) + org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866) + org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) + java.lang.Thread.run(Thread.java:595) Modified: incubator/activemq/site/General URL: http://svn.apache.org/viewcvs/incubator/activemq/site/General?rev=383521&r1=383520&r2=383521&view=diff ============================================================================== --- incubator/activemq/site/General (original) +++ incubator/activemq/site/General Mon Mar 6 03:51:26 2006 @@ -1,278 +1,21 @@ - - - - - - - ActiveMQ - General - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - -
-
-
- - - - - -
-
-

- Home -

-
-
- -
-
-
-

Overview

- - - - -

Utilities

- - - - -

External Tools

- - - - -

Related Projects

- - - - -

Support

- - - - -

Tools we use

- -

- -
-

Feeds

- -
-
-
-
- Print -
General
-
- - -
- -
- -
- - -

General questions about ActiveMQ

- - -
- -
-
- -
Powered by Atlassian Confluence
- -
-
- +Server returned HTTP response code: 500 for URL: http://docs.codehaus.org/rpc/xmlrpc com.openxource.unity.providers.confluence.ConfluencePageProviderImpl.getPage(ConfluencePageProviderImpl.java:78) + com.openxource.unity.beans.impl.UnityPageRendererImpl.getFragment(UnityPageRendererImpl.java:249) + com.openxource.unity.beans.impl.UnityPageRendererImpl.renderPage(UnityPageRendererImpl.java:155) + com.openxource.unity.servlets.ContentServlet.doGet(ContentServlet.java:69) + javax.servlet.http.HttpServlet.service(HttpServlet.java:689) + javax.servlet.http.HttpServlet.service(HttpServlet.java:802) + org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) + org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) + org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) + org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) + org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) + org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) + org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) + org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) + org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199) + org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282) + org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744) + org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674) + org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866) + org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) + java.lang.Thread.run(Thread.java:595) Modified: incubator/activemq/site/Geronimo URL: http://svn.apache.org/viewcvs/incubator/activemq/site/Geronimo?rev=383521&r1=383520&r2=383521&view=diff ============================================================================== --- incubator/activemq/site/Geronimo (original) +++ incubator/activemq/site/Geronimo Mon Mar 6 03:51:26 2006 @@ -1,510 +1,21 @@ - - - - - - - ActiveMQ - Geronimo - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - -
-
-
- - - - - -
-
-

- Home -

-
-
- -
-
-
-

Overview

- - - - -

Utilities

- - - - -

External Tools

- - - - -

Related Projects

- - - - -

Support

- - - - -

Tools we use

- -

- -
-

Feeds

- -
-
-
-
- Print -
Geronimo
-
- - -
- -
- -
-

ActiveMQ is the default JMS provider in Apache Geronimo.

- -

ActiveMQ can be used both as JMS Client and a JMS Broker. This short
-article explains how to use it on a standalone client to access the
-topics/queues setup on a remote Geronimo/ActiveMQ broker.

- -

1) Setup the queues and topics on the ActiveMQ Broker
-If you're using a standalone ActiveMQ broker, then following the instructions on
-ActiveMQ's website should be enough to setup everything.
-However, if your ActiveMQ's instance is embedded inside the J2EE Geronimo
-Application Server, creating Queues and Topics is about deploying Resource
-Adapters to your Geronimo server.
-The following deployment descriptor can be used to deploy two topics and a
-ConnectionFactory: weatherTopic and weatherRequestsTopic

- -
-
<?xml version="1.0" encoding="UTF-8"?>
-<connector xmlns="http://geronimo.apache.org/xml/ns/j2ee/connector"
-    version="1.5"
-    configId="weather/Topics"
-    parentId="org/apache/geronimo/SystemJMS">
-    <resourceadapter>
-        <resourceadapter-instance>
-            <resourceadapter-name>ActiveMQ RA</resourceadapter-name>
-            <config-property-setting name="ServerUrl">tcp://localhost:61616</config-property-setting>
-            <config-property-setting name="UserName">geronimo</config-property-setting>
-            <config-property-setting name="Password">geronimo</config-property-setting>
-            <workmanager>
-                <gbean-link>DefaultWorkManager</gbean-link>
-            </workmanager>
-        </resourceadapter-instance>
-        <outbound-resourceadapter>
-            <connection-definition>
-
-<connectionfactory-interface>javax.jms.ConnectionFactory</connectionfactory-interface>
-                <connectiondefinition-instance>
-                    <name>ConnectionFactory</name>
-
-<implemented-interface>javax.jms.QueueConnectionFactory</implemented-interface>
-
-<implemented-interface>javax.jms.TopicConnectionFactory</implemented-interface>
-                    <connectionmanager>
-                        <xa-transaction>
-                            <transaction-caching/>
-                        </xa-transaction>
-                        <single-pool>
-                            <max-size>10</max-size>
-
-<blocking-timeout-milliseconds>5000</blocking-timeout-milliseconds>
-                            <match-one/>
-                        </single-pool>
-                    </connectionmanager>
-                    <global-jndi-name>ConnectionFactory</global-jndi-name>
-                    <!--
-<credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
--->
-                </connectiondefinition-instance>
-            </connection-definition>
-        </outbound-resourceadapter>
-    </resourceadapter>
-    <adminobject>
-        <adminobject-interface>javax.jms.Topic</adminobject-interface>
-
-<adminobject-class>org.codehaus.activemq.message.ActiveMQTopic</adminobject-class>
-        <adminobject-instance>
-            <message-destination-name>weatherTopic</message-destination-name>
-            <config-property-setting
-name="PhysicalName">weatherTopic</config-property-setting>
-        </adminobject-instance>
-    </adminobject>
-    <adminobject>
-        <adminobject-interface>javax.jms.Topic</adminobject-interface>
-
-<adminobject-class>org.codehaus.activemq.message.ActiveMQTopic</adminobject-class>
-        <adminobject-instance>
-
-<message-destination-name>weatherRequestsTopic</message-destination-name>
-            <config-property-setting
-name="PhysicalName">weatherRequestsTopic</config-property-setting>
-        </adminobject-instance>
-    </adminobject>
-
-</connector>
-
- -

Then deploy it using Geronimo's deploy tool :

- -
-
D:\geronimo>java -jar bin\deployer.jar deploy d:\projects\weather\src\resources\
-geronimo-activemq.xml repository\activemq\rars\activemq-ra-3.1-SNAPSHOT.rar
-Username: system
-Password: manager
-Deployed weather/Topics
-
- -

The geronimo.log file should now refer to these newly deployed Topics.

- -

2) Now that the queues are available server-side, what we want is access them
-thanks to a standalone Client.
-Usually, the process is the following one :

-
    -
  • Contact the J2EE naming server (port 1099, RMI) to get an JNDI InitialContext.
  • -
  • The J2EE server automatically exposes the ConnectionFactory and the Topics
    -through JNDI, so the InitialContext allows you to retrieve both the
    -ConnectionFactory and the Topics
  • -
  • Once you have your Topics, you just use them..
  • -
- - -

However, ActiveMQ's JNDI Implementation does NOT talk to the naming server. It's
-a stripped down version of a JNDI client that just allows to get Topics and
-Queues directly from a JMS instance.
-So, instead of supplying the naming server address, you have to supply the JMS
-server address.
-Most JNDI implementations use the java.naming.provider.url property to specify
-the naming server's address. ActiveMQ uses the brokerURL one. Using the
-java.naming.provider.url one instead will result in ActiveMQ trying to load the
-whole Broker.

- -

3) So, now we have explained the process, let's detail the Spring way of doing
-things :

- -
    -
  • Create a bootstrap.properties file that's available in your classpath
    -jms.connectionFactoryName=ConnectionFactory
    -jms.jndiProviderUrl=tcp://localhost:61616
    -jms.jndiContextFactory=org.activemq.jndi.ActiveMQInitialContextFactory
  • -
- - -

jms.weatherTopic=weatherTopic
-jms.weatherRequestsTopic=weatherRequestsTopic

- -
    -
  • Now, in your Spring description file, declare the bean that will read
    -the properties from the bootstrap.properties file -
    -
    <bean id="placeholderConfig" 
    -          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    -        <property name="location"><value>classpath:/bootstrap.properties</value></property>
    -    </bean>
    -
  • -
- - -
    -
  • Create a JNDI template (A Spring-specific wrapper around the JNDI InitialContext -
    -
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    -        <property name="environment">
    -            <props>
    -                <prop key="java.naming.factory.initial">${jms.jndiContextFactory}</prop>
    -
    -				<!-- Specific to ActiveMQ -->
    -
    -				<!-- the address of the ActiveMQ broker -->
    -                <prop key="brokerURL">${jms.jndiProviderUrl}</prop>
    -				<!-- Some Topics Registration, since we are using a fake JNDI implementation -->
    -                <prop key="topic.${jms.weatherTopic}">${jms.weatherTopic}</prop>
    -                <prop key="topic.${jms.weatherRequestsTopic}">${jms.weatherRequestsTopic}</prop>
    -			</props>
    -        </property>
    -    </bean>
    -
  • -
- - -
    -
  • Retrieve the ConnectionFactory from the JNDI context
  • -
- - -
-
<bean id="internalJmsQueueConnectionFactory"
-        class="org.springframework.jndi.JndiObjectFactoryBean">
-        <property name="jndiTemplate">
-            <ref bean="jndiTemplate"/>
-        </property>
-        <property name="jndiName">
-            <value>${jms.connectionFactoryName}</value>
-        </property>
-    </bean>
-
- -

I'm not 100% sure, but I think that you can put any Factory Name, it will just
-work. (In a scenario where the JNDI context actually contacts a naming server,
-it should match the name of the deployed ConnectionFactory)

- -
    -
  • Get the Topics instances from the JNDI Context
  • -
- - -
-
<bean id="weatherTopic"
-		class="org.springframework.jndi.JndiObjectFactoryBean"
-		singleton="true">
-        <property name="jndiTemplate">
-            <ref bean="jndiTemplate"/>
-        </property>
-        <property name="jndiName">
-            <value>${jms.weatherTopic}</value>
-        </property>
-	</bean>
-<bean id="weatherRequestTopic"
-		class="org.springframework.jndi.JndiObjectFactoryBean"
-		singleton="true">
-        <property name="jndiTemplate">
-            <ref bean="jndiTemplate"/>
-        </property>
-        <property name="jndiName">
-            <value>${jms.weatherRequestsTopic}</value>
-        </property>
-	</bean>
-
- -
    -
  • Now, you can reuse these Topics beans the way you want.
  • -
- -
-
- - -
-
-
- -
Powered by Atlassian Confluence
- -
-
- +Server returned HTTP response code: 500 for URL: http://docs.codehaus.org/rpc/xmlrpc com.openxource.unity.providers.confluence.ConfluencePageProviderImpl.getPage(ConfluencePageProviderImpl.java:78) + com.openxource.unity.beans.impl.UnityPageRendererImpl.getFragment(UnityPageRendererImpl.java:249) + com.openxource.unity.beans.impl.UnityPageRendererImpl.renderPage(UnityPageRendererImpl.java:155) + com.openxource.unity.servlets.ContentServlet.doGet(ContentServlet.java:69) + javax.servlet.http.HttpServlet.service(HttpServlet.java:689) + javax.servlet.http.HttpServlet.service(HttpServlet.java:802) + org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) + org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) + org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) + org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) + org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) + org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) + org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) + org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) + org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199) + org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282) + org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744) + org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674) + org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866) + org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) + java.lang.Thread.run(Thread.java:595) Modified: incubator/activemq/site/Hermes+Jms URL: http://svn.apache.org/viewcvs/incubator/activemq/site/Hermes%2BJms?rev=383521&r1=383520&r2=383521&view=diff ============================================================================== --- incubator/activemq/site/Hermes+Jms (original) +++ incubator/activemq/site/Hermes+Jms Mon Mar 6 03:51:26 2006 @@ -1,332 +1,21 @@ - - - - - - - ActiveMQ - Hermes Jms - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - -
- - - -
-
-
- - - - - -
-
-

- Home -

-
-
- -
-
-
-

Overview

- - - - -

Utilities

- - - - -

External Tools

- - - - -

Related Projects

- - - - -

Support

- - - - -

Tools we use

- -

- -
-

Feeds

- -
-
-
-
- Print -
Hermes Jms
-
- - -
- -
- -
- - -

You can use ActiveMQ with Hermes JMS which is a graphical user interface for working with JMS queues. Please refer to the Hermes JMS site for detailed instructions on using this software.

- -

Demo

- -

Mark Bucayan kindly submitted a Flash demo showing how to use ActiveMQ inside Hermes.

- -

There is a screen shot available.

- -

Here are a few steps to get you started with ActiveMQ when using HermesJMS.

- -

Add ActiveMQ as a provider

- -

You need to register the jars required to run ActiveMQ inside HermesJMS. To do this click on Options -> Preferences. Then on the Providers tab add the following jars

- -
    -
  • activemq.jar
  • -
  • concurrent.jar
  • -
  • geronimo-spec-j2ee-management.jar
  • -
- - -

To get a copy of these jars you can run the 'maven war' target in the ActiveMQ directory and the jars will all be copied into target/activemq/WEB-INF/lib

- -

Configure an ActiveMQ Session

- -

On the Preferences dialog, the Sessions tab, create a new session using the org.activemq.ActiveMQConnectionFactory connection factory.

- -

You can use the properties table to configure the various factory properties, like the brokerURL to connect to the server, if you wish to connect to a remote ActiveMQ message broker.

- -

Finally you can add some Destinations to the dialog on this page. (Right click to add). Add the destination FOO.BAR for the default test programs.

- -

Viewing messages on queues

- -

Use the tree control to open your session and the FOO.BAR destination. Try browse the queue. Then run the ActiveMQ sample producer via

- -
-
maven producer
-
- -

And hitting refresh in HermesJMS and you should see the messages that have just been published.

-
-
- - -
-
-
- -
Powered by Atlassian Confluence
- -
-
- +Server returned HTTP response code: 500 for URL: http://docs.codehaus.org/rpc/xmlrpc com.openxource.unity.providers.confluence.ConfluencePageProviderImpl.getPage(ConfluencePageProviderImpl.java:78) + com.openxource.unity.beans.impl.UnityPageRendererImpl.getFragment(UnityPageRendererImpl.java:249) + com.openxource.unity.beans.impl.UnityPageRendererImpl.renderPage(UnityPageRendererImpl.java:155) + com.openxource.unity.servlets.ContentServlet.doGet(ContentServlet.java:69) + javax.servlet.http.HttpServlet.service(HttpServlet.java:689) + javax.servlet.http.HttpServlet.service(HttpServlet.java:802) + org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) + org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) + org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) + org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) + org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) + org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) + org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) + org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) + org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199) + org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282) + org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744) + org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674) + org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866) + org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) + java.lang.Thread.run(Thread.java:595)