2015-02-11 3 views
3

Ниже приведена конфигурация, которую я использую. Сообщения без ошибок, отлично работают от обмена до очереди с конверсией, которую прослушивает слушатель, это замечательно. То, что я хочу , хочу, чтобы произошел с ошибочными сообщениями, заключается в том, что когда я выкидываю AmqpRejectAndDontRequeueException, «rabbitQueue» отправит сообщение на его мертвую буквенную бирку и попадет в «rabbitErrorQueue». Однако нет никакой активности в обмене мертвой буквой или очереди. Может ли кто-нибудь увидеть, что я здесь делаю неправильно?RabbitMQ Конфигурация мертвой буквы Spring не работает

<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> 
+0

Вы можете поделиться тем, откуда вы выбрали 'AmqpRejectAndDontRequeueException'? –

+0

@ArtemBilan Я делаю исключение от потребителя «RabbitMQExampleConsumer». Если что-то пойдет не так, что для тестирования, я убеждаюсь, что он бросает его каждый раз. – Felix

+0

Хорошо. Как это работает для вас, если вы измените «fanout-exchange id =« fanoutExchange »' на 'direct-exchange'? –

ответ

3

Попробуйте добавить явное x-dead-letter-routing-key - в противном случае один и тот же ключ, что и исходный маршрут используется - и там нет ключа маршрутизации необходимо для обмена ветвления.

Смежные вопросы