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