You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Veit Guna (JIRA)" <ji...@apache.org> on 2008/07/09 08:47:00 UTC

[jira] Issue Comment Edited: (AMQ-1847) Redelivery on a failure doesn't respect the initialRedeliveryDelay on the first attempt.

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

vguna edited comment on AMQ-1847 at 7/8/08 11:45 PM:
---------------------------------------------------------

Thanks Claus.

Sure, here's my applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:amq="http://activemq.apache.org/schema/core"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.1.0.xsd">
	
	<!--  ActiveMQ destinations to use  -->
	<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue" autowire="constructor">
		<constructor-arg value="NEW" />
	</bean>

	<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL">
			<value>discovery:multicast://test</value>
		</property>
		<property name="redeliveryPolicy">
			<ref local="redeliveryPolicy" />
		</property>
	</bean>
	<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
		<property name="initialRedeliveryDelay" value="10000" />
		<property name="maximumRedeliveries" value="4" />
		<property name="useExponentialBackOff" value="true" />
		<property name="backOffMultiplier" value="2" />
	</bean>
		
	<!-- Spring JMS Template -->
	<bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory">
			<!-- lets wrap in a pool to avoid creating a connection per send -->
			<bean class="org.springframework.jms.connection.SingleConnectionFactory">
				<property name="targetConnectionFactory">
					<ref local="jmsFactory" />
				</property>
			</bean>
		</property>
	</bean>
	
	<bean id="consumerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="jmsFactory"/>
	</bean>
	

	<!-- and this is the message listener container -->
	<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="jmsFactory"/>
		<property name="destination" ref="destination"/>
		<property name="messageListener" ref="messageListener" />
		<property name="concurrentConsumers" value="100" />
		<property name="maxMessagesPerTask" value="1" />
		<property name="sessionTransacted" value="true" />		
	</bean>
	<!-- this is the Message Driven POJO (MDP) -->
	<bean id="messageListener" class="com.foo.bar.jms.Consumer" />	
	
</beans>


The messageListener will create a RuntimeException on the onMessage method to produce an error. The first redelivery attempt occurs immediately, without respect to the initialRedeliveryDelay.


      was (Author: vguna):
    Thanks Claus.

Sure, here's my applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans 
	xmlns="http://www.springframework.org/schema/beans" 
	xmlns:amq="http://activemq.apache.org/schema/core"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.1.0.xsd">
	
	<!--  ActiveMQ destinations to use  -->
	<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue" autowire="constructor">
		<constructor-arg value="NEW" />
	</bean>

	<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL">
			<value>discovery:multicast://test</value>
		</property>
		<property name="redeliveryPolicy">
			<ref local="redeliveryPolicy" />
		</property>
	</bean>
	<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
		<property name="initialRedeliveryDelay" value="10000" />
		<property name="maximumRedeliveries" value="4" />
		<property name="useExponentialBackOff" value="true" />
		<property name="backOffMultiplier" value="2" />
	</bean>
		
	<!-- Spring JMS Template -->
	<bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory">
			<!-- lets wrap in a pool to avoid creating a connection per send -->
			<bean class="org.springframework.jms.connection.SingleConnectionFactory">
				<property name="targetConnectionFactory">
					<ref local="jmsFactory" />
				</property>
			</bean>
		</property>
	</bean>
	
	<bean id="consumerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="jmsFactory"/>
	</bean>
	

	<!-- and this is the message listener container -->
	<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="jmsFactory"/>
		<property name="destination" ref="destination"/>
		<property name="messageListener" ref="messageListener" />
		<property name="concurrentConsumers" value="100" />
		<property name="maxMessagesPerTask" value="1" />
		<property name="sessionTransacted" value="true" />		
	</bean>
	<!-- this is the Message Driven POJO (MDP) -->
	<bean id="messageListener" class="com.globolog.asserver.jms.Consumer" />	
	
</beans>


The messageListener will create a RuntimeException on the onMessage method to produce an error. The first redelivery attempt occurs immediately, without respect to the initialRedeliveryDelay.

  
> Redelivery on a failure doesn't respect the initialRedeliveryDelay on the first attempt.
> ----------------------------------------------------------------------------------------
>
>                 Key: AMQ-1847
>                 URL: https://issues.apache.org/activemq/browse/AMQ-1847
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.1.0
>         Environment: Linux, ActiveMQ 5.1, Spring 2.5.x with transacted DefaultMessageListenerContainer
>            Reporter: Veit Guna
>
> Hi.
> I'm using ActiveMQ 5.1 together with Spring's DefaultMessageListenerContainer to enable MDPs. I'm using the redeliveryPolicy to enable redelivery on failures during consumption of a message. ActiveMQ configuration looks like this:
>     <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
>         <route errorHandlerRef="deadLetterErrorHandler">
>                 <from uri="activemq:NEW" />
>         </route>
>     </camelContext>
> <bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
>     <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
> </bean>
> <bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.RedeliveryPolicy">
>     <property name="maximumRedeliveries" value="4"/>
>     <property name="initialRedeliveryDelay" value="30000"/>
>     <property name="useExponentialBackOff" value="true"/>
>     <property name="backOffMultiplier" value="2" />
> </bean>
> Now if a failure occurs, the configured delay isn't used on the first redelivery attempt. Instead redelivery takes place immediately after the failure occured. This sounds odd to me, since the property is even called initialRedeliveryDelay :). I know that maybe this was caused due to the following issue:
> https://issues.apache.org/activemq/browse/AMQ-1032
> In my opinion immediately redelivery isn't very useful in most cases. If a failure occurs, it won't be fixed some ms later :). So my suggestion is (in respect to AMQ-1032) to have two options:
> initialRedeliveryDelay
> redeliveryDelay
> So both configurations would be possible. For AMQ-1032 just configure initialRedeliveryDelay to 0. Otherwise just take the redeliveryDelay as initialRedeliveryDelay to get what I want :).
> Does this make sense?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.