дождитесь, пока товар будет помечен как оплаченный другим потоком, используя nhibernate - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть относительно простая проблема, которую я не могу решить без большого количества уродливых обходных путей. По сути, я разрабатываю клиента платежного шлюза, в соответствии с которым веб-сайт сообщает серверу платежей о предстоящем платеже, клиент переводится на сервер платежей, и как только платеж завершен, сервер платежей информирует веб-сайт об отдельном потоке. что оплата была сделана, и перенаправляет клиента. Теперь клиент может быть «получен» на веб-сайте до получения уведомления о платеже. Таким образом, мне нужно запрограммировать систему на ожидание получения уведомления или не более 30 секунд.

После получения уведомления объект Order помечается как «Оплаченный». Проблема заключается в следующем:

  • Клиент перенаправлен на сайт раньше, Order.Paid по-прежнему false
  • Через 1 - 5 секунд уведомление получено и Order помечено как true
  • Благодаря управлению сессиями Nhibernate клиент по-прежнему видит Order.Paid как false в другом потоке.
  • Что еще хуже, иногда клиент Order сбрасывается на End_Request, а Order.Paid снова сбрасывается на false.

Единственный способ, которым я попытался, похоже, работает, это то, что я явно удаляю сеанс Nhibernate перед ожиданием, а затем постоянно создаю новый сеанс, пока он не будет найден платным. Однако проблема в том, что, поскольку исходный сеанс был удален, отложенная загрузка любых объектов, уже загруженных до того, как рука перестанет работать, и приведет к ошибкам.

На мой взгляд, все выглядит просто, но все же кажется довольно сложным из-за управления сессиями, есть идеи, как это сделать?

Спасибо!

1 Ответ

0 голосов
/ 17 октября 2012

С того момента, как я опубликовал вопрос, мне удалось найти решение для этого.

В основном, как работает NHibernate - если какое-либо исключение возникает в сеансе, сеанс должен быть удален. Это также относится к StaleObjectException, когда используется оптимистический параллелизм. Причина, по которой клиент все еще видел «не оплачено», заключалась в том, что сеанс не был утилизирован.

Фрагмент книги в Google Книгах объясняет это более подробно: http://books.google.com.mt/books?id=eMOYUycDaoUC&pg=PT213&lpg=PT213&dq=nhibernate+staleobjectexception+dispose&source=bl&ots=rg9YHt58gc&sig=W9FoTm8_4DT3PvMKGLrddG3lSxs&hl=en&sa=X&ei=FGp-UNr4FI7Vsga2nIDwBw&ved=0CGAQ6AEwCA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...