ruby-on-rails - Sidekiq Job 不断出现在 Rails 应用程序中
问题描述
我有一个 Sidekiq 工作,它不断从死里复活 - 即使在 Sidekiq Web UI 中删除该工作后,它仍然可以重新运行。这已经持续了两个多月了,删除作业后,当我启动 Rails 应用程序时,它会发送。
该工作是邀请系统的一部分,当有人接受邀请时,邀请者会收到电子邮件通知。我从来没有 37 条会员记录,所以不清楚它是如何查找 ID 37 的,也不清楚这项工作是如何继续运行的。任何想法?
控制台日志
16:03:42 web.1 | [19555] - Worker 0 (pid: 20745) booted, phase: 0
16:03:42 sidekiq.1 | FacilityMember Load (1.4ms) SELECT "members".* FROM "members" WHERE "members"."type" = $1 AND "members"."id" = $2 LIMIT $3 [["type", "FacilityMember"], ["id", 37], ["LIMIT", 1]]
16:03:42 sidekiq.1 | 2019-12-26T21:03:42.760Z pid=19576 tid=ovbl501oc class=ActionMailer::MailDeliveryJob jid=d991b5a607693bfc5e78305f elapsed=1.735 INFO: fail
16:03:42 sidekiq.1 | 2019-12-26T21:03:42.760Z pid=19576 tid=ovbl501oc WARN: {"context":"Job raised exception","job":{"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped":"ActionMailer::MailDeliveryJob","queue":"mailers","args":[{"job_class":"ActionMailer::MailDeliveryJob","job_id":"84b9126d-0319-44c6-a6cc-df790d577e7d","provider_job_id":null,"queue_name":"mailers","priority":null,"arguments":["InviteMailer","facility_invite_accepted","deliver_now",{"args":[{"_aj_globalid":"gid://openunit/FacilityMember/37"}],"_aj_symbol_keys":["args"]}],"executions":0,"exception_executions":{},"locale":"en","timezone":"UTC","enqueued_at":"2019-10-13T00:49:50Z"}],"retry":true,"jid":"d991b5a607693bfc5e78305f","created_at":1570927790.259349,"enqueued_at":1577394221.019845,"error_message":"Error while trying to deserialize arguments: Couldn't find FacilityMember with 'id'=37 [WHERE \"members\".\"type\" = $1]","error_class":"ActiveJob::DeserializationError","failed_at":1570927790.303255,"retry_count":8,"retried_at":1577389107.42818},"jobstr":"{\"class\":\"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper\",\"wrapped\":\"ActionMailer::MailDeliveryJob\",\"queue\":\"mailers\",\"args\":[{\"job_class\":\"ActionMailer::MailDeliveryJob\",\"job_id\":\"84b9126d-0319-44c6-a6cc-df790d577e7d\",\"provider_job_id\":null,\"queue_name\":\"mailers\",\"priority\":null,\"arguments\":[\"InviteMailer\",\"facility_invite_accepted\",\"deliver_now\",{\"args\":[{\"_aj_globalid\":\"gid://openunit/FacilityMember/37\"}],\"_aj_symbol_keys\":[\"args\"]}],\"executions\":0,\"exception_executions\":{},\"locale\":\"en\",\"timezone\":\"UTC\",\"enqueued_at\":\"2019-10-13T00:49:50Z\"}],\"retry\":true,\"jid\":\"d991b5a607693bfc5e78305f\",\"created_at\":1570927790.259349,\"enqueued_at\":1577394221.019845,\"error_message\":\"Error while trying to deserialize arguments: Couldn't find FacilityMember with 'id'=37 [WHERE \\\"members\\\".\\\"type\\\" = $1]\",\"error_class\":\"ActiveJob::DeserializationError\",\"failed_at\":1570927790.303255,\"retry_count\":8,\"retried_at\":1577389107.42818}"}
16:03:42 sidekiq.1 | 2019-12-26T21:03:42.760Z pid=19576 tid=ovbl501oc WARN: ActiveJob::DeserializationError: Error while trying to deserialize arguments: Couldn't find FacilityMember with 'id'=37 [WHERE "members"."type" = $1]
Sidekiq.rb
# frozen_string_literal: true
require 'sidekiq/testing/inline'
RSpec.configure do |config|
config.after(:each, :sidekiq) do
Sidekiq::Worker.clear_all
end
config.after(:each, :sidekiq, :redis) do
Sidekiq.redis do |connection|
connection.redis.flushdb
end
end
end
解决方案
如果确实如此,config/initializers/sidekiq.rb
那么您的 Sidekiq 已配置为进行测试。
特别require 'sidekiq/testing/inline'
是将其置于内联测试模式,这会导致 Sidekiq 立即执行作业。您的其余配置用于RSpec
测试框架。
这应该位于一个独立的测试目录中,例如spec/support/config/
. 用类似的东西加载它spec/rails_helper.rb
。
Rails.root.join('spec/support/').glob('**/*.rb') { |f| require f }
请参阅Clean RSpec configuration directory structure for Ruby on Rails gems required in testing。
推荐阅读
- javascript - 需要什么 JavaScript 才能将选项添加到 TOP 的
- hash - php artisan make:livewire 示例错误 laravel 8
- c# - 使用 IN 运算符并在 LINQ C# 中获取不同的值
- maven - Maven:降低处理恶意 pom.xml 时泄露我的凭据的风险
- c# - SQL Server 和 SQL 注入
- python - Django - CSV 阿拉伯语言编码
- python - 需要 Python 包导入帮助
- python - 将数据上传到 AWS S3 - EndpointConnectionError:无法连接到终端节点 URL:
- ckeditor - 有没有办法判断 HTML 字符串是否包含 CKEditor 5 中不受支持的标签/属性?
- php - 如何从行中提取数据