2012-02-03 6 views
0

У меня есть веб-приложение JRuby/Rails. Я использую rbenv и JRuby для тестирования локально (используя «сервер rails»), и он работает. Я также распространяю производственную версию как файл WAR и запускаю Tomcat, и на этом компьютере нет установки JRuby. Оно работает. Теперь я должен использовать Resque и Redis для обработки долгосрочных заданий. Я установил Resque/Redis локально и побежал Resque из командной строки, какКак запустить Ruby/Rails с помощью приложения Resque в развертывании JRuby/Tomcat без установки JRuby и использования только Java?

linux> "QUEUE=* bundle exec rake environment resque:work 

Он работает. Я создал маленький работник класс (FooClass), который просто выводит параметр, вызывается Resque, и я могу епдиеие запросы, запустив

irb(main):041:0>Resque.enqueue(FooWorker, [1,"4"]) 

в консоли Rails, и Resque в конечном счете, обрабатывает запрос и печатает [1, "4"]

Я хотел был бы иметь возможность запустить эту задачу Resque Rake в среде Tomcat/Java (которая не установлена ​​JRuby), и у меня есть 3 варианта запуска Resque Ракетная задача.

  1. Запустите его в Tomcat, но в отдельной теме Java. Я предпочитаю не делать этого, потому что хочу убить рабочий процесс и перезапустить его.
  2. Запустите его из командной строки и выполните команду, указанную etc/init.d при запуске.
  3. Запустите его в отдельном Tomcat из веб-приложения.

Мой камышевки настроен таким образом, что следующие файлы присутствуют в файле приложения WAR, и получить в разобранном WebApps/WEB-INF к WebApps/ABC/WEB-INF, когда Tomcat запускает приложение.

Gemfile 
Rakefile 
web.xml 
lib/jruby-core-1.6.4.jar 
lib/jruby-rack-1.0.10.jar 
lib/jruby-stdlib-1.6.4.jar 
lib/tasks/abc.rake 
lib/tasks/resque.rake 
gems/gems/bundler-1.0.21 
gems/gems/warbler-1.3.2 
gems/gems/rails-3.0.10 
(other gem files in gems/gems) 
config/warble.rb 

конфигурационный файл/warble.rb выглядит следующим образом:

Warble::Config.new do |config| 
    config.dirs=%w{app config lib lob vendor tmp} 
    config.includes=FileList["./Rakefile"] 
    config.webxml.jruby.compat.version = "1.9"  
end 

Файл Библиотека/Задачи/resque.rake имеет

require "resque/tasks" 
task "resque:setup" => :environment 
task "resque:work" => :environment 

Мой Gemfile включает в себя следующие строки:

source 'http://rubygems.org' 
gem 'bundler', '1.0.21' 
gem 'rails', '3.0.10' 
gem 'rake', '0.8.7' 
gem 'resque' 

Поиск в Интернете были получены следующие способы запуска задач Rake (внутри WEB-INF /) без использования JRuby:

linux> java -cp lib/jruby-core-1.6.4.jar -S rake 

Результат был

Unrecognized option: -S 
Could not create the Java virtual machine 

Просто для удовольствия, я попытался

linux> java -jar lib/jruby-core-1.6.4.jar -S rake 

В результате был получен

jruby: No such file or directory -- rake (LoadError) 

Затем я попробовал загрузить jruby-complete-1.6.4 в этот каталог и я бежал

linux> java -jar lib/jruby-complete-1.6.4.jar -S rake -T 
(in /WEB-INF) 
rake aborted! 
no such file to load -- bundler/setup 
/WEB-INF/Rakefile:4:in `(root)' 

На данный момент у меня полная потеря. Как запустить заданную задачу Resque Rake в Java/Tomcat или только в среде Java без установки JRuby на этом сервере?

ответ

0

Итак, основная вещь, которую вам нужно сделать для этого, - написать небольшой скрипт оболочки и запустить его из каталога WEB-INF распакованного файла войны.

  1. Убедитесь, что вы есть этот сценарий, а также Rakefile и любые другие вспомогательные скрипты (например, дБ/миграции), включенные в файл войны.
  2. Сценарий должен выглядеть следующим образом:
 
#!/bin/bash 
# 
# Put in WEB-INF/; call this rake.sh or whatever you prefer. 

dir=$(dirname $0) 

# Put all jar files in the classpath 
for jar in $dir/*; do 
    CLASSPATH="$jar:$CLASSPATH" 
done 

# You might need to adjust Java memory settings; currently JRuby sets 512m by default 
JAVA_OPTS=-Xmx512m 

# Set up GEM_HOME and GEM_PATH 
GEM_HOME=$dir/gems 
GEM_PATH=$GEM_HOME 

export CLASSPATH GEM_HOME GEM_PATH 

java $JAVA_OPTS org.jruby.Main -S rake [email protected] 
1

В качестве альтернативы вы можете запустить Resque с приложением в демона Threads (вместо отдельного процесса граблей) с использованием https://github.com/kares/jruby-rack-worker.

Просто настройте камышевки (или ваш Gemfile) включить JRuby-стойку, уборщица камень (в качестве альтернативы вы можете скачать .jar и сказать WARBLER это будет помещена в WEB-INF/Lib реж) и настройки Resque в дескрипторе развертывания. С Warbler создайте файл config/web.xml.erb и поместите здесь следующий код:

<!DOCTYPE web-app PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
<% webxml.context_params.each do |k,v| %> 
    <context-param> 
    <param-name><%= k %></param-name> 
    <param-value><%= v %></param-value> 
    </context-param> 
<% end %> 

    <filter> 
    <filter-name>RackFilter</filter-name> 
    <filter-class>org.jruby.rack.RackFilter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>RackFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <listener> 
    <listener-class><%= webxml.servlet_context_listener %></listener-class> 
    </listener> 

<% if webxml.jndi then [webxml.jndi].flatten.each do |jndi| %> 
    <resource-ref> 
    <res-ref-name><%= jndi %></res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 
<% end; end %> 

    <!-- jruby-rack-worker setup using the built-in libraries support : --> 

    <context-param> 
    <param-name>jruby.worker</param-name> 
    <param-value>resque</param-value> 
    </context-param> 

    <listener> 
    <listener-class>org.kares.jruby.rack.WorkerContextListener</listener-class> 
    </listener> 

</web-app>