I created a junit test which hangs after about 50 iterations.

Note that the behaviour is not compatible with two standalone programs and a
tcp-broker. 
In that case the producer can still send but the consumer blocks...

The unit test is attached to:

https://issues.apache.org/activemq/browse/AMQ-1136

Hope this helps.

Tom


rajdavies wrote:
> 
> Hi Albert,
> 
> it would be great if you could produce a junit test case and attach  
> it to an issue in our issue tracker - http://issues.apache.org/ 
> activemq/secure/CreateIssue!default.jspa
> these are just the sort of cases we look for for testing n' fixing  
> stuff!
> 
> cheers,
> 
> Rob
> On 21 Jan 2007, at 15:32, Albert Strasheim wrote:
> 
>> Hello all
>>
>> On Thu, 18 Jan 2007, James.Strachan wrote:
>>
>>> Have you tried setting the UsageManager configuration to something  
>>> large? Out
>>> of the box its set to something really tiny.
>>>
>>> BTW if you have an issue, please mention the version of the  
>>> software you are
>>> using.
>>> http://incubator.apache.org/activemq/support.html
>>> James
>>
>> Some more details from the day's debugging.
>>
>> We're running ActiveMQ 4.2 from trunk as checked out on Friday.
>>
>> Our test has a thread that produces messages. On another connection in
>> the same application, we have a consumer with a message listener set.
>> This listener produces a new message.
>>
>> Debugging with Eclipse, I see that the first time the code goes into
>> UsageManager.waitForSpace, it is calling from the thread that  
>> produces.
>> The stack looks like this:
>>
>> Thread [myapp$MyThread] (Suspended (breakpoint at line 91 in  
>> UsageManager))       
>>      UsageManager.waitForSpace() line: 91    
>>      UsageManager.waitForSpace() line: 88    
>>      Topic.send(ConnectionContext, Message) line: 248        
>>      ManagedTopicRegion(AbstractRegion).send(ConnectionContext,  
>> Message) line: 305   
>>      ManagedRegionBroker(RegionBroker).send(ConnectionContext, Message)  
>> line: 381    
>>      TransactionBroker.send(ConnectionContext, Message) line: 197    
>>      AdvisoryBroker(BrokerFilter).send(ConnectionContext, Message)  
>> line: 126    
>>      CompositeDestinationBroker.send(ConnectionContext, Message) line: 98    
>>      BrokerService$2(MutableBrokerFilter).send(ConnectionContext,  
>> Message) line: 136   
>>      TransportConnection.processMessage(Message) line: 449   
>>      ActiveMQBytesMessage(ActiveMQMessage).visit(CommandVisitor) line:  
>> 604  
>>      TransportConnection.service(Command) line: 258  
>>      TransportConnection$1.onCommand(Object) line: 164       
>>      ResponseCorrelator.onCommand(Object) line: 95   
>>      MutexTransport(TransportFilter).onCommand(Object) line: 65      
>>      VMTransportServer$1(VMTransport).syncOneWay(Object) line: 99    
>>      VMTransportServer$1(VMTransport).oneway(Object) line: 86        
>>      MutexTransport.oneway(Object) line: 44  
>>      ResponseCorrelator.asyncRequest(Object, ResponseCallback) line: 69      
>>      ResponseCorrelator.request(Object) line: 74     
>>      ActiveMQConnection.syncSendPacket(Command) line: 1185   
>>      ActiveMQSession.send(ActiveMQMessageProducer, ActiveMQDestination,  
>> Message, int, int, long) line: 1547  
>>      ActiveMQMessageProducer.send(Destination, Message, int, int, long)  
>> line: 473    
>>      ActiveMQMessageProducer.send(Message) line: 358 
>>         <thread in my application calling send>
>>
>> If I then allow the VM to continue, it runs for a short while and then
>> the single remaining ActiveMQ Session Task thread blocks:
>>
>> Thread [ActiveMQ Session Task] (Suspended (breakpoint at line 91 in  
>> UsageManager))       
>>      UsageManager.waitForSpace() line: 91    
>>      UsageManager.waitForSpace() line: 88    
>>      Topic.send(ConnectionContext, Message) line: 248        
>>      ManagedTopicRegion(AbstractRegion).send(ConnectionContext,  
>> Message) line: 305   
>>      ManagedRegionBroker(RegionBroker).send(ConnectionContext, Message)  
>> line: 381    
>>      TransactionBroker.send(ConnectionContext, Message) line: 197    
>>      AdvisoryBroker(BrokerFilter).send(ConnectionContext, Message)  
>> line: 126    
>>      CompositeDestinationBroker.send(ConnectionContext, Message) line: 98    
>>      BrokerService$2(MutableBrokerFilter).send(ConnectionContext,  
>> Message) line: 136   
>>      TransportConnection.processMessage(Message) line: 449   
>>      ActiveMQBytesMessage(ActiveMQMessage).visit(CommandVisitor) line:  
>> 604  
>>      TransportConnection.service(Command) line: 258  
>>      TransportConnection$1.onCommand(Object) line: 164       
>>      ResponseCorrelator.onCommand(Object) line: 95   
>>      MutexTransport(TransportFilter).onCommand(Object) line: 65      
>>      VMTransportServer$1(VMTransport).syncOneWay(Object) line: 99    
>>      VMTransportServer$1(VMTransport).oneway(Object) line: 86        
>>      MutexTransport.oneway(Object) line: 44  
>>      ResponseCorrelator.asyncRequest(Object, ResponseCallback) line: 69      
>>      ResponseCorrelator.request(Object) line: 74     
>>      ActiveMQConnection.syncSendPacket(Command) line: 1185   
>>      ActiveMQSession.send(ActiveMQMessageProducer, ActiveMQDestination,  
>> Message, int, int, long) line: 1547  
>>      ActiveMQMessageProducer.send(Destination, Message, int, int, long)  
>> line: 473    
>>      ActiveMQMessageProducer.send(Message) line: 358 
>>      
>>      <onMessage of listener in my application is called. it calls send.>
>>      
>>      ActiveMQMessageConsumer.dispatch(MessageDispatch) line: 870     
>>      ActiveMQSessionExecutor.dispatch(MessageDispatch) line: 99      
>>      ActiveMQSessionExecutor.iterate() line: 166     
>>      PooledTaskRunner.runTask() line: 111    
>>      PooledTaskRunner.access$1(PooledTaskRunner) line: 95    
>>      PooledTaskRunner$1.run() line: 44       
>>      ThreadPoolExecutor$Worker.runTask(Runnable) line: 885   
>>      ThreadPoolExecutor$Worker.run() line: 907       
>>      Thread.run() line: 619  
>>
>> There doesn't seem to be any other ActiveMQ threads around, so I can't
>> see how this thread is going to wake up from its
>>
>> usageMutex.wait();
>>
>> that is blocking on.
>>
>> Any thoughts? Is it wrong to produce straight from a message listener?
>>
>> By the way, I noticed that increasing the memory available to the
>> memory manager from 20 MB to 128 MB actually makes the application  
>> block
>> sooner rather than later. I also experimented with some prefetch  
>> policy
>> settings, but these don't make much of a difference. Currently, we're
>> simply using
>>
>> vm://localhost?broker.useJmx=true&broker.persistent=false
>>
>> as our broker URL.
>>
>> We're using topics throughout. Sessions' acknowledge modes are all set
>> to DUPS_OK_ACKNOWLEDGE. We're doing some message selection with string
>> and integer properties.
>>
>> Cheers,
>>
>> Albert
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Blocking-on-UsageManager.waitForSpace-again-tf3031460s2354.html#a9021999
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to