Почему мои службы обработки сообщений Grails JMS используют устаревшие данные? - PullRequest
4 голосов
/ 08 декабря 2010

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

Типичный процесс:

  1. Внешняя система изменяет состояние в нашей базе данныхи отправляет сообщение о том, что произошло изменение состояния
  2. Наше приложение grails обрабатывает сообщение, извлекая из базы данных те же данные, которые были только что записаны внешним процессом (вторичный спящий режим и кэширование запросов не включены для классовтаблицы, модифицированные устаревшей системой).В сообщении много данных, но мы просто используем класс и идентификатор из нашего приложения grails.
  3. Эти данные устарели, если наша служба обработки JMS уже взаимодействовала с данными при обработке предыдущего события.

Однако, если я сделаю веб-запрос к контроллеру, который отображает те же данные, это согласуется с базой данных.

Наша теория заключается в том, что между обработкой событий JMS существует некоторое кэширование данных, предположительно в сеансе гибернации.Поскольку обработка запросов grails, кажется, делает то, что мы хотим обеспечить согласованность, мы думаем, что мы должны обернуть нашу обработку событий аналогичным кодом.Если сеансы гибернации сохраняют данные между сообщениями JMS, мы предполагаем, что мы хотим настроить и отключить сеансы гибернации для каждого сообщения.К сожалению, мы недостаточно знакомы с Grails-Core, чтобы определить, где это делается, чтобы мы могли повторно использовать этот код для наших нужд ... и мы не убедились, что это наша проблема.

Очевидно, что это не так 'Идеально, чтобы и внешняя система, и наше приложение Grails записывали в одну и ту же базу данных.Со временем мы решаем эту проблему путем перехода от устаревшей системы, поэтому перемещение всего в приложение grails желательно, но не представляется возможным в качестве краткосрочного решения проблемы.

1 Ответ

2 голосов
/ 13 декабря 2010

Я являюсь автором плагина JMS.

При конфигурации прослушивателя по умолчанию новый сеанс гибернации устанавливается каждый раз при получении сообщения:

https://github.com/gpc/grails-jms/blob/master/src/groovy/grails/plugin/jms/listener/adapter/PersistenceContextAwareListenerAdapter.groovy

Попробуйте вызвать .refresh () для вашего доменного объекта в начале вашего сообщения получения JMS. Если это решает проблему, то мы каким-то образом просачиваемся в состояние сеанса гибернации. Вероятно, нам нужно явно очистить кэш спящего режима.

Не могли бы вы сообщить мне о результатах.

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