Использование терракоты с Railo / ColdFusion - PullRequest
2 голосов
/ 18 августа 2011

Я пытаюсь настроить Terracotta (веб-сессии + ehcache + hibernate) с помощью Railo (Open Source ColdFusion Engine - www.getrailo.org). Я могу запустить сервер Terracotta, подключить сервер приложений к серверу Terracotta и нормально запустить приложение с полностью работающими всеми тремя элементами (сессиями, ehcache и hibernate).

Проблема в том, что если я выключу сервер приложений и перезапущу его, он будет правильно подключаться к серверу Terracotta, но он начнет генерировать различные исключения classNotFoundException, либо в объекте сеанса, либо в объектах ehcache.

Я приложил различные java-стеки для вашей информации. Есть идеи, почему это происходит только после перезапуска сервера приложений и как мне это исправить?

С уважением,

Philip

-

Трассировка стека Java:

railo.runtime.type.scope.JSession

railo.runtime.type.StructImpl

1 Ответ

2 голосов
/ 24 августа 2011

ОК, я думаю, что нашел решение всех этих проблем.Надеюсь, это может помочь кому-то еще.

Сначала вам нужно обновить ehCache и добавить терракотовые банки в ваш путь к классам, чтобы иметь возможность работать с терракотой.Это означает, что вам нужно удалить ehcache.jar, поставляемый с Railo, так как это старая версия, которая не работает с терракотой.Банки:

  • ehcache-core - ##. ##. ##. Jar (##. ##. ## - версия)
  • ehcache-terracotta-##. ##. ##. jar
  • slf4j-api - ##. ##. ##. jar
  • slf4j-jdk14 - ##. ##. ##. jar
  • slf4j-log4j12 - ##. ##. ##. Jar
  • terracotta-toolkit-1.3-runtime - ##. ##. ##. Jar
  • УДАЛИТЕ «ehcache.jar» из библиотеки Railo lib, иначе Terracotta не будет загружаться.

Далее вам нужно добавитьа такжестроки вашего ehcache.xml, который должен быть в вашем пути к классам.Это хорошо задокументировано на веб-сайте Terracotta.

ehCache использует ContextClassLoader () для загрузки всех классов, в случае сбоя, в случае сбоя на ClassLoaderUtil.Railo contextClassLoader () по умолчанию имеет значение «org.apache.catalina.loader.WebappClassLoader» (Tomcat ClassLoader).Этот загрузчик классов не смог правильно найти объекты railo, поэтому вам нужно изменить его на «railo.loader.classloader.RailoClassLoader».Поскольку это загрузчик класса контекста для каждого потока (т. Е. Для запроса), вам нужно вызвать следующую команду в начале вашего метода onRequestStart ():

<cfset getPageContext().getThread().currentThread().setContextClassLoader( getPageContext().getClass().getClassLoader() ) />

Это должно исправить ehcache и hibernate.Следующие сессии, использующие клапан Tomcat с Terracotta, кажутся проблемой, потому что клапан, кажется, вызывается до того, как Railo обработает запрос.Поэтому используется «org.apache.catalina.loader.WebappClassLoader» и создается исключение не найденный класс.Обходным путем для этого является сохранение самого сеанса в ehcache и Terracotta с его распределением по кластеру.Проблема состоит в том, что объекты, хранящиеся в терракоте, должны быть сериализуемыми, а сеанс J2EE основан на «org.apache.catalina.connector.SessionFacade», который не сериализуем.Поэтому, чтобы обойти это ограничение, я просто преобразовал сеанс J2EE в простую структуру, которая сериализуема, используя команду structCopy (session), и поместил полученную структуру в ehcache.

Это должно быть в состояниичтобы поехать с Терракотой и Рейло.

...