我的应用程序中的用户创建
Transactions
,我需要这些事务(以及为将事务状态更改为而创建的关联作业)
ignored
当用户在特定时间内没有响应时)取消自己,除非用户执行
pay
行动
我在一个示例中使用的方法使用
perform_async
状态更改为
approved
,如果未及时响应,则取消:
Class Transaction < ApplicationRecord
#when approved
def create_worker
MyWorker.perform_async(self.id)
end
#if user responds in time, cancel the jobs and update the record to `paid` etc
def cancel_worker
jid = MyWorker.perform_async(self.id)
MyWorker.cancel! jid
end
end
按照建议
here
here
,我在worker中添加了关于何时取消的附加功能。它看起来像这样:
class MyWorker
include Sidekiq::Worker
def perform(transaction_id)
return if paid?
transaction = Transaction.find transaction_id
self.class.perform_in(1.minutes, transaction.ignore!)
end
def paid?
Sidekiq.redis { |c| c.exists("paid-#{jid}") }
end
def self.cancel! jid
Sidekiq.redis { |c| c.setex("paid-#{jid}", 86400, 1) }
end
end
此代码产生以下端子输出:
2018-12-16T01:40:50.645Z 30530 TID-oxm547nes MyWorker JID-6c97e448fe30998235dee95d INFO: start
Changing transaction 4 approved to ignored (event: ignore!)
2018-12-16T01:40:50.884Z 30530 TID-oxm547nes MyWorker JID-6c97e448fe30998235dee95d INFO: done: 0.239 sec
2018-12-16T01:41:56.122Z 30530 TID-oxm547oag MyWorker JID-b46bb3b002e00f480a04be16 INFO: start
2018-12-16T01:41:56.125Z 30530 TID-oxm547oag MyWorker JID-b46bb3b002e00f480a04be16 INFO: fail: 0.003 sec
2018-12-16T01:41:56.126Z 30530 TID-oxm547oag WARN: {"context":"Job raised exception","job":{"class":"MyWorker","args":[true],"retry":true,"queue":"default","jid":"b46bb3b002e00f480a04be16","created_at":1544924450.884224,"enqueued_at":1544924516.107598,"error_message":"Couldn't find Transaction with 'id'=true","error_class":"ActiveRecord::RecordNotFound","failed_at":1544924516.125679,"retry_count":0},"jobstr":"{\"class\":\"MyWorker\",\"args\":[true],\"retry\":true,\"queue\":\"default\",\"jid\":\"b46bb3b002e00f480a04be16\",\"created_at\":1544924450.884224,\"enqueued_at\":1544924516.107598}"}
6c97e448fe30998235dee95d
并立即将事务设置为
忽略
,然后是一个有点
b46bb3b002e00f480a04be16
这正好超过了工人们提前返回的时间
perform
函数(因为它不使用与第一个作业相同的jid)。
我可以猜测为什么这不能按我所希望的方式工作的一个原因是
MyWorker.cancel!
不能得到我的工人的圣杯
希望
创建数据库迁移以包含工作人员的jid是确保在操作之间可以访问jid的首选方法吗?这是怎么回事
id=true
进去吗?正如上面的错误所说:
Couldn't find Transaction with 'id'=true"