Commit f6a3f831 authored by Gervase Markham's avatar Gervase Markham Committed by Gervase Markham

Allow extensions to add new Jobs. r,a=mkanat.

parent 237e21f0
......@@ -730,6 +730,23 @@ database when run.
=back
=head2 job_map
Bugzilla has a system - L<Bugzilla::JobQueue> - for running jobs
asynchronously, if the administrator has set it up. This hook allows the
addition of mappings from job names to handler classes, so an extension can
fire off jobs.
Params:
=over
=item C<job_map> - The job map hash. Key: the name of the job, as should be
passed to Bugzilla->job_queue->insert(). Value: the name of the Perl module
which implements the task (an instance of L<TheSchwartz::Worker>).
=back
=head2 mailer_before_send
Called right before L<Bugzilla::Mailer> sends a message to the MTA.
......
......@@ -35,6 +35,16 @@ use constant JOB_MAP => {
send_mail => 'Bugzilla::Job::Mailer',
};
sub job_map {
if (!defined(Bugzilla->request_cache->{job_map})) {
my $job_map = JOB_MAP;
Bugzilla::Hook::process('job_map', { job_map => $job_map });
Bugzilla->request_cache->{job_map} = $job_map;
}
return Bugzilla->request_cache->{job_map};
}
sub new {
my $class = shift;
......@@ -69,7 +79,7 @@ sub insert {
my $self = shift;
my $job = shift;
my $mapped_job = JOB_MAP->{$job};
my $mapped_job = Bugzilla::JobQueue->job_map()->{$job};
ThrowCodeError('jobqueue_no_job_mapping', { job => $job })
if !$mapped_job;
unshift(@_, $mapped_job);
......
......@@ -201,7 +201,7 @@ sub gd_run {
my $jq = Bugzilla->job_queue();
$jq->set_verbose($self->{debug});
foreach my $module (values %{ Bugzilla::JobQueue::JOB_MAP() }) {
foreach my $module (values %{ Bugzilla::JobQueue->job_map() }) {
eval "use $module";
$jq->can_do($module);
}
......
......@@ -386,6 +386,20 @@ sub install_before_final_checks {
print "Install-before_final_checks hook\n" unless $args->{silent};
}
sub job_map {
my ($self, $args) = @_;
my $job_map = $args->{job_map};
# This adds the named class (an instance of TheSchwartz::Worker) as a
# handler for when a job is added with the name "some_task".
$job_map->{'some_task'} = 'Bugzilla::Extension::Example::Job::SomeClass';
# Schedule a job like this:
# my $queue = Bugzilla->job_queue();
# $queue->insert('some_task', { some_parameter => $some_variable });
}
sub mailer_before_send {
my ($self, $args) = @_;
......
......@@ -304,7 +304,8 @@
[% ELSIF error == "jobqueue_no_job_mapping" %]
<code>Bugzilla::JobQueue</code> has not been configured to handle
the job "[% job FILTER html %]". You need to add this job type
to the <code>JOB_MAP</code> constant in <code>Bugzilla::JobQueue</code>.
to the <code>JOB_MAP</code> constant in <code>Bugzilla::JobQueue</code>,
perhaps by using the 'job_map' hook.
[% ELSIF error == "ldap_bind_failed" %]
Failed to bind to the LDAP server. The error message was:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment