On 28 Mar 2008, at 09:42, Ramit Arora wrote:


Hi All,
I have a situation where I have to consume persisent messages from many non-durable subscribers. My publishers push persistent messages to a topic, which are consumed asynchronously by non-durable subscribers. I am using the
AMQ Persistence Adapter & CLIENT_ACKNOWLEDGE. If I kill a non-durable
subscriber & bring it up again, some messages are lost, which is expected.
But consider the following case:
1. Start a publisher publishing persistent messages to a topic.
2. Start a non-durable subscriber which is slow compared to the publisher. 3. Kill the broker when 100 messages have been published but only 50 have
been consumed.
4. Since the publisher & subscriber are failover clients, they wait for the
broker to come up again.
5. Restart the broker.
6. Try to get the remaining 50 messages to the non-durable subscriber.

Step 6 does not work in both 5.0 & the latest 5.1 snapshot. Shouldn't the
remaining 50 messages be delivered? The JMS spec says:
"A JMS provider must deliver a PERSISTENT message once-and-only- once. This means a JMS provider failure must not cause it to be lost, and it must not
deliver it twice. PERSISTENT (once-and-only-once) and NON_PERSISTENT
(at-most-once)
message delivery are a way for a JMS client to select between delivery
techniques that may lose a messages if a JMS provider dies and those which take extra effort to insure that messages can survive such a failure. There
is
typically a performance/reliability trade-off implied by this choice. When a client selects the NON_PERSISTENT delivery mode, it is indicating that it values performance over reliability; a selection of PERSISTENT reverses the
requested trade-off."

Queues donot suffer from this problem. Please let me know if I am missing
something.

Thanks,
Ramit


--
View this message in context: 
http://www.nabble.com/Consuming-persistent-messages-from-a-non-durable-subscriber-tp16348721s2354p16348721.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.



Message delivery by default is persistent - but there is a fundamental difference in the contract between queues and topics:
Queue messages are always persisted
Topic messages are persisted if there exists a durable subscriber for that topic.
You can get around this by using virtual destinations - see here: 
http://activemq.apache.org/virtual-destinations.html

cheers,

Rob

Reply via email to