Спецификация для сеансов JMS предупреждает, что объекты/экземпляры сеанса должны использоваться только в потоке, в котором они созданы , когда экземпляры MessageListener зарегистрированы на сеансе. Однако при использовании объектов MessageConsumer (только) он ничего не говорит о том, чтобы быть потокобезопасным или, точнее, «связанным с потоком».JMS: Можно ли читать через MessageConsumer.receive() в одном потоке, а затем вызвать Session.commit() из другого потока?
http://docs.oracle.com/javaee/1.3/api/javax/jms/Session.html
(по «нити переплета», я имею в виду, что объект должен быть использован только, когда-либо, на определенную тему, а не просто, что это небезопасно использовать его на нескольких потоков без синхронизации или другой координации)
ответ на этот вопрос также предполагает, что Сессии потокобезопасны переплет: Relationship between JMS connections, sessions, and producers/consumers
Однако, может или не может быть некоторыми предположениями автор делает, и вопрос также больше о написании сообщений чем примерно чтение их.
Кто-нибудь знает, можете ли вы прочитать сообщение в сеансе в одном потоке, а затем связать другой поток с сообщением и выполнить фиксацию/откат для сообщения (с сеансом) в этом другом потоке? Только транзакция (или откат) будет вызвана против сеанса из потока обработки - никакие другие вызовы не будут сделаны в цепочке Connection/Session/MessageConsumer/Message. Кроме того, сеанс не будет использоваться для повторного чтения до тех пор, пока не произойдет фиксация/откат. кажется,
следующие вопросы S/O тесно связаны между собой, но не делать не удовлетворительно решить, что я предлагаю:
Reason for a JMS Session object to be used in a single threaded context
В то время как я хотел бы использовать сессию на несколько потоков, никогда не будет перекрывающихся запросов/транзакций сообщений.
Я пытаюсь избежать дальнейшей реорганизации существующего кода, поэтому я рассматриваю возможность сделать что-то немного странное, а не иметь сеанс для каждого рабочего потока.
-
-
- редактировать (26 июля) - - -
-
Этот вопрос, Using a JMS Session from different threads, кажется, предполагает, что это нормально делать синхронизированные операции с сеансом на разных потоках, но я не уверен, какая версия спецификации указана.
Что касается вашего обновления (26 июля), это то, что я хотел бы указать на мою вторую цитату: вам нужно синхронизировать каждый метод, кроме 'close' , Таким образом, хотя вы сохраняете 10 мс (не создавая отдельный сеанс) вначале, вам придется тратить время на каждый вызов синхронизированного метода позже. Если у вас еще нет такой синхронизации, вы должны в любом случае реорганизовать свой код (и это, возможно, подвержено ошибкам). Возможно, именно по этой причине рекомендация не должна делать это таким образом. – Beryllium