2010-09-22 2 views
1

Я работаю над многопоточным JMS-приемником и кодом издателя. XML-сообщение получено из очереди, вызывается хранимые процедуры (выполняется 70 секунд для выполнения) и ответ отправляется в тему в течение 90 секунд. Мне нужно обработать условие, когда брокер не работает. т. Е. Условие, в котором сообщения принимаются из очереди и обрабатываются в java, в то же время обе очереди и тема будут недоступны. Затем, как обрабатывать те сообщения, которые не находятся в очереди, а не отправлять в тему, но находятся в java-памяти? Возможны различные варианты:Многопоточное приложение JMS

1.Чтобы использовать CLIENT_ACKNOWLEDGE 2.Выберите отдельный код издателя из кода получателя. 3.To есть утилита ошибка, которая будет принимать сообщения из журнала и обработать их и отправить в тему (не менее предпочтительно)

Пожалуйста, предложите мне правильный вариант

ответ

3

Используйте транзакционной сеанс. Расходуйте сообщение и отправьте ответ в одной единице работы и явным образом вызовите COMMIT после отправки ответа. Затем, если брокер умирает во время транзакции, входное сообщение будет отброшено назад. Если вы включите обновление БД в двухфазную скоординированную транзакцию, то он также может быть откат брокера. Это требует, чтобы потребитель и ответчик находились в одном потоке, потому что JMS просматривает сеансы на поток, но вы можете иметь несколько потоков, выполняющих сеансы параллельно.

Помните, что при открытии многих транзакций на 90 секунд может потребоваться некоторая настройка на стороне брокера.

+1

Я считаю, что если сеанс был транслирован, режим подтверждения (например, CLIENT_ACKNOWLEDGE) игнорируется :) –

+0

Да, я думаю с моей шляпой WMQ. Обычно мы устанавливаем CLIENT_ACKNOWLEDGE в управляемом объекте, потому что он должен быть установлен на * something *, и это указывает на то, что кто-либо читает его, что код должен явно передать. Однако с точки зрения JMS это ничего не делает. Я отредактировал это из моего ответа. +1 за хороший улов. –

+0

Спасибо большое! если вместо connection.createSession (false, javax.jms.Session.CLIENT_ACKNOWLEDGE), я буду использовать connection.createSession (true, javax.jms.Session.CLIENT_ACKNOWLEDGE); то сеанс транслируется, а режим подтверждения игнорируется. После отправки ответа на тему я передам() сеанс. Мой вопрос заключается в том, что если сеанс откатывается в случае какого-либо исключения (например, брокера вниз и ответ не может быть отправлен в тему), тогда это сообщение все еще существует в очереди. Если брокер возвращается через 10 минут, то это сообщение все еще находится в очереди? – Jyoti

1

Одним из решений является использование db для промежуточной хранимой процедуры. Таким образом, шаги были бы:

1. Consume Message from Queue and store into db and use Client_Acknowledge. 
2. Run stored procedures on the consumed message. 
3. Once the procedure is over, send message from db to the topic. 
4. Delete message once acknowledgement is recieved. 

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

Ну, я не уверен, является ли это лучшей альтернативой и вы хотите увидеть, как сообщество отвечает на этот вопрос.

+0

Что такое db? база данных ? – Jyoti

+0

Да ... Я имею в виду сообщение магазина в базе данных. –

+0

сохранение сообщения в базе данных не представляется возможным, необходимо вызвать хранимую процедуру только из java (некоторые ограничения базы данных) – Jyoti

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