2014-01-29 1 views
2

В моем приложении у меня есть очередь (HornetQ), настроенная на JBoss 7 AS. Я использовал Spring, чтобы выполнить некоторую работу после получения сообщений (сохранение значений в базе данных и т. Д.), А затем потребитель совершает сеанс JMS. Иногда, когда при обработке сообщения возникает исключение, исключение потребителя прерывается внезапно. И сообщение остается в состоянии «в доставке». В моей рабочей очереди около 30 сообщений.
Я попытался перезагрузить пользователя, но состояние этих сообщений не изменилось. Единственный способ удалить эти сообщения из очереди - это перезапустить очередь. Но прежде чем сделать это, я хочу, чтобы прочитать эти сообщения, чтобы , что они могут быть исправлены и отправлены в очередь снова для обработки. Я пробовал использовать QueueBrowser для их чтения, но он не работает. Я много искал в Google, но не мог найти любой способ прочитать эти сообщения.Изменение состояния сообщений, которые находятся «в доставке»

Я использую транзакционную сессию, где когда-то сообщение обрабатывается, я звоню:

session.commit(); 

Это посылает подтверждение. Я реализую

org.springframework.jms.listener.SessionAwareMessageListener 

, чтобы получать сообщения весной, а затем обработать их. При обработке сообщений я использую весеннюю партию для вставки некоторых данных в базу данных. Для суставного корпуса он пытается вставить слишком большие данные, чтобы их вставляли в столбец. Он выдает исключение, и транзакция прерывается.

Теперь я установил, что мой производитель и потребитель не имеют таких данных, чтобы этот случай не повторился.

Но мой вопрос в том, что касается сообщений о состоянии 30 "в доставке", которые находятся в моей производственной очереди? Я хочу их прочитать, чтобы они могли быть исправлены и отправлены в очередь для обработки. Есть ли способ прочитать эти сообщения? Как только я узнаю их содержимое, я могу перезапустить очередь и отправить их снова (после их исправления).

Поблагодарив вас в ожидании,

Suvarna

ответ

1

Все зависит от режима транзакции, которую вы используете.

, например, если вы используете транзакции:

// session here is a TX Session 
    MessageConsumer cons = session.createConsumer(someQueue); 
    session.start(); 
    Message msg = consumer.receive... 
    session.rollback(); // this will make the messages to be redelivered 

если вы используете нон TX:

// session here is auto-ack 
    MessageConsumer cons = session.createConsumer(someQueue); 
    session.start(); 
    // this means the message is ACKed as we receive, doing autoACK 
    Message msg = consumer.receive... 

    //however the consumer here could have a buffer from the server... 
    // if you are not using the consumer any longer.. close it 
    consumer.close(); // this will release messages on the client buffer 

В качестве альтернативы можно также установить consumerWindowSize = 0 на ConnectionFactory.

Это на 2.2.5, но он никогда не изменял на следующих релизах:

http://docs.jboss.org/hornetq/2.2.5.Final/user-manual/en/html/flow-control.html

Я "м, охватывающий все возможности я мог думать о, так как вы не специфичен о том, как вы уничтожаете ,Если вы предоставите мне более подробно, то я смогу сказать вам больше:

+0

Привет Clebert, Большое спасибо за быстрый и подробный ответ. Это помогло. Я редактировал мой вопрос, имея более подробную информацию. Не могли бы вы помочь? – SNJoshi

+0

Я уже ответил на это .. вам нужно либо откат отката, когда ваша вещь терпит неудачу, либо закрывает ее. если вы оставите его открытым, он останется таким. –

+0

Еще раз спасибо за ответ. Но я не понимаю, я не могу прочитать 30 сообщений о состоянии доставки. Потребитель считывает и обрабатывает новые сообщения, добавленные в очередь, но старые сообщения не читаются. Я попытался создать еще одного потребителя , но эти старые сообщения, похоже, застряли. :( – SNJoshi

0

Вы действительно можете читать сообщения в очереди с помощью JMX (с, например, JConsole)

В JBoss AS7 вы можете это сделать следующее путь: MBeans> jboss.as> Сообщения> По умолчанию> myJmsQueue> Операции

listMessagesAsJson

[править]

С 2.3.0 У вас есть специальный метод для этого конкретного случая:

listDeliveringMessages

См https://issues.jboss.org/browse/HORNETQ-763

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