activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Trevor Higgins (JIRA)" <>
Subject [jira] Commented: (AMQ-1375) ActiveMQ hangs, cannot send message/create temp queue
Date Wed, 05 Sep 2007 07:27:22 GMT


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"/>

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

   <bean id="destinationResolver" class=""/>
	<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://${jms.server}:${jms.port}"/>
	<bean id="listenerContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer"
		<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 id="messageListener" class=""
		<property name="destinationFactory" ref="destinationResolver"/> 
                <property name="messageConverter">
                    <bean class=""/>

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:
>             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
> 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:
> 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$ line: 159
> at 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.

View raw message