Какова точная природа небезопасности потоков сеанса JMS и связанных с ним конструкций (сообщение, потребитель, производитель и т. д.)? Просто доступ к ним должен быть сериализован, или доступ ограничен только создающим потоком?
Или это гибридный случай, когда создание можно отличить от использования, то есть их может создавать только один поток, а затем другой поток может быть единственным, кто их использует? Эта последняя возможность, казалось бы, противоречит утверждению в этом ответе, в котором говорится: "На самом деле вы не должны использовать его из двух разных потоков. тоже в разное время!"
Но рассмотрим "Серверная сторона " пример кода из документации ActiveMQ.
Класс Server имеет элементы данных с именами session (типа Session) и replyProducer (типа MessageProducer), которые
- создается в одном потоке: в зависимости от того, какой из них вызывает конструктор Server() и тем самым вызывает метод setupMessageQueueConsumer() с фактическими вызовами создания; и
- используется в другом потоке: в зависимости от того, какой из них вызывает асинхронный обратный вызов onMessage().
(На самом деле член сеанса используется также в обоих потоках: в одном для создания члена replyProducer, а в другом — для создания сообщения.)
Этот официальный пример кода работает случайно или по замыслу? Реально ли создать такие объекты в одном потоке, а затем организовать их использование другим потоком?
(Примечание: в других инфраструктурах обмена сообщениями, таких как Solace, можно указать поток, в котором происходят обратные вызовы, что может быть использовано для обхода этого ограничения «сродства потоков объектов», но такой вызов API не определен в JMS, поскольку насколько я знаю.)