=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.
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;
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);
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);
}
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) = @_;
[% 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: