我正在尝试通过Resque发送Devise电子邮件.
通过Resque发送普通电子邮件就好了.并且Devise电子邮件发送得很好,但不会通过Resque发送电子邮件.我得到"找不到有效的映射",这意味着我的帮助程序覆盖不会被拾取.
我正在关注这个http://shaker.4-dogs.biz/2011/08/06/using-resque-to-send-mail-for-devise/
奇怪的是,调试它我正在使用Devise的本地副本,并在Devise中的'initialize_from_record'中添加断点,当我仅使用Devise时会受到攻击.但是当我通过resque发送Devise电子邮件时,断点不会受到影响:
class ResqueMailer < Devise::Mailer
include Resque::Mailer
end
config.mailer = "ResqueMailer"
Run Code Online (Sandbox Code Playgroud)
而resque则显示一个打包的gem路径,而不是我的本地源,例如:
/Users/mm/.rvm/gems/ruby-1.9.2-p290@evergreen/gems/devise-1.4.9/lib/devise/mailers/helpers.rb:20:in `devise_mail'
Run Code Online (Sandbox Code Playgroud)
知道为什么它不使用我的本地宝石源和/或如何让Resque发送我的Devise电子邮件?
在我的开发机器上,我可以输入resque-web一个控制台,它会在我的浏览器上启动一个显示Resque界面的新选项卡.
在Heroku,Cedar堆栈上,我怎么能做同样的事情?即我想看看Resque的界面为我的Heroku应用程序.
编辑
在 config/initializers/resque.rb
require 'resque'
require 'resque/server'
uri = URI.parse(APP_CONFIG['redis_to_go_url'])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
# Load all jobs at /app/jobs
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }
Run Code Online (Sandbox Code Playgroud)
在 routes.rb
mount Resque::Server.new, :at => '/resque'
Run Code Online (Sandbox Code Playgroud)
一切正常.我现在能够看到Resque Web界面.但是,我想保护这一点不受公众的欢迎.可能使用用户名和密码.如何才能做到这一点?
如何在rails应用程序中调试resque作业?我只想在self.perform函数的日志文件中写一些信息.我写过这个
system("echo sos >> /home/maruf/Desktop/log.txt")
在self.perform()中.但什么都没发生.什么是正确的方法?
当我们重新启动或部署我们得到的失败队列数Resque工作与任一Resque::TermException (SIGTERM)或Resque::DirtyExit.
我们TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10在Procfile中使用new ,所以我们的工作线看起来像:
worker: TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low
Run Code Online (Sandbox Code Playgroud)
我们也在使用resque-retry我认为可能会自动重试这两个例外情况?但它似乎不是.
所以我猜两个问题:
Resque::TermException在每个工作中手动救援,并使用它来重新安排工作.但对于所有工作,是否有一种干净的方法可以做到这一点?即使是猴子补丁.谢谢!
编辑:在不到10秒的时间内完成所有工作,这似乎是不合理的.在运行Resque :: DirtyExit异常时,似乎需要有一种方法来自动重新排队这些作业.
我有一个Rails 2.3.5项目,它使用Rails的本地化功能.我也碰巧安装了Rails 3 beta(这取决于i18n gem).Rails 2.3.5很乐意自己处理本地化(没有安装i18n),但是如果i18n gem可用,它就会使用它.
最近我升级了我的宝石,现在安装了0.3.7和0.4.0的i18n.当然,Rails想要加载和使用导致我的项目出错的最新版本.我尝试将gem版本设置为0.3.7,这可以解决Web应用程序中的错误.但是,我们使用resque和resque_mailer来延迟发送消息.当工作人员从队列中获取邮件程序作业时,它会忽略environment.rb中的config.gem要求并使用版本0.4.0.
理想情况下,我想告诉Rails根本不使用i18n gem.我怎么做?
更新:从beta 4开始,Rails 3现在需要i18n版本0.4.1.我不知道有多少人没有遇到这个问题,因为现在看来如果安装了Rails 2和Rails 3,你就会遇到这个问题.
我已经成功设置了我的工作人员,他们曾经没有问题(在开发中)执行,但现在他们不在生产或开发中(我猜测从SQlite3更改为PostgreSQL之后).
当我运行rake命令来运行worker时,rake resque:work QUEUE=*我得到以下错误和堆栈跟踪:
getaddrinfo: nodename nor servname provided, or not known
Run Code Online (Sandbox Code Playgroud)
heroku rake resque:work QUEUE=*在控制台中运行时,我会遇到以下错误,以测试队列中的待处理工作程序.
Class SentimentJob
Arguments [4, 5, 6]
Exception ActiveRecord::StatementInvalid
Error PGError: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request.
: SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,
a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid =
d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"taggings"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped …Run Code Online (Sandbox Code Playgroud) 任何人都可以了解GitHub在使用Resque时如何处理Redis服务器的潜在故障或暂时不可用?
还有其他一些似乎已经将半复杂的解决方案放在一起作为使用zookeeper的redis-cluster的保留(请参阅https://github.com/ryanlecompte/redis_failover和解决方案for resque failover redis).其他人似乎有"糟糕的故障转移",在第一次看到连接问题时将奴隶切换到主设备而没有redis客户端之间的协调(但这在临时不可用情况下似乎有问题).
问题:Defunkt曾经谈过GitHub如何处理Redis失败?是否存在不涉及zookeeper的故障转移的最佳实践?
关于resis的原始帖子说明Redis的选择理性的一部分是redis的主从功能,但该帖没有描述GitHub如何利用这一点,因为所有工作者都需要对Redis的读写访问权限(参见https: //github.com/blog/542-introducing-resque).
我正在尝试与我的后台任务经理对抗一些种族案件.基本上,我有一个Thing对象(已经存在)并为其分配一些属性,然后保存它.使用新属性保存后,我将其排入Resque,并传入ID.
thing = Thing.find(1)
puts thing.foo # outputs "old value"
thing.foo = "new value"
thing.save
ThingProcessor.queue_job(thing.id)
Run Code Online (Sandbox Code Playgroud)
后台作业将使用从数据库加载对象Thing.find(thing_id).
问题是我们发现Resque在获取作业和Thing从ID 加载对象方面非常快,它加载了一个陈旧的对象.因此,在工作中,调用thing.foo仍将返回"旧值",如1/100次(不是真实数据,但不会经常发生).
我们知道这是一个竞争案例,因为rails将thing.save 在数据实际提交到数据库之前返回(在本例中为postgresql).
Rails中有一种方法只能在数据库操作提交后执行代码吗?基本上我想确保在Resque加载对象时,它会获得最新鲜的对象.我知道这可以使用模型after_commit上的钩子来实现Thing,但我不希望它在那里.我只需要在这个特定的上下文中发生这种情况,而不是每次模型都提交更改为DB时.
我的Resque工人班
class WebWorker
@queue = :jobs_queue
def self.perform(id)
//bunch of code here
end
end
Run Code Online (Sandbox Code Playgroud)
我从队列中删除了这样的某个工作
Resque.dequeue(WebWorker,id)
Run Code Online (Sandbox Code Playgroud)
但是我想停止运行并重新启动,我该怎么做?
我需要实现一些后台处理来1)发送电子邮件,2)做一些API调用.而且,无论我使用什么系统,我还将与某种cron调度程序(只要有可能)结合使用.我很好奇,我认识到有一系列非常酷的背景处理宝石(延迟工作,Sidekiq,Resque),但我也明白你可以根据Ryan Bate的视频只用rake任务进行后台处理:http:// railcasts.com/episodes/127-rake-in-background.
使用gem和rake任务进行后台处理的利弊是什么?后者关于我的一件事是,每次调用rake任务时你都必须启动一个新的环境,这在内存上非常昂贵.
请注意,我不需要比较宝石.这个系列在这里做得很好:http: //www.sitepoint.com/series/comparing-ruby-background-processing-libraries/
resque ×10
heroku ×3
delayed-job ×2
postgresql ×2
redis ×2
ruby ×2
devise ×1
github ×1
rake ×1
resque-retry ×1
sidekiq ×1