2014-10-31 4 views
0

Я довольно новичок в AMQ, я понимаю концепцию создания сообщения, отправки его в очередь и использования его асинхронно.Остановить AMQ MessageListenerAdapter при исключении

Мои основные конфигурации Spring являются следующие

@Bean 
    public DefaultMessageListenerContainer listenerContainer(
      MessageListenerAdapter adapter) { 
     DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer(); 
     dmlc.setConnectionFactory(connectionFactory()); 
     dmlc.setMessageListener(adapter); 
     dmlc.setDestinationName("myQueue"); 
     dmlc.setConcurrentConsumers(5); 
     return dmlc; 
    } 

@Bean 
MessageListenerAdapter adapter(MyClass myClass) { 
    MessageListenerAdapter messageListener = new MessageListenerAdapter(
      myClass); 
    messageListener.setDefaultListenerMethod("myMethod"); 
    return messageListener; 
} 

@Bean 
public JmsTemplate jmsTemplate() { 
    JmsTemplate jt = new JmsTemplate(connectionFactory()); 
    return jt; 
} 

У меня нет проблемы с отправкой вещи в очередь с jmsTemplate.convertAndSend(), а затем ПОЛУЧАТЬ их MyClass # MyMethod

Моя проблема: Мне нужно, чтобы слушатель остановил потребление сообщений, если выбрано исключение. Обычно исключение скажет мне, что удаленный сайт отключен, и попробуйте позже. Если я не остановлю все эти сообщения, они в основном потеряются. Хотелось бы сохранить очередь до тех пор, пока я не смогу отправить ее снова.

Возможно ли это?

ответ

0

Если вы используете простые транзакции JMS, вы можете избежать потери сообщений в случае исключения и не беспокоиться о прекращении и запуске вашего слушателя.

Here - хорошее резюме о том, как принять решение о типе подтверждения, которое вам нужно. Транзакции требуют немного более сложной настройки, чем используемая вами автоакция. Вы можете найти хороший пример, не связанный с пружиной, чтобы установить это в ответе here.

+0

Я только что узнал, что я был на авто-ack немного назад. Пробовал Session.CLIENT_ACKNOWLEDGE, который говорит, что в очереди останутся неудавшиеся сообщения, но он застрял в одном сообщении до тех пор, пока не будет доставлен, никаких мыслей? – javaNoober

+0

Вам необходимо установить политику доставки. http://activemq.apache.org/redelivery-policy.html CLIENT_ACK не подходят для всех ситуаций, хотя существуют и другие исключения, которые не будут обрабатываться. В этой документации есть хорошее объяснение того, что каждый режим предоставляет по умолчанию http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractMessageListenerContainer.html –

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