Как запустить Ruby / Rails с приложением Resque в развертывании JRuby / Tomcat без установленного JRuby и использования только Java? - PullRequest
0 голосов
/ 04 февраля 2012

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

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

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

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

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

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

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

Мой warbler настроен таким образом, что следующие файлы присутствуют в файле 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

Файл config / 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

Файл lib / tasks / 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 на этом сервере?

Ответы [ 2 ]

1 голос
/ 31 октября 2012

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

Просто настройте Warbler (или ваш Gemfile ), чтобы включить jruby-rack-worker gem (в качестве альтернативы вы можете скачать .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>
0 голосов
/ 14 февраля 2012

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

  1. Убедитесь, что у вас есть этот сценарий, а также Rakefile и любые другие вспомогательные сценарии (например, db / migrations), включенные в файл war.
  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 $@
...