2015-09-16 30 views
0

我创建了一个观察者,在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个

谢谢!

回答

0

如果你的回调后,再提出一个异常阅读以下内容:

整个回调链封装在一个事务。如果在回调方法返回完全为false或引发异常之前,执行链会暂停并发出ROLLBACK;回调之后只能通过引发异常来实现。

http://guides.rubyonrails.org/active_record_callbacks.html

+0

感谢那些给我看了一些光,但我仍然不能使它发挥作用, – NachPD