2015-09-16 7 views
0

Я создал наблюдателя для отправки сообщения «уведомление» с faye sever в ROR 4. В разработке на моем локальном хосте отлично работает, но в процессе производства на моем EC2 наблюдатель в какой-то момент не работает и, что я не могу понять, предотвращает сохранение активной записи, которая сохраняется.Rails observer, вызывающий тайм-аут ajax

Вот мой наблюдатель:

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 

Я читал о проблемах обратных вызовов, но в развитии работает нормально, и я проверил действие «публиковать» внутри рельсы консоли отправки уведомлений с обратными вызовами и он преуспевает. Я также попытался подключиться к файловому серверу faye на ec2 с локального хоста в копии приложения, и он работал, как ожидалось, мы могли бы также отказаться от сервера Faye.

Так что это должно быть связано с триггером after_save. Я не могу понять, почему это мешает записи сохранять, поскольку это триггер после события. Он должен начать выполнение после сохранения записи, правильно?

В localhost Я использую apache2 + тонкий внутри ubuntu 14 и в моем ec2 Я запускаю приложение через nginx и единорог, внутри ubuntu 14 тоже. Может быть, мне не хватает конфигурации единорога или nginx, которая отличается от apache2 &/или тонкой. ,

Обновление: [Уведомление в настоящее время сохранения, но Аякс заканчивается тайм-аут]

Из того, что я узнал от @ lazus-lazaritis ссылки я изменил «after_save» для «after_commit» и использовать регистратор вместо чтобы уловить ответ, если есть какая-либо ошибка. Теперь уведомление сохраняется и «publish.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 

Я не могу понять, почему Аякс отвечает тайм-аут, если:

  • Все процессы, предшествующие наблюдаются пожары, а также сохранение уведомлений, которые не удались.
  • EM.run внутри бревен наблюдателя в production.log ОК ответа, поэтому обратные вызовы работают отлично after_commit

Что мне не хватает?

Это unicorn.stderr войти:

Е, [2015-09-16T17: 56: 40,096133 # 15731] ОШИБКА -: Рабочий = 1 PID: 16910 тайм-аут (61S> 60s), убийство

Е, [2015-09-16T17: 56: 40,102198 # 15731] ERROR -: пожинали # рабочий = 1

Спасибо!

ответ

0

Если после обратного вызова вызывает исключение, то прочитайте следующее:

Весь обратный вызов цепь обернута в транзакции. Если какой-либо метод обратного вызова возвращает точно false или создает исключение, цепочка выполнения останавливается и выдается ROLLBACK; после того, как обратные вызовы могут выполнить это только путем создания исключения.

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

+0

Спасибо, что показали мне свет, но я не могу еще сделать его работу, – NachPD

 Смежные вопросы

  • Нет связанных вопросов^_^