Felix
Felix

Reputation: 699

RabbitMQ Spring dead letter config not working

Below is the configuration I'm using. Messages with no errors, work fine from exchange to queue with conversion picked up by the listener, its great. What I am wanting to happen with erroneous messages is that when I throw a AmqpRejectAndDontRequeueException, "rabbitQueue" will forward the message to it's dead letter exchange and end up in the "rabbitErrorQueue." There's no activity on the dead letter exchange or queue though. Can anyone see what I'm doing wrong here?

    <beans
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/rabbit
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="clientConnectionFactory"
          class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean">
    </bean>

    <rabbit:connection-factory
            id="rabbitConnectionFactory"
            connection-factory="clientConnectionFactory"
            host="${rabbit.broker.url}"
            port="${rabbit.broker.port}"
            username="${rabbit.username}"
            password="${rabbit.password}"
            publisher-confirms="true"/>

    <rabbit:admin connection-factory="rabbitConnectionFactory" />

    <rabbit:template id="rabbitTemplate"
                     connection-factory="rabbitConnectionFactory"
                     exchange="${rabbit.exchange.name}"
                     message-converter="messageConverter"
                     queue="${rabbit.queue.name}" >
    </rabbit:template>


    <rabbit:queue id="rabbitQueue" name="${rabbit.queue.name}" >
        <rabbit:queue-arguments>
            <entry key="x-dead-letter-exchange" value="${rabbit.dead.letter.exchange.name}"/>
            <entry key="x-message-ttl" value="10000" value-type="java.lang.Long"/>
        </rabbit:queue-arguments>
    </rabbit:queue>

    <rabbit:queue id="rabbitErrorQueue" name="${rabbit.dead.letter.queue.name}" />

    <rabbit:fanout-exchange id="fanoutExchange" name="${rabbit.exchange.name}">
        <rabbit:bindings>
            <rabbit:binding queue="rabbitQueue" />
        </rabbit:bindings>
    </rabbit:fanout-exchange>


    <rabbit:direct-exchange id="directErrorExchange" name="${rabbit.dead.letter.exchange.name}">
        <rabbit:bindings>
            <rabbit:binding key="${rabbit.queue.name}" queue="rabbitErrorQueue" />
        </rabbit:bindings>
    </rabbit:direct-exchange>

    <bean id="messageConverter" class="com.example.RabbitMQExampleEventMessageConverter"/>

    <bean id="rabbitMQExampleConsumer" class="com.example.consumer.RabbitMQExampleConsumer">
        <constructor-arg name="eventProcessor" ref="userEventProcessor" />
    </bean>

    <rabbit:listener-container connection-factory="rabbitConnectionFactory" message-converter="messageConverter">
        <rabbit:listener queues="${rabbit.queue.name}" ref="rabbitMQExampleConsumer" method="onMessage" />
    </rabbit:listener-container>
</beans>

Upvotes: 3

Views: 2733

Answers (1)

Gary Russell
Gary Russell

Reputation: 174789

Try adding an explicit x-dead-letter-routing-key - otherwise the same key as the original route is used - and there's no routing key needed for a fanout exchange.

Upvotes: 3

Related Questions