Как я могу создать глобальные КОНСТАНТЫ пространства имен во время инициализации Rails в Tomcat? - PullRequest
0 голосов
/ 09 декабря 2011

Сначала немного предыстории: у меня есть приложение на Rails 2.2.2 со всеми видами нестандартных зависимостей и настроек, которые на данный момент не позволяют мне обновиться до версии 2.2.2.В настоящее время планируется перенести это приложение на JRuby (1.6.5), развернуть его как войну в Tomcat (6.0.23 - еще не привязанную к этой конкретной версии FWIW), используя warbler (1.3.2) для его упаковки.

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

Ряд настраиваемых поведений в приложении можно настроить с помощью глобальных КОНСТАНТОВ с пространством имен, установленных в файлах environments/*.rb.Но эти значения могут быть переопределены с помощью файла конфигурации yaml или установки переменной среды оболочки;это прежде всего для гибкости во время разработки, где разные разработчики иногда должны настраивать различные параметры.До сих пор эта система работала хорошо, оставляя наш файл environments/development.rb относительно стабильным и незагроможденным, в то же время давая нам большой контроль над настройкой во время взлома.

Я бы хотел сохранить эту систему настройкив движении к JRuby.Пока что я использую настроенный config/web.xml.erb, который преобразует соответствующие переменные среды и настройки из файла yaml в <env-entry> фрагменты, что делает их доступными во время инициализации через контекст java:comp/env JNDI.В более ограниченных средах (таких как подготовка или производство) многие из этих настроек можно заблокировать, включив соответствующие настройки <Environment> в файл context.xml контейнера с атрибутом override, установленным в false.

Все идет нормально.Но сейчас я пытаюсь превратить значения, извлеченные из контекста JNDI, в глобальные константы пространства имен во время инициализации.Вот выдержки из соответствующих битов:

config / environment / developer.rb:

...
envset "FOO", "baz"
FOO="fail" unless defined? FOO
printf "FOO is now '%s'\n", FOO
 ...

lib / config_helper.rb:

1  include Java
2  import javax.naming.InitialContext
3  import javax.naming.NameNotFoundException
4  
5  ctx = InitialContext.new
6  
7  def envset(value_name, default_value)
8      value = nil
9      begin
10         value = ctx.lookup("java:comp/env/#{value_name}")
11     rescue NameNotFoundException => e
12         value = default_value
13     end
14     printf "setting %s to '%s'\n", value_name, value
15     eval("%Q[ #{value_name} = '#{value}' ]")
16 end

web.xml:

...
<env-entry>
    <env-entry-name>FOO</env-entry-name>
    <env-entry-value>bar</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
</env-entry>
...

catalina.out:

setting FOO to 'bar'
FOO is now 'fail'

Где, конечно, я ожидаю, что эта последняя строка будет "FOO is now 'bar" ".Строка 14 из lib/config_helper.rb, кажется, там, где все идет не так.Подобный код хорошо работал в vanilla ruby, но он не работает здесь во время инициализации в Tomcat.

Итак, как я могу создать глобальные КОНСТАНТЫ пространства имен из записей среды JNDI во время инициализации Rails в Tomcat?

1 Ответ

0 голосов
/ 30 декабря 2011

Хорошее практическое правило заключается в том, что всегда лучший ответ, чем eval().Замена строки 15 следующей строкой корректно создает константы в глобальном пространстве имен:

Object.const_set(value_name, value)

Я все еще не уверен, в каком пространстве имен оригинал создавал константы, но Object представляется «глобальным»один.

...