Почему объект сеанса JMS не является потокобезопасным?

Почему спецификации JMS разработаны таким образом, чтобы объект сеанса не мог использоваться параллельными потоками, когда объект подключения, из которого создаются сеансы, является поточно-ориентированным (Shared by thread)?

2 ответа

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

JMS 2.0 Spec

страница 25

Есть две причины для ограничения одновременного доступа к сеансам.

Во-первых, сеансы - это объект JMS, который поддерживает транзакции. Очень трудно реализовать многопоточные транзакции.

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

Кроме того, если сеанс был настроен с несколькими асинхронными потребителями, важно, чтобы клиент не был вынужден обрабатывать случай, когда эти отдельные потребители выполняются одновременно. Эти ограничения упрощают использование JMS для типичных клиентов. Более сложные клиенты могут получить желаемый параллелизм, используя несколько сеансов. В классическом API и специфичных для домена API это означает использование нескольких объектов сеанса. В упрощенном API это означает использование нескольких объектов JMSContext.

Другие вопросы по тегам