activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "John Baker (Issue Comment Edited) (JIRA)" <j...@apache.org>
Subject [jira] [Issue Comment Edited] (AMQ-3285) ActiveMQXAConnectionFactory does not respect various parameters for redelivery policy
Date Wed, 18 Apr 2012 15:24:40 GMT

    [ https://issues.apache.org/jira/browse/AMQ-3285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13256638#comment-13256638
] 

John Baker edited comment on AMQ-3285 at 4/18/12 3:24 PM:
----------------------------------------------------------

Hello,

I've got some information to add. I've debugged this and find the following code being (correctly?)
executed in ActiveMQMessageConsumer when a message is rolled back:

{code}
                    if (redeliveryDelay > 0 && !unconsumedMessages.isClosed())
{
                        // Start up the delivery again a little later.
                        scheduler.executeAfterDelay(new Runnable() {
                            public void run() {
                                try {
                                    if (started.get()) {
                                        start();
                                    }
                                } catch (JMSException e) {
                                    session.connection.onAsyncException(e);
                                }
                            }
                        }, redeliveryDelay);
{code}

The value of redeliveryDelay (in ms) is correct. However, the "problem" is the Spring DefaultMessageListener,
which asks ActiveMQ for another message and it gives back the message waiting for redelivery.
I can see that the thread has the same ID in the debugger, so I think the problem is better
described as:

"ActiveMQ does not remove the message due for redelivery from the queue, but gives it out
next time it's asked to do so. After X retries, it's moved to the DLQ and hence the listener
will not receive it again when it asks for the next message".

This is a very serious problem.


J
                
      was (Author: jmbaker):
    Hello,

I've got some information to add. I've debugged this and find the following code being (correctly?)
executed in ActiveMQMessageConsumer when a message is rolled back:

                    if (redeliveryDelay > 0 && !unconsumedMessages.isClosed())
{
                        // Start up the delivery again a little later.
                        scheduler.executeAfterDelay(new Runnable() {
                            public void run() {
                                try {
                                    if (started.get()) {
                                        start();
                                    }
                                } catch (JMSException e) {
                                    session.connection.onAsyncException(e);
                                }
                            }
                        }, redeliveryDelay);

The value of redeliveryDelay (in ms) is correct. However, the "problem" is the Spring DefaultMessageListener,
which asks ActiveMQ for another message and it gives back the message waiting for redelivery.
I can see that the thread has the same ID in the debugger, so I think the problem is better
described as:

"ActiveMQ does not remove the message due for redelivery from the queue, but gives it out
next time it's asked to do so. After X retries, it's moved to the DLQ and hence the listener
will not receive it again when it asks for the next message".

This is a very serious problem.


J
                  
> ActiveMQXAConnectionFactory does not respect various parameters for redelivery policy
> -------------------------------------------------------------------------------------
>
>                 Key: AMQ-3285
>                 URL: https://issues.apache.org/jira/browse/AMQ-3285
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: JMS client
>    Affects Versions: 5.4.0, 5.4.2, 5.5.0
>            Reporter: Jaskirat Bhatia
>         Attachments: activemq-test-0.1-project.zip, activemq-test.zip
>
>
> I tried to add these following parameters to my redelivery policy and activeMQ is not
respecting any of them except maximumRedelivery
> <spring:bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
> 			<spring:property name="maximumRedeliveries" value="5"/>
> 			<spring:property name="initialRedeliveryDelay" value="5000"/>
> 						<spring:property name="redeliveryDelay" value="2000"/>
> 			<spring:property name="useExponentialBackOff" value="true"/>
> 			<spring:property name="backOffMultiplier" value="2"/>
> 		</spring:bean>
> I have attached the project which I took from https://issues.apache.org/jira/browse/AMQ-1593
and added the above parameter to my brokerURL:
> tcp://localhost:5000?jms.redeliveryPolicy.maximumRedeliveries=3&jms.redeliveryPolicy.initialRedeliveryDelay=10000&jms.redeliveryPolicy.deliveryDelay=10000&jms.redeliveryPolicy.useExponentialBackOff=true&jms.redeliveryPolicy.backOffMultiplier=2
> This test case will show you that none of the parameters like initiaRedeliveryDelay etc
will take effect, except maxRedeliveries

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Mime
View raw message