[ 
https://issues.apache.org/activemq/browse/AMQ-349?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rob Davies reassigned AMQ-349:
------------------------------

    Assignee: Rob Davies

> Misbehaving consumer can affect message delivery to other consumers for a 
> given topic.
> --------------------------------------------------------------------------------------
>
>                 Key: AMQ-349
>                 URL: https://issues.apache.org/activemq/browse/AMQ-349
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 3.1
>         Environment: Solaris, JDK 1.4
>            Reporter: Kevin Yaussy
>            Assignee: Rob Davies
>             Fix For: 5.0.0
>
>
> If you have a supplier publishing to a topic, with two consumers both 
> consuming that topic, a problem with one of the consumers can eventually stop 
> message flow to the other consumer.  The consumer-problem is specifically 
> categorized as some sort of freeze-up, such that the broker eventually blocks 
> on the socket write to that consumer.  The freeze-up could be the process 
> itself (perhaps a problem with the JVM), the network, or perhaps the machine 
> that the consumer is running on panics and goes away.
> Once the socket becomes blocked, the broker will queue (upto 
> maxOutstandingMessages) to the consumer.  The properly behaving consumer 
> continues to receive events at this point.  However, once the queue size 
> reaches maxOutstandingMessages, the broker (the session dispatcher thread for 
> the given topic) will block on the PooledExecutor.execute method.  This now 
> prohibits any further message delivery for the given topic to the properly 
> behaving consumer.
> I'm wondering why the "waitWhenBlocked" policy on the PooledExecutor is used? 
>  These are NON_PERSISTENT messages, so what would be the problem with 
> potentially using one of the discard policies, such as 
> "discardOldestWhenBlocked" (or "discardWhenBlocked")?  Seems like one of 
> these two policies should be used by default, and the "waitWhenBlocked" would 
> be a configurable option.  Our preference would be to use 
> "discardOldestWhenBlocked".  I changed TcpTransportServerChannel.java to use 
> "discardOldestWhenBlocked", which gave us our desired functionality.
> From our point of view, having the broker affect all consumers on behalf of 
> one misbehaving one is bad.  So, what might we be missing with regards to 
> using "discardOldestWhenBlocked"?

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