[ 
https://issues.apache.org/activemq/browse/AMQ-1375?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_40075
 ] 

Trevor Higgins commented on AMQ-1375:
-------------------------------------

Can you explain why a producer would be blocked if all the client does when 
handling the message is add it to the executor in a Runnable? The reason for 
doing this was specifically to avoid taking time in the handling the message to 
prevent blocking the producer....

There is a session & producer created for each client request in a thread local 
fashion, but only one connection is created on server side. We dont share 
connection between client and server. Server has one connection only, created 
using connectionFactory.createConnection(); where connectionFactory is defined 
as follows in a server side Spring config file:

        <bean id="connectionFactory"
                class="org.apache.activemq.ActiveMQConnectionFactory" 
depends-on="broker">
                <property name="brokerURL" value="tcp://localhost:50057"/>
        </bean>


Each client listener is defined as follows in a separate client XML file:

   <bean id="destinationResolver" 
class="com.xxx.yyy.platform.core.transport.activemq.TempDestinationResolver"/>
    
        <bean id="connectionFactory" 
class="org.apache.activemq.ActiveMQConnectionFactory">
                <property name="brokerURL" 
value="tcp://${jms.server}:${jms.port}"/>
        </bean>
        
        <bean id="listenerContainer" 
class="org.springframework.jms.listener.SimpleMessageListenerContainer"
        destroy-method="destroy">
                <property name="concurrentConsumers" value="1"/>
                <property name="connectionFactory" ref="connectionFactory" />
                <property name="messageListener" ref="messageListener" />
                <property name="destinationName" value="destination"/>
                <property name="destinationResolver" ref="destinationResolver"/>
        </bean>
        
        <bean id="messageListener" 
class="com.xxx.yyy.platform.core.transport.activemq.MessageDispatcher"
        destroy-method="dispose">
                <property name="destinationFactory" ref="destinationResolver"/> 
                <property name="messageConverter">
                    <bean 
class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
                 </property>
        </bean> 

Hence the connections are separate entities created by the 
ActiveMQConnectionFactory.

Im am trying to reproduce this without our GUI/server stuff, just a simple AMQ 
Junit............

> ActiveMQ hangs, cannot send message/create temp queue
> -----------------------------------------------------
>
>                 Key: AMQ-1375
>                 URL: https://issues.apache.org/activemq/browse/AMQ-1375
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 4.1.1
>         Environment: Running an embedded broker in standalone java 
> application based on Spring framework on Solaris 10 with JVM version 
> 1.5.0_09. Using non persisten messaging with 512MB limit in memory manager of 
> broker.
>            Reporter: Trevor Higgins
>         Attachments: jstack_basic.txt
>
>
> We are experiencing severe issues with AMQ blocking sending. We have a basic 
> setup with one standalone server process and many clients. Each client has 
> its own temp queue for P2P request/response type communication. There is also 
> a number of topics broadcast to all clients. Our clients receive messages in 
> an MDP fashion with each message being processed on a single threaded 
> executor by an anonymous Runnable as follows:
> {code}
> public void onMessage(final Message message) {
>       threadRunner.submit(new Runnable() {            
>               public void run() {
>                       try {                           
>                               for(final IReceiverListener listener : 
> listeners) {
>                                       listener.onReceive(message);
>                               }
>                       } catch (Throwable e) {
>                               e.printStackTrace();
>                       }
>               }
>       });
> }
> {code}
> Every so often, the entire AMQ blocks and we cannot send anything anymore. We 
> also cannot create any new temp queues, which means no new client can start 
> up (each creates its own temp queue during startup). Connections are be 
> created and from that a session, but the session.createTemporaryQueue() call 
> alwaysy hangs. This is similar to AMQ-1278, but as we are cannot use 5.0 
> until stable release.......
> Here is the stack of the client trying to create a temp queue
> at Object.wait(long, int) line: not available [native method]
> at CondVar(Object).wait() line: 199
> at CondVar.await() line: 75
> at ArrayBlockingQueue.take() line: 318
> at FutureResponse.getResult() line: 42
> at ResponseCorrelator.request(Object) line: 75
> at ActiveMQConnection.syncSendPacket(Command) line: 1175
> at ActiveMQConnection.createTempDestination(boolean) line: 1594
> at ActiveMQSession.createTemporaryQueue() line: 1134
> at TempDestinationResolver.resolveDestinationName(Session, String, boolean) 
> line: 16
> at 
> SimpleMessageListenerContainer(JmsDestinationAccessor).resolveDestinationName(Session,
>  String) line: 100
> at SimpleMessageListenerContainer.createListenerConsumer(Session) line: 188
> at SimpleMessageListenerContainer.doInitialize() line: 171
> at SimpleMessageListenerContainer(AbstractJmsListeningContainer).initialize() 
> line: 160
> at 
> SimpleMessageListenerContainer(AbstractJmsListeningContainer).afterPropertiesSet()
>  line: 133
> at 
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).invokeInitMethods(String,
>  Object, RootBeanDefinition) line: 1202
> at 
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).initializeBean(String,
>  Object, RootBeanDefinition) line: 1172
> at 
> DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).createBean(String,
>  RootBeanDefinition, Object[]) line: 428
> at AbstractBeanFactory$1.getObject() line: 251
> at 
> DefaultListableBeanFactory(DefaultSingletonBeanRegistry).getSingleton(String, 
> ObjectFactory) line: 156
> at DefaultListableBeanFactory(AbstractBeanFactory).getBean(String, Class, 
> Object[]) line: 248
> at DefaultListableBeanFactory(AbstractBeanFactory).getBean(String) line: 160
> at DefaultListableBeanFactory.preInstantiateSingletons() line: 287
> at FileSystemXmlApplicationContext(AbstractApplicationContext).refresh() 
> line: 352
> at FileSystemXmlApplicationContext.<init>(String[], ApplicationContext) line: 
> 93
> at FileSystemXmlApplicationContext.<init>(String[]) line: 77
> at FileSystemXmlApplicationContext.<init>(String) line: 67
> at BindingService.<init>() line: 65
> at BindingService.getInstance() line: 43
> at TopologyServiceFactory.initialize() line: 123
> at TopologyManager.initialize() line: 31
> at TopologyView$3.run(IProgressMonitor) line: 159
> at Worker.run() line: 55
> I have attached a JStack of the server  process with embedded broker also.
> From our client side the only thing I am dubious about is the retention of 
> the reference to the message until the anonymous Runnable is executed. Could 
> this cause issues is for some reason the execution blocked, will the messages 
> build up in AMQ?
> From looking at JConsole for the broker, the memoryPercentageUsed is zero so 
> it doesnt appear to be a RAM issue.

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

Reply via email to