问题标签 [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 - 将数据存储在作业中以供执行时使用
我需要在计划使用活动作业时存储信息,以便稍后执行。我想将此信息保存在活动作业本身中,但我不确定这是否可能。
这是我正在尝试的简化版本,它重现了我看到的错误:
当我在 Collections 控制器中调用 schedule_test_job 时,我收到一个错误:nil:NilClass 的未定义方法 `map' 并且未调用执行操作。
我假设我需要将我试图保存在数据库中其他地方的信息持久化,但我想知道是否有适当的方法来完成我在这里所做的事情。我也不明白抛出的错误来自哪里。
ruby-on-rails - 在 Rails 4 中,如何存储所有已发送的带有附件的电子邮件并稍后再次发送?
在我的 Rails 4 应用程序中,我已经使用观察者将所有外发电子邮件存储在数据库中。在 config/initializers/all_emails_observer.rb 我大致有以下代码:
现在我需要添加另一个功能,让管理员重新发送电子邮件日志中的任何电子邮件。
我可以立即看到一些解决方案:
- 添加代码以存储所有附件(常规附件和内联附件),然后实现一个生成新电子邮件并重新发送的方法。我现在正在做这件事。
- 存储邮件程序类、邮件程序方法和参数(例如,使用 GlobalId 进行序列化)。当管理员需要重新发送电子邮件时 - 从头开始生成新电子邮件。我不喜欢这种方法,因为理想情况下,我希望重新发送的电子邮件具有与最初发送时完全相同的内容(包括附件)。此后,邮件程序可能会修复错误/错别字,但我确实希望在重新发送电子邮件时所有这些错误和错别字仍然存在。
现在 Rails 4.2 发布并且 ActiveJob 稳定了,我没有找到标准的方法来做到这一点:所有排队的电子邮件在发送后立即被删除(我刚刚检查了 delay_job 后端)。必须有一种方法可以在某个单独的数据库表中保存已完成的邮件程序作业,然后在需要时重新排队该作业。
如果可能的话,我很想重新使用 ActiveJob 的电子邮件序列化机制来实现我的目标,因为我不想在 Rails 6 发布时使用完全改变的观察者 API 重新编写我的观察者。
启用重新发送已发送电子邮件的更好方法是什么?
请注意,我已经在这里查看了类似的问题:
但是,它们都是关于如何存储已发送的电子邮件,而不是关于如何按原样重新发送它们。
谢谢!亚历克斯。
ruby-on-rails - 使用 ActiveJob 禁用自动重试,与 Sidekiq 一起使用
有没有办法使用 ActiveJob 和 Sidekiq 禁用自动重试?
我知道只有 Sidekiq,我们只需要放
如此处所述:https ://github.com/mperham/sidekiq/wiki/Error-Handling#configuration
但它似乎不适用于 ActiveJob 和 Sidekiq。
我也知道这里提出的完全禁用重试的解决方案:https ://stackoverflow.com/a/28216822/2431728
但这不是我需要的行为。
ruby-on-rails - 如何防止并行 Sidekiq 作业在 Rails 中执行代码
我有大约 10 名工人从事的工作包括以下内容:
问题是在某些时候,两个或更多工作人员在确切的时间运行此代码,因此我后来发现两个或更多用户具有相同email
的 ,我应该始终只得到唯一的电子邮件。
我的情况不可能为唯一电子邮件创建数据库唯一索引,email
因为唯一电子邮件是有条件的——一些用户应该有唯一的电子邮件,有些则没有。
值得注意的是,我的User
模型具有唯一性验证,但它仍然对我没有帮助,因为在.find_or_initialize_by
和之间.save
,有一个代码依赖于用户对象是否已经创建。
我尝试了悲观和乐观锁定,但它对我没有帮助,或者我只是没有正确实现它......如果你对此有一些建议。
我只能想到的解决方案是在执行这些代码行时锁定其他线程(Sidekiq 作业),但我不太确定如何实现这一点,也不知道这是否是一种可建议的方法。
我将不胜感激任何帮助。
编辑
在我的具体情况下,很难将电子邮件参数放入作业中,因为这项作业比上面所说的要复杂一些。该作业实际上是一个导出脚本,其中一部分作业是上面的代码。我认为也不可能将上述功能分离到另一个单独的工作人员中......因为整个工作流程应该是串行的,并且不应并行/异步处理任何部分。该作业只是由另一个作业管理的作业之一,其中最终由主作业管理。
ruby-on-rails - 有人使用带有插件 resque-history 和 ActiveJob 的 resque gem 吗?
我使用 resque-history 插件来监控已完成的任务。
首先,我将此字符串require 'resque-history/server'包含到路由文件中,然后我在仪表板中看到新的历史记录选项卡。
这是/app/jobs/welcome_email_job.rb中的一些代码
工作完成后,我在统计选项卡中看到处理了多少工作,但历史选项卡为空,只有表头。我能解决这个问题吗?
ruby-on-rails - Activejob 反序列化对象失败
为了测试我的邮件是否正在发送,我正在运行heroku run rails c -a my_app
. 然后我将工作排入队列,并且排入队列很好。但是,当我去 Redis 并查看排队的作业时,该作业不存在。相反,它处于“重试”状态。
这就是我所看到的:
{"retry":true,"queue":"default","class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","args":[{"job_class":"SendMailJob","job_id":"4b4ba46f-94d7-45cd-b923-ec1678c73076","queue_name":"default","arguments":["any_help",{"_aj_globalid":"gid://gemfeedapi/User/546641393834330002000000"}]}],"jid":"f89235d7ab19f605ed0461a1","enqueued_at":1424175756.9351726,"error_message":"Error while trying to deserialize arguments: \nProblem:\n Document(s) not found for class User with id(s) 546641393834330002000000.\nSummary:\n When calling User.find with an id or array of ids, each parameter must match a document in the database or this error will be raised. The search was for the id(s): 546641393834330002000000 ... (1 total) and the following ids were not found: 546641393834330002000000.\nResolution:\n Search for an id that is in the database or set the Mongoid.raise_not_found_error configuration option to false, which will cause a nil to be returned instead of raising this error when searching for a single id, or only the matched documents when searching for multiples.","error_class":"ActiveJob::DeserializationError","failed_at":1424175773.317896,"retry_count":0}
但是,对象在数据库中。
我尝试添加after_create
回调(Mongoid),但没有任何区别。
对正在发生的事情有任何想法吗?
谢谢。
ruby-on-rails - 在 Rails 4.2 中检查作业是否已经入队
我使用 Rails 4.2 和delayed_job 4.0.6 作为我的ActiveJob 后端。
我有一份工作,我只想在队列中允许一次。有问题的作业需要一分钟多的时间才能运行。它由模型上的回调排队。回调将比作业完成的频率高得多。该作业无需在未来多次排队。
这是我想要完成的一些伪代码。
如果作业的实例在再次调用时正在运行,则它仍应排队以备将来使用。我正在寻找一种方法让作业排队等待未来最多运行 1 次。
我认为答案必须特定于delayed_job,但如果它可以推广到ActiveJob,那就更好了。
ruby-on-rails - 如何将自定义的延迟作业作业与 ActiveJob 一起使用?
我正在使用 DelayedJob,我想更新我的 Rails 4.2 应用程序以使用 ActiveJob。问题是我有一堆看起来像这样的自定义作业:
然后在某处的控制器中,作业使用以下语法排队:
我想找到 ActiveJob 的等价物。以上内容基本上直接来自 DJ 文档。使用它来排队单个调用就像调用作业的 perform 方法一样简单,就像使用 DJ 一样。但我的更复杂,需要 DJ 的 Struct 语法和传递给它的参数。
这是我到目前为止所尝试的:
不幸的是,实例化的对象没有我所期望的 #perform_later 方法。它确实有#enqueue,但我收到一个奇怪的错误:
无法记录“enqueue.active_job”事件。NoMethodError:未定义的方法“任何?” 对于零:NilClass
...后跟数组中的堆栈跟踪,以
NoMethodError:nil:NilClass 的未定义方法“映射”
几个奇怪的错误,但我可能不应该直接访问#enqueue。就 ActiveJob 正在寻找的内容而言,上面的内容似乎很有趣。我错过了什么?
ruby-on-rails - 使用 Minitest 测试 ActiveJob 不会进入 Sidekiq 队列
在 Rails 4.2 上,我有以下 ActiveJob 测试:
测试/工作/import_job_test.rb
运行测试它变绿:
但永远不要真正接触 Sidekiq 队列。当 Sidekiq 关闭时,我也会变绿,这是我不想要的。当然在控制台中运行队列被咬了。
如何指定在测试模式下真正进入队列?
ruby-on-rails - ActionMailer 在 Rails 4.2 中使用哪个 ActiveJob 队列?
在 Rails 4.2 中,ActionMailer 支持使用名为 ActiveJob 的新后台作业抽象层。ActiveJob 将作业放入后台队列,以便稍后在将作业推送到其中的代码流之外进行处理。
问题是,由于 ActionMailer 现在支持使用 #deliver_later 方法自动对电子邮件进行排队,这些电子邮件将发送到哪个队列。