2016-08-12 5 views
2

Я установил чат с основным действием, подключенный к кабелю, в моем приложении. У меня есть обратный вызов after_create_commit, который отправляет сообщение на задание для трансляции на соответствующий канал. Он отлично работает, когда он настроен на выполнение, но не работает, когда он установлен на perform_later. Sidekiq выполняет задачу и транслирует на правый канал, но подписка на канал ничего не получает.Sidekiq perform_later не работает с кабелем действия

Здесь канал создаются:

PodsChannel is transmitting the subscription confirmation 
PodsChannel is streaming from pods_channel_310 
PodsChannel#speak({"message"=>"word", "pod_slug"=>"310", "user_id"=>"1", "msg_type"=>"pod_message"}) 

Вот сообщение приходит и направляется sidekiq:

[ActiveJob] Enqueued MessageBroadcastJob (Job ID: c9cc59ce-2202-400d-92fb-15b80a9ece67) to Sidekiq(development_default) with arguments: #<GlobalID:0x007fa2e63526a0 @uri=#<URI::GID gid://sutra/PodMessage/1390>> 

А вот sidekiq обработки задания и вещания на право канал:

[ActiveJob] [MessageBroadcastJob] [546222f6-9a57-493d-a3bb-b4886e0ad708] Rendered pod_messages/_pod_message.html.erb (61.0ms) 
[ActiveJob] [MessageBroadcastJob] [546222f6-9a57-493d-a3bb-b4886e0ad708] [ActionCable] Broadcasting to pods_channel_310: {:message=>"<div class='msg-wrap' id='msg_1389'><div class='msg-avatar'><a href=\"http://example.org/lorenzsell\"><img class=\"avatar-img\" alt=\"Lorenz\" src=\"/uploads/user/avatar/1/thumb_Lorenz2-square.jpg\" /></a></div><div class='msg-details'><div class='msg-meta'><div class='msg-sender'>Lorenz</div><div class='msg-timestamp'>Friday, August 12 at 12:09 AM</div><div class='msg-delete'><a data-remote=\"true\" rel=\"nofollow\" data-method=\"delete\" href=\"/delete_pod_message/1389\"><span class='glyphicon glyphicon-remove-circle' aria-hidden='true'></span></a></div></div><div class='msg-text'>word</div></div></div>\n"} 
[ActiveJob] [MessageBroadcastJob] [546222f6-9a57-493d-a3bb-b4886e0ad708] Performed MessageBroadcastJob from Sidekiq(development_default) in 143.57ms 

Но тогда канал фактически не получает никаких данных. Как я уже сказал, это работает отлично, когда он настроен на выполнение_ now, но borks on perform_later. Есть идеи?

ответ

12

Я просто имел такую ​​же проблему. Похоже, что это вызвано cable.yml файла по умолчанию, который был установлен, как:

development: 
    adapter: async 

test: 
    adapter: async 

production: 
    adapter: redis 
    url: redis://localhost:6379/1 

Но, похоже, адаптер асинхронной не может использоваться для трансляции из отдельных процессов. Для того чтобы это можно изменить файл cable.yml быть:

default: &default 
adapter: redis 
url: redis://localhost:6379/1 

development: 
    <<: *default 

test: 
    <<: *default 

production: 
    <<: *default 

Это также позволит вам транслировать с консоли, а также.

+0

приятно. это действительно сработало. большой наконечник. Спасибо! – Lorenz

+0

для меня это не работает для консоли. Однако он работает с Sidekiq. – Julien

+0

отлично !. работает на меня! –

0

Update sidekiq 4.2, он поддерживает рельсы 5

+0

Не работает для меня. Я обновился до Sidekiq 4.2.1 и поступил так же, как и раньше. Он работает с perform_now, но не с perform_later. – Lorenz

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