К сожалению, документы JMS часто пишутся не так четко или точно, как нам хотелось бы: o (
Но, читая спецификацию, я теперь совершенно уверен, что вам не следует обращаться к сеансу из других потоков,даже если вы гарантируете, что нет одновременного доступа. Бит javadoc, который качал его для меня, был:
Как только соединение установлено, любой сеанс с зарегистрированным прослушивателем (ями) сообщений выделяетсяпоток управления, который доставляет ему сообщения. Клиентский код ошибочно использует этот сеанс или любые составляющие его объекты из другого потока управления. Единственное исключение - использование метода закрытия сеанса или соединения.
Обратите внимание на четкое использование 'thread of control' и выделение 'close ()' в качестве единственного исключения.
Кажется, они говорят, что даже если вы используетеасинхронное использование сообщений (т.е. setMessageListener) - это означает, что вам перезвонят в другой поток, созданный JMS для получения сообщениймудрецы - вам никогда не разрешается снова касаться сеанса или связанных объектов из любого другого потока, потому что сеанс теперь «выделен» потоку доставки JMS.Например, я предполагаю, что это означает, что вы даже не можете вызвать message.acknowledge () из другого потока.
Сказав это, я только заметил, что мы не соблюдаем это ограничение и еще не замечали каких-либо побочных эффектов (используя SonicMQ).Но, конечно, если вы не подчиняетесь стандарту, все ставки выключены, поэтому я думаю, что нам нужно соблюдать правило 1-потока 1-сессии, чтобы оставаться в безопасности.