从 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 中使用 rubygem 我们在 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());
工作人员将检测此记录和运行我的方法。
在 Rails 中使用 rubygem 我们在 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());
工作人员将检测此记录和运行我的方法。