2012-05-07 3 views
1

Как получить несколько сообщений очереди в транзакции и в какой-то момент отката, чтобы другие программы, которые потребляют сообщения из этой очереди, могут получать сообщения?Откат полученных сообщений jms

им пытается сделать это как-то вроде этого:

ObjectMessage obj = (objectMessage) consumer.receive(); 

ObjectMessage obj2 = (ObjectMessage) consumer.receive(10000); 
if(obj2 == null) session.rollback(); //if we haven't received thesecond message after 10  second, also the first message should be rolled back so other consumerprograms can take it. 

ответ

1

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

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

О отправки назад сообщение. Откат/пересылка сообщений в JMS-брокер зависит от режима подтверждения.

Если подтверждение транзакции на основе затем использовать

session.rollback(); 

другие разумно использовать следующие

session.recover(); 

Он вернется все неподтвержденные сообщения обратно брокеру JMS.

За исключением сообщения режима режима подтверждения AUTO с брокером до тех пор, пока вы не подтвердите или не зафиксируете сеанс на основе подтверждения.

Итак, когда вы закончите успешную обработку сообщений, подтвердите это. Если у msg-обработки есть ошибка/исключение, откат/восстановление для отправки. Если вы не хотите обрабатывать неудавшиеся сообщения (пусть это будет обработка времени/не обрабатывается в заданное время), то просто подтвердите сообщение и запишите ошибку. Нет никаких ограничений на отправку сообщения между ними.

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

+0

привет, спасибо. Я не хочу распространять сообщение всем потребителям. «Сервер» отправляет сообщения в очередь. Программа потребляет эти сообщения, и если она ждет более 10 секунд для нового сообщения, она должна записать полученные сообщения, чтобы другие потребители могли ее получить. Не откат верный путь? – Moonlit

+0

отредактированный ответ. надеюсь, это поможет. – neo

+0

Сообщения похожи на Компонент автомобиля (двигатель, шина и шасси). клиенты расходуют сообщения и строят с ними автомобиль. теперь говорят, что клиент уже получил (в сеансе незафиксированной транзакции) anengine, шасси и 3 шины), но нет нового сообщения о шинах ... в этом случае я хочу, чтобы клиент написал все свои компоненты (3 шины, двигатель и шасси) в очередь, так что другой клиент, ожидающий сказать шасси, может завершить его машину. поэтому я не хочу писать обратно на сбой, но на тайм-аут (если через 30 секунд не приходит новый компонент, напишите обратно) – Moonlit

0

Непонятно, почему программа хочет откат. Не способен ли обработать полученное сообщение? почему другим потребителям понадобится одно и то же сообщение?

Вы также можете использовать режим подтверждения сообщения clientAcknowledge для «обратной записи» полученного сообщения. В этом режиме вы не делаете message.acknowledge() для полученного сообщения.

+0

'javax.jms.Message.confirm() 'немного вводит в заблуждение, потому что, вызывая« подтверждение »на одном клиенте, клиент подтверждает * все * сообщения, потребляемые сеансом, что сообщение было доставлено - невозможно подтвердить только выбранное сообщение. –

+0

Правда. Однако некоторые клиенты JMS предоставляют функцию подтверждения сообщения. Я думаю, что ActiveMQ делает это – Shashi

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