我无法从resque worker中的包含模块调用方法.在下面的示例中,当我尝试say在worker(在TestLib模块中)中调用方法时,我一直得到未定义的方法错误.我已将代码简化为基础知识来说明问题:
控制器 (/app/controllers/test_controller.rb)
class TestController < ApplicationController
def testque
Resque.enqueue( TestWorker, "HI" )
end
end
Run Code Online (Sandbox Code Playgroud)
库 (/lib/test_lib.rb)
module TestLib
def say( word )
puts word
end
end
Run Code Online (Sandbox Code Playgroud)
工人 (/workers/test_worker.rb)
require 'test_lib'
class TestWorker
include TestLib
@queue = :test_queue
def self.perform( word )
say( word ) #returns: undefined method 'say' for TestWorker:Class
TestLib::say( word ) #returns: undefined method 'say' for TestLib::Module
end
end
Run Code Online (Sandbox Code Playgroud)
Rakefile (resque.rake)
require "resque/tasks"
task "resque:setup" => :environment
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令运行resque: rake environment resque:work QUEUE='*'
Gems:rails(3.0.4)redis(2.2.2)redis-namespace(1.0.3)resque(1.19.0)
服务器:nginx/1.0.6 …
让我们说我有一个博客应用程序与帖子.创建帖子后,将创建一个工作程序来处理某些后台操作.我的情况是,在提交帖子表单后,我想显示某种加载消息(gif加载器等),当工作人员完成时,我想隐藏加载消息并显示工作人员提供的一些数据.我的问题是,工人完成工作并将其显示在用户前端的最佳沟通方式是什么.工人回调看起来像这样
def worker_finish
#message the user
end
Run Code Online (Sandbox Code Playgroud) 我有一个火种风格的应用程序,允许用户评价事件.在用户对事件进行评级后,将运行后台resque作业,根据用户的反馈对其他事件进行重新排序.
此后台作业大约需要10秒钟,每个用户每分钟运行大约20次.
用一个简单的例子.如果我有10个用户在任何给定时间使用该应用程序,并且我从不希望等待工作,那么最佳方法是什么?
我对Dynos,resque pool和redis连接感到困惑.有人能帮我理解其中的区别吗?有没有办法计算这个?
我正在遵循安装resque的配置指南.我遇到了一个(OpenURI :: HTTPError).我正在使用RVM 1.9.2-p180,rails 3.0.6和POW .'resque-web'无法启动500 Server Error.到底发生了什么事?
要复制问题:
redis-server$ VVERBOSE=1 QUEUE=file_serve rake environment resque:workRAILS_ENV=development resque-web config/initializers/resque.rb配置/ resque.yml
development: localhost:6379
test: localhost:6379
staging: localhost:6379
fi: localhost:6379
Run Code Online (Sandbox Code Playgroud)
初始化/ resque.rb:
rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..'
rails_env = ENV['RAILS_ENV'] || 'development'
require 'resque'
# require 'yaml'
unless defined?($redis)
$redis = Redis.new($redis = Redis.new(:host => 'localhost', :port => 6379))
end
Resque.redis = $redis
Run Code Online (Sandbox Code Playgroud)
终奌站:
master ~/projects/MyApp $ RAILS_ENV=development resque-web config/initializers/resque.rb
[2011-05-20 11:42:48 -0700] …Run Code Online (Sandbox Code Playgroud) 将对象传递给Resque作业是否安全?例如:
Resque.enqueue(Foobar, @foo, @bar)
Run Code Online (Sandbox Code Playgroud)
代替:
Resque.enqueue(Foobar, @foo.id, @bar.id)
Run Code Online (Sandbox Code Playgroud)
如果我传递对象,有什么不利之处吗?
我目前有一个Rails 3.0项目,Ruby 1.9.2和Resque.
我的应用程序有多个工作类和多个队列,它们是动态创建的(在运行时).此外,还有多个工作人员可以在任何队列上自由工作,因为在开始时没有任何现有队列,并且无法预测:
$ COUNT=3 QUEUE=* rake resque:workers
Run Code Online (Sandbox Code Playgroud)
根据projectid 创建的队列:
@queue = "project_#{project.id}".to_sym
Run Code Online (Sandbox Code Playgroud)
对于给定的队列,他们的工作必须按顺序处理,一次处理一个.我的问题是,通过拥有多个工作人员,可以并行处理多个工作.
有没有办法设置每个队列的最大工作数(为1)?有没有办法在作业处理时锁定队列?
谢谢!
我一直试图让Resque(使用Resque服务器)和RedisToGo在heroku(雪松)上工作一段时间,但我一直遇到这个错误:
Redis::CannotConnectError (Error connecting to Redis on 127.0.0.1:6379 (ECONNREFUSED)):
Run Code Online (Sandbox Code Playgroud)
它在本地工作,我可以在我的应用程序的Heroku控制台中访问redis.
我的Procfile有:
web: bundle exec thin start -p $PORT -e $RACK_ENV
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake resque:work
Run Code Online (Sandbox Code Playgroud)
我的Gemfile有:
gem 'redis'
#Background queue
gem 'resque', '~> 1.22.0', :require => "resque/server"
Run Code Online (Sandbox Code Playgroud)
LIB /任务/ resque.rake:
require 'resque/tasks'
task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
end
desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"
Run Code Online (Sandbox Code Playgroud)
routes.rb中:
mount Resque::Server.new, :at => …Run Code Online (Sandbox Code Playgroud) 我已经正确安装了resque,但是要处理我需要运行的所有队列
rake resque:work QUEUE='*'
Run Code Online (Sandbox Code Playgroud)
问题是我需要保持终端窗口打开,否则resque:工作将无法正常工作.
你知道每次运行"rails server"时自动运行rake命令的方法吗?
我在Localhost上
LIB /任务/ resque.rake
require 'resque/tasks'
task "resque:setup" => :environment do
ENV['QUEUE'] = "*"
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的rails应用程序构建聊天功能.我使用ActionController::Live,Puma,Resque,Redis对于这一点.所以基本上在这种情况下,redis subscribe方法在后台使用resque.到目前为止,我所做的是每当用户在下面的表单字段即聊天框中输入文本时
<%= form_tag chat_box_publish_path, method: :get do %>
<%= text_field_tag :query, params[:query], class: "form-control", id: "chatSearchBox",
placeholder: 'Search' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
..请求即将到来的Publish方法ChatBoxController.
def publish
$redis.publish("chat_message:1:1", "#{params[:query]}")
respond_to do |format|
format.js {render nothing: true}
end
end
Run Code Online (Sandbox Code Playgroud)
..现在,我有一个以下后台Resque工作运行以下代码用于测试目的.因此,每当发布聊天消息时,其打印data就可以了.但是我如何ActionController::Live为后台工作添加功能呢?或者我如何进行此实施?需要帮助这个设计.
class ChatBoxInitiator
@queue = :chat_box_initiator
private
def self.perform
$redis.subscribe('chat_message:1:1') do |on|
on.message do |event, data|
puts "====#{data}"
return data
end
end …Run Code Online (Sandbox Code Playgroud) 我们几年来一直在使用Resque运行后台作业,但最近开始使用以下错误消息获取失败的作业,我不确定我们的代码或我们的环境会导致这种情况发生了什么变化.
Errno::EPIPE
Broken pipe @ io_write - <STDOUT>
Run Code Online (Sandbox Code Playgroud)
每当作业调用puts(显然写入STDOUT)时,我们就会得到这个.
有谁可以请帮助阐明这一点?