Threads и Jms Transaction - PullRequest
       4

Threads и Jms Transaction

1 голос
/ 03 августа 2010

Я застрял в следующем сценарии. Пожалуйста, дайте мне совет по этому вопросу

есть входящая очередь Основной поток запущен (мы не используем JMS Listener) и выбрать сообщение из очереди и обработать сообщение и запустите другую подпотоку для обработки снова.

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

Я прошелся по JMS Spring Reference, но они разграничивают транзакцию только для слушателей JMS

Итак, как я могу применить концепцию транзакции в моем сценарии

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

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Я думаю, что вы находитесь в трудной территории здесь. Мне кажется, что наличие двух потоков, работающих в одной транзакции, чревато условиями гонки и другими опасностями - на самом деле я даже не уверен, что это возможно. API транзакций JTA, с которым я знаком, использует однозначные сопоставления потоков и транзакций.

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

Затем вы обнаружите, что фактически заново изобрели стандартные подходы Java. Так почему бы просто не использовать MDB?

0 голосов
/ 03 августа 2010

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

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

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

Иначе goolge для Message Driven Bean и посмотрите, поддерживает ли Spring какую-то похожую концепцию.

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