- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
所以我一直在关注 DHH 的教程,以实现一个基本的聊天室。
在我尝试集成 ActiveJob 组件之前,该实现对我来说已经足够好了。
我在 rails 或 sidekiq 控制台中没有看到任何错误消息。但是 _message 部分没有被渲染。当我在 ActiveJob 方法中放置一个 binding.pry 时,所有元素看起来都很好,所以我猜这与作业执行有关?
为了进一步支持这种怀疑,当我调用
ActionCable.server.broadcast('room_channel', message: data['message'])
在 room_channel.rb 中它工作得很好!
我在这上面花了几个小时,但无法弄清楚如何进一步调试。我想知道我是否需要使用 Sidekiq 进行任何不同的 redis 配置才能使其正常工作。到目前为止,我只是把:
config.active_job.queue_adapter = :sidekiq
在应用程序中
我还需要一个 redis 初始化器吗??
如有任何建议或任何其他见解,我们将不胜感激!
Rails 服务器:
// ♥ rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.0 (ruby 2.2.3-p173), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/cable" for ::1 at 2016-08-16 16:25:21 +0100
ActiveRecord::SchemaMigration Load (0.4ms) SELECT "schema_migrations".* FROM "schema_migrations"
Started GET "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:21 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Finished "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:21 +0100
Started GET "/cable" for ::1 at 2016-08-16 16:25:22 +0100
Started GET "/cable/" [WebSocket] for ::1 at 2016-08-16 16:25:22 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
RoomChannel is transmitting the subscription confirmation
RoomChannel is streaming from room_channel
RoomChannel#speak({"message"=>"new message"})
(0.1ms) BEGIN
SQL (0.5ms) INSERT INTO "messages" ("content", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["content", "new message"], ["created_at", 2016-08-16 15:25:25 UTC], ["updated_at", 2016- 08-16 15:25:25 UTC]]
(1.3ms) COMMIT
[ActiveJob] Enqueued MessageBroadcastJob (Job ID: 5981c48d-afbc-4fad-a595-198b56aa90f4) to Sidekiq(default) with arguments: #<GlobalID:0x007f82aa837b90 @uri=#<URI::GID gid://dragonfly/Message/39>>
Sidekiq:
bundle exec sidekiq -q default -q mailers
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: Running in ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: See LICENSE and the LGPL-3.0 for licensing details.
2016-08-16T15:23:32.583Z 70743 TID-ow892ejts INFO: Upgrade to Sidekiq Pro for more features and support: http://sidekiq.org
2016-08-16T15:23:32.584Z 70743 TID-ow892ejts INFO: Booting Sidekiq 4.1.2 with redis options {:url=>nil}
2016-08-16T15:23:32.587Z 70743 TID-ow892ejts INFO: Starting processing, hit Ctrl-C to stop
2016-08-16T15:24:00.652Z 70743 TID-ow89s527k MessageBroadcastJob JID-4ae621ca049eb428ced1c7d2 INFO: start
2016-08-16T15:24:01.153Z 70743 TID-ow89s527k MessageBroadcastJob JID- 4ae621ca049eb428ced1c7d2 INFO: done: 0.501 sec
2016-08-16T15:24:14.351Z 70743 TID-ow89s52rk MessageBroadcastJob JID-fe94b25a9100e83f874ea785 INFO: start
app/jobs/message_broadcast_job.rb
class MessageBroadcastJob < ApplicationJob
queue_as :default
def perform(message)
ActionCable.server.broadcast "room_channel", {message: render_message(message)}
end
private
def render_message(message)
ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
end
end
app/assets/javascripts/channels/room.coffee
App.room = App.cable.subscriptions.create "RoomChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
alert data['message']
speak: (message) ->
@perform 'speak', message: message
$(document).on 'keypress', '[data-behaviour~=room_speaker]', (event) ->
if event.keyCode is 13
App.room.speak event.target.value
event.target.value = ''
event.preventDefault()
最佳答案
这与 ActiveJob 或 Sidekiq 无关。我猜渲染部分时一定有一些错误。
尝试在 Rails 控制台中执行该行,
ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
希望您得到一些有意义的错误,例如未定义的方法或类似的错误。
关于ruby-on-rails - 让 ActiveJob 和 Sidekiq 与 ActionCable 一起用于聊天室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38979756/
我猴子修补了我的用户类(由设计支持)以像这样使用 ActiveJob: class User ActionMailer::DeliveryJob, :args=>["Devise::Mailer",
我已关注 getting started with active job EngineYard 的文章。文章指出: You'll need Rails 4.2.0beta1 or greater if
我有一个 ActiveJob,它应该通过 HTTP 从外部系统加载一段数据。该作业完成后,我想排队执行一些后处理的第二个作业,然后将数据提交到不同的外部系统。 我不想让第一份工作知道第二份工作,因为
我有以下方法: UserMailer.comment_alert(@comment, user, type).deliver_later 奇怪地在rails日志中显示了param deliver_no
我有一个 Rails 应用程序,它查询外部网络服务以更新记录。 我想继续轮询 Web 服务,直到用户 session 过期。 目前,我在显示操作中为要更新的记录创建了一个 ActiveJob。 在 A
我有一个 ActiveJob,其中的一些参数已使用 GlobalID 进行了序列化。 执行工作时,我如何急切加载一些相关模型? class Foo has_one :bar end class B
为了测试我的邮件是否已发送,我正在运行 heroku run Rails c -a my_app。然后我将作业排队,并且排队正常。但是,当我转到 Redis 并查看排队的作业时,该作业不在那里。相反,
我正在尝试在生产环境中发送邮件,但它抛出 Activejob 反序列化错误。sidekiq 在后台运行。我添加了sidekiq gem。我在 comment_notification.rb 中写了一个
查看下面的作业,我假设该作业在 low_priority 队列上运行。 class GuestsCleanupJob < ActiveJob::Base queue_as :low_priorit
我想知道在ActiveJob中是否有办法将多个作业入队?类似于 sidekiq push_bulk。 Sidekiq::Client.push_bulk(sidekiq_items) 我需要排队数千个
可以使用 Rails 的新 ActiveJob API 来对代码块进行排队吗?有时我不想生成作业并在那里移动逻辑。它将我宁愿保留在那里的知识从我的模型中移出。 让我举一个我目前正在从事的项目中的例子。
Rails 4.2、active_jobs、callback_methods 在自定义作业的执行方法中,我创建了一条新记录(并将文件上传到 S3)。如何在 after_perform 回调中传递或获取
我正在将应用程序升级到 Rails 4.2,以便我们可以利用 ActionMailer 的 deliver_later方法。一切都在发展中运作良好。当我使用 capistrano-sidekiq 部署
在将作业排入队列之前,我想检查队列并查看队列中是否已经存在具有完全相同参数的作业,在这种情况下不要将作业排入队列。但我不知道我应该如何做到这一点。是否可以? 我知道我可以使用 TestHelper 在
我已将我的应用程序升级到 Rails 版本 4.2.0.rc2。我尝试使用 sidekiq 作为 active_job 后端。它在开发环境中工作正常,但在生产环境中它使用 Inline(mailers
运行 Rails 4.2.0,所以我使用 ActiveJob 和 Sidekiq 后端。我需要调用定期安排的后台作业,所以我希望使用 Clockwork,但我还没有看到如何将它与 ActiveJob
我正在使用 Rails 的 ActiveJob,我的一项工作将原始电子邮件作为输入。调试时,这可能会导致我的应用程序日志中出现大量噪音。我怎样才能避免这种情况? [ActiveJob] Enqueue
在 Controller 的操作中,我销毁了一条记录,然后将其作为参数传递给 ActiveJob。 def destroy post = Post.find params[:id] post.
如果要创建一个 ActiveJob 并且执行块接受预期为 ActiveRecord 对象的单个实例的参数,则当作业入队时,有问题的对象存在,但在实际执行时该对象不再存在,这项工作显然会失败,对吧? M
我正在为学生构建电子邮件提醒功能。他们应该按照讲师指定的时间间隔收到一封电子邮件,表明他们取得了多少进步。 我的方法是使用 ActiveJob 来安排发送电子邮件的作业,然后在执行该作业时,我使用 a
我是一名优秀的程序员,十分优秀!