【问题标题】:How to run Ruby/Rails with Resque app in a JRuby/Tomcat deploymet with no JRuby installed and using only Java?如何在未安装 JRuby 且仅使用 Java 的 JRuby/Tomcat deploymet 中使用 Resque 应用程序运行 Ruby/Rails?
【发布时间】:2012-02-26 10:32:27
【问题描述】:

我有一个 JRuby/Rails Web 应用程序。我使用 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 最终处理请求并打印 [1,"4"]

我希望能够在 Tomcat/Java 环境(没有安装 JRuby)中运行这个 Resque Rake 任务, 我有 3 个选项来运行 Resque Rake 任务。

  1. 在 Tomcat 中运行它,但在单独的 Java 线程中。我不想这样做,因为我希望能够杀死工作进程并重新启动它。
  2. 从命令行运行它,并让 etc/init.d 在启动时调用该命令。
  3. 在与 Web 应用程序不同的 Tomcat 中运行它。

我的 warbler 被配置为以下文件存在于应用程序 WAR 文件中,并被分解为 webapps/WEB-INF 当 Tomcat 启动应用程序时,输出到 webapps/abc/WEB-INF。

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'

在网络上搜索得到了以下在不使用 JRuby 的情况下运行 Rake 任务的方式(从 WEB-INF/ 中):

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)'

在这一点上,我完全不知所措。如何在 Java/Tomcat 或仅 Java 环境中运行所需的 Resque Rake 任务而不在该服务器上安装 JRuby?

【问题讨论】:

    标签: tomcat resque jrubyonrails warbler


    【解决方案1】:

    或者,您可以使用 https://github.com/kares/jruby-rack-worker 在守护线程(而不是单独的 rake 进程)中运行 Resque。

    只需配置 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>
    

    【讨论】:

      【解决方案2】:

      所以,为此你需要做的基本事情是编写一个小 shell 脚本并从解压后的 war 文件的 WEB-INF 目录中运行它。

      1. 确保您在 war 文件中包含此脚本以及 Rakefile 和任何其他支持脚本(例如 db/migrations)。
      2. 脚本应如下所示:
      #!/bin/bash # # 放入​​WEB-INF/;调用这个 rake.sh 或任何你喜欢的。 目录=$(目录名 $0) # 将所有jar文件放入classpath 对于 $dir/* 中的 jar;做 CLASSPATH="$jar:$CLASSPATH" 完毕 # 您可能需要调整 Java 内存设置;目前JRuby默认设置512m JAVA_OPTS=-Xmx512m # 设置 GEM_HOME 和 GEM_PATH GEM_HOME=$dir/gems GEM_PATH=$GEM_HOME 导出 CLASSPATH GEM_HOME GEM_PATH java $JAVA_OPTS org.jruby.Main -S rake $@

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多