Я создал наблюдателя для отправки сообщения «уведомление» с 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
Спасибо!
Спасибо, что показали мне свет, но я не могу еще сделать его работу, – NachPD