我创建了一个观察者,在ROR 4中发送与faye服务器的“通知”消息。在本地主机上的开发工作正常,但在EC2的生产环境中,观察者在某个点并且,我不明白,它阻止正在观察的活动记录被保存。导致ajax超时的Rails观察者
这里是我的观察:
class NotificationObserver < ActiveRecord::Observer
require 'eventmachine'
def after_save(notification)
@user = '2'
@channel = '/notifications/2'
@count = '0'
EM.run {
client = Faye::Client.new('http://domain.com:9292/faye')
publication = client.publish(@channel , {'noti' => 'hello world', 'count' => '0' })
publication.callback do
puts 'Message received by server!'
end
publication.errback do |error|
puts 'There was a problem: ' + error.message
end
}
end
end
我读过有关回调的问题,但在发展中工作正常,我测试过的“发布”行动中轨控制台的回调和发送通知它成功了。 我也尝试在应用程序的副本中从本地主机连接到ec2上的faye活服务器,并按预期工作,我们也可以放弃faye服务器。
所以它必须与de after_save触发器相关联。我不明白的是,为什么会阻止记录被保存,因为它是一个事件触发器。它应该在记录保存后开始执行,对吧?
在本地主机我在ubuntu 14和ec2中使用apache2 +瘦我在nginx和独角兽中运行应用程序,也在ubuntu 14内运行。可能是我错过了一些与apache2的& /或thin不同的独角兽或nginx配置。 。
更新:[通知现在保存,但阿贾克斯与超时结束]
从我从@ lazus-lazaritis链接得知我已经改变了“after_save的”为“after_commit”和使用记录,而不是如果有任何错误,可以抓住回应。现在通知被保存并且“publication.callback”取得了成功,并且我在日志中获得了“a-ok”,但通过触发所有操作的表单打开了ajax连接,仍然以504 Gateway Time-out结束。
下面是更新观察者:
class NotificationObserver < ActiveRecord::Observer
require 'eventmachine'
def after_commit(notification)
@user = '2'
@channel = '/notifications/2'
@count = '0'
EM.run {
client = Faye::Client.new('http://domain.com:9292/faye')
publication = client.publish(@channel , {'noti' => 'hola', 'count' => '0' })
publication.callback do
Rails.logger.debug("a-ok")
end
publication.errback do |error|
Rails.logger.error('There was a problem: ' + error.message)
end
}
end
末
这里是控制器
def create
@article = Article.find(params[:article_id])
@like = current_user.likes.build(article_params)
@user_id = current_user.id
if @like.save
@notification = Notification.new(user_id: @article.user.id, stype: 'like_article', actor_id: @user_id, action_id: @like.id)
@notification.save
respond_to do |format|
format.html { redirect_to @article }
format.js
end
else
flash[:success] = "Ya te gusta!"
redirect_to @article
end
end
我不明白为什么Ajax和超时响应,如果:
- 以前的所有过程观察员火警完成,以前失败的通知保存。
- 的EM.run在production.log OK响应观测日志里面,所以回调做工精细after_commit
我缺少什么?
这是unicorn.stderr日志:
E,[2015-09-16T17:56:40.096133#15731]错误 - :工人= 1 PID:16910超时(61S> 60秒),杀
E,[2015-09-16T17:56:40.102198#15731]错误 - :#收获工人= 1个
谢谢!
感谢那些给我看了一些光,但我仍然不能使它发挥作用, – NachPD