从 JAVA(MYSQL 插入语句)和 delayed_jobs ruby gem 处理的队列中手动输入延迟作业 table

Manually make entry in delayed jobs table from JAVA(MYSQL Insert statement) and queue processed by delayed_jobs ruby gem

在 Rails 中使用 ruby​​gem 我们在 delayed_jobs table 中使用语法

进行输入
 Delayed::Job.enqueue(MyJob.new(parameters), 0, 2.minutes.from_now, :queue => "queue1")

如何使用直接 mysql 语句在 delayed_jobs table 中执行相同的插入操作。主要是handler列,我必须插入什么值以及如何构造数据?

延迟工作 table 结构是

CREATE TABLE  `schema1`.`delayed_jobs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`priority` int(11) NOT NULL DEFAULT '0',
`attempts` int(11) NOT NULL DEFAULT '0',
`handler` text NOT NULL,
`last_error` text,
`run_at` datetime DEFAULT NULL,
`locked_at` datetime DEFAULT NULL,
`failed_at` datetime DEFAULT NULL,
`locked_by` varchar(255) DEFAULT NULL,
`queue` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `delayed_jobs_priority` (`priority`,`run_at`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

和class定义如下

class MyJob < Struct.new(parameters)
 def perform

 end
end  

Handler 列是一个 YAML 序列化的 Ruby 结构。它告诉 DelayedJob worker 调用哪个 worker 来处理作业。

例如,如果您有一份转换视频文件的工作,您可以在处理程序列中插入如下内容:

"--- !ruby/struct:VideoStreamer::ProcessVideoJob\nvideo_id: 68\n"

当 DelayedJob 从队列中取出该作业时,它将调用:

VideoStreamer::ProcessVideoJob.perform(video_id: 68)

也可以将更复杂的 ruby 结构序列化到队列中,但在处理程序字段中存在大小限制,因此尝试在队列而不是实际对象。

要将数据插入 MySQL,您可以使用常规 INSERT 语句。

我有类似的情况,我通过在 delayed_jobs 的 run_at 列中插入 UTC_TIMESTAMP 使它起作用。所以我的 sql 看起来像这样:

INSERT INTO delayed_jobs (handler, run_at, created_at, updated_at) VALUES ('--- !ruby/object:Delayed::PerformableMailer
object: !ruby/class \'MyMailer\'
method_name: :welcome_mail
args:
- 123', UTC_TIMESTAMP(), UTC_TIMESTAMP(), UTC_TIMESTAMP());

工作人员将检测此记录和运行我的方法。