2013-06-01 3 views
2

Мы используем JTA для управления глобальными транзакциями в контексте сервлета. Кроме того, некоторые из потоков сервлетов вызывают асинхронные компоненты. В настоящее время я разработал его таким образом, чтобы асинхронный компонент (Work Manager) получил свою собственную транзакцию.Может ли глобальная транзакция охватывать несколько потоков?

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

Сервер приложений - это WebSphere, и мы НЕ используем Spring.

Ваш отзыв оценен.

ответ

2

Использование той же транзакции как для потока сервлета, так и для асинхронного рабочего конфликтует как-то с общей идеей обмена сообщениями. Обмен сообщениями - это средство для развязки, тогда как транзакция держит вещи плотно вместе.

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

Что касается двух потоков, участвующих в одной транзакции XA, возможно, это не поддерживается, посмотрите here. Даже если бы это сработало, было бы неприятно обмениваться ресурсами по потоку, вообще говоря (файловые дескрипторы, соединения, транзакции).

Что касается потока сервлета, то ли он блокируется: я никогда не пробовал его (по вышеуказанным причинам), но я предполагаю, что он не блокируется: вам придется подождать/опросить ваших асинхронных работников, пока они не будут завершено (или не выполнено). В противном случае сервлет просто достигает вашего оператора фиксации.

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