问题标签 [rails-activejob]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ruby-on-rails - Rails 4.2 从活动作业中获取延迟的作业 ID
知道如何Delayed::Job
从 ActiveJob 排队中获取 id 吗?当我将作业排入队列时,我会返回一个ActiveJob::Base
带有 a的实例@job_id
,但该作业 ID 似乎是 ActiveJob 的内部。到目前为止,我最好的猜测是查看最近创建的工作:
但这似乎是各种hacky。有点惊讶 ActiveJob 没有从 中返回 ID Delayed::Job
,尤其是因为这是在作业入队时显式返回的内容。
== 编辑
看起来我不是唯一一个(https://github.com/rails/rails/issues/18821)
ruby-on-rails - Rails ActiveJob 无限循环
我正在开发的应用程序需要有一个无限循环来处理与用户输入完全分离的业务逻辑(他们只会查看它)。由于这是对传统 MVC 的突破,我认为 Active Job 是放置它的好地方。
循环中的逻辑将轮询同一网络上的微控制器。我几乎没有能力更改这些代码,所以我必须适应他们使用的独特协议。当微控制器响应时,服务器将需要进行一些计算并将其存储在数据库中。
该作业将在服务器应用程序启动时启动。它应该只存在一个实例,所以我不想把它放在我的模型或控制器中。我尝试从配置文件夹中的几个位置启动它,但它会导致初始化常量 NameError。
初始化服务器时启动作业的正确方法是什么?你会采取另一种方法吗?
我是使用 Ruby 2.2.0 和 Rails 4.2.0 的 webdev 新手。
ruby-on-rails - Sidekiq Rails 4.2 使用 Active Job 还是 Worker?有什么不同
这是我的第一个异步处理作业,我正在我的应用程序中实现 Sidekiq 以进行后台处理。我会将它用于提醒电子邮件和应用内通知。我对是否应该使用 Active Job 来创建发送电子邮件的作业或使用 Sidekiq Worker 来发送电子邮件感到困惑。他们似乎在做同样的事情,Rails 4.2 Active Job 似乎很新……它是否取代了对 Sidekiq Worker 的需求?
下面是使用 Active Job 作业和 Sidekiq Worker 发送邮件代码的相同方法。我正在使用每当 gem 进行调度。
my_mailers.rb
使用 Sidekiq “Worker”
some_worker.rb
使用活动作业“作业”
some_job.rb
我的每当调度程序 schedule.rb中的两个示例
ruby-on-rails - 在 Mailer 中使用 view_context
我ActiveJob
用来发送邮件:
使用deliver_now
方法:
invoices_controller.rb
invoices_mailer.rb
请注意,我正在将view_context
控制器从控制器发送到邮件程序,这将再次将其传递给InvoicePdf
类以生成发票。
结果:电子邮件发送正确
使用deliver_later
方法:
invoices_controller.rb
结果: ActiveJob::SerializationError in Members::InvoicesController#send_invoice Unsupported argument type:
view_context
。
如何注入view_context
内部InvoicePdf
,或者从内部加载InvoicePdf
,或者InvoiceMailer
?
编辑:这就是 InvoicePdf 的样子
invoice_pdf.rb
ruby-on-rails - 使用 ActiveJob 和 Sidekiq 发送电子邮件时如何保持 current_locale?
我正在使用 Active_job 和 sidekiq 异步发送电子邮件。但是在执行电子邮件发送时我的 current_locale 丢失了。我通过每个请求的 url 模式设置 I18n.locale。
我曾经使用 Sidekiq,它提供了一个 插件来存储 current_locale,并在发送时使用它。
但我现在升级到 Rails 4.2.1,ActiveJob 似乎没有提供这样的解决方案。
任何想法?
我知道的一种方法是将 current_locale 作为参数传递给邮件程序,然后使用 I18n.with_locale {...},但这会改变很多地方...
ruby-on-rails - 在 ActiveJob 和 Controller 之间共享数据
每 n 秒应用程序请求一个远程 JSON 文件,该文件提供交易系统中证券的实时价格。JSON 有一个包含我需要的数据的块 ( marketdata
) 和一个包含当前数据的块dataversion
(version
和seqnum
)。
现在我使用ActionController::Live
(EventSource
在客户端)将更新的数据推送到浏览器。所有操作都在一种方法中完成:
- 打开 SSE 连接;
- 形成动态URL;
- 从远程服务器拉取新数据;
- 比较/重新
seqnum
赋值; - 如果需要,更新数据库。
所以我现在的目标是将更新数据库(ActiveJob
)与将更新的值推送到浏览器(ActionController::Live
)分开。为此,我需要:
- 要么存储在服务器端的某个地方,要么在控制器
seqnum
和version
后台作业之间共享; - 或监视数据库以了解
updated_at
字段中的最新更改。
所以基本上我有两个问题:
- 上面两个选项之间哪个更有效?还有其他好的方法吗?
- (如果第一个有权存在)如何实施这种方法?
ruby-on-rails - 当您将对象传递给 ActiveJob 队列并且该对象在执行时不再存在时会发生什么?
如果要创建一个 ActiveJob 并且执行块接受一个预期为 ActiveRecord 对象的单个实例的参数,那么当作业入队时,有问题的对象存在,但在实际执行时该对象不再存在,这项工作显然会失败,对吧?
因此,一旦这个作业因为 ActiveJob 无法实例化原始 ActiveRecord 对象而失败,它将继续失败。可以对作业进行哪些更新以停止故障循环。我考虑挂钩before_perform
,但我还没有看到前进的道路。
除了解决手头的问题之外,我在这里学到的另一件事是传递widget_id
整数而不是 ActiveRecord 对象会更好。然后我就可以检查并查看有问题的小部件是否仍然存在于执行块内。
ruby-on-rails - Rails ActiveJob 和 SSE:如何在 API 调用完成时更新页面
我计划使用 SSE 更新显示 Stripe 订阅详细信息的页面。
基本上它是这样的:
- 加载订阅详情页面
- 使用 ActiveJob 作业从 Stripe API 请求订阅详细信息
- 任务完成后,使用 SSE 通知该客户端(订阅页面)将对页面进行更新
- 通过 javascript 执行更新
我有步骤 1、2 和 4 的代码设置,但是,我不知道如何执行 #3。
我看到的问题之一是 ActiveJob 确实有一个 after_perform 回调,但是 Rails 中内置的 SSE 驻留在控制器上(ActionController::Live::SSE)。我不知道如何在 after_perform 回调的 SSE 控制器中执行某些操作。
谷歌搜索,我发现了一个潜在的解决方案:
- 使用 Sidekiq 插件可以判断任务何时完成。
- 使用 PostgreSQL 通知/监听
我不知道之后会发生什么,比如 SSE 控制器如何知道任务已执行。
其他注意事项:
我正在使用 Brandon Hilkert 的 Sucker Punch gem 进行后台处理:https ://github.com/brandonhilkert/sucker_punch
我还想要一个不会强迫我坚持使用 PostgreSQL 专有代码的解决方案。但是,我不介意这是否是唯一可行的方法。
我还发布了一个 Sidekiq 解决方案,以防我无法使用 Sucker_punch 做到这一点而不得不切换到 Sidekiq。
有任何想法吗?
谢谢!
resque - Resque Gem - 我无法获得正确的队列数据
为什么我无法获取所有队列数据,使用Resque.queues
json 中的结果是:
只有名称在:
paperclip - delay_paperclip 没有击中 sidekiq
我已经设置了延迟回形针和sidekiq,但是当我再次尝试上传照片时,日志输出如下:
这表明 Activejob 正在完成这项工作..在 sidekiq 控制台的另一边,我没有看到任何被注销的东西..所以我想知道我是否遗漏了任何东西。