Queue¶
Modèles¶
-
class
odoo.addons.queue_job.models.base.
Base
(pool, cr)[source]¶ Bases :
odoo.models.BaseModel
The base model, which is implicitly inherited by all models.
-
with_delay
(priority=None, eta=None, max_retries=None, description=None, channel=None, identity_key=None)[source]¶ Return a
DelayableRecordset
The returned instance allow to enqueue any method of the recordset’s Model which is decorated by
job()
.Utilisation
self.env['res.users'].with_delay().write({'name': 'test'})
In the line above, in so far
write
is allowed to be delayed with@job
, the write will be executed in an asynchronous job.Paramètres: - priority – Priority of the job, 0 being the higher priority. Default is 10.
- eta – Heure estimée de lancement (ETA) du job. Il ne sera pas exécuté avant cette date/heure.
- max_retries – maximum number of retries before giving up and set the job state to “failed”. A value of 0 means infinite retries. Default is 5.
- description – human description of the job. If None, description is computed from the function doc or name
- channel – the complete name of the channel to use to process the function. If specified it overrides the one defined on the function
- identity_key – key uniquely identifying the job, if specified and a job with the same key has not yet been run, the new job will not be added.
Renvoie: instance of a DelayableRecordset
Type renvoyé: Note for developers: if you want to run tests or simply disable jobs queueing for debugging purposes, you can:
- set the env var TEST_QUEUE_JOB_NO_DELAY=1
- pass a ctx key test_queue_job_no_delay=1
In tests you’ll have to mute the logger like:
@mute_logger(“odoo.addons.queue_job.models.base”)
-
-
class
odoo.addons.queue_job.models.queue_job.
QueueJob
(pool, cr)[source]¶ État du job et résultat
-
_name
= 'queue.job'¶
-
_inherit
= ['mail.thread', 'ir.needaction_mixin']¶
-
Job¶
Decorators¶
-
odoo.addons.queue_job.job.
job
(func=None, default_channel='root', retry_pattern=None)[source]¶ Décorateur pour les jobs.
Optional argument:
Paramètres: - default_channel – the channel wherein the job will be assigned. This channel is set at the installation of the module and can be manually changed later using the views.
- retry_pattern (dict(retry_count,retry_eta_seconds)) – The retry pattern to use for postponing a job.
If a job is postponed and there is no eta
specified, the eta will be determined from the
dict in retry_pattern. When no retry pattern
is provided, jobs will be retried after
RETRY_INTERVAL
seconds.
Indicates that a method of a Model can be delayed in the Job Queue.
When a method has the
@job
decorator, its calls can then be delayed with:recordset.with_delay(priority=10).the_method(args, **kwargs)
Where
the_method
is the method decorated with@job
. Its arguments and keyword arguments will be kept in the Job Queue for its asynchronous execution.default_channel
indicates in which channel the job must be executedretry_pattern
is a dict where keys are the count of retries and the values are the delay to postpone a job.Exemple :
class ProductProduct(models.Model): _inherit = 'product.product' @api.multi @job def export_one_thing(self, one_thing): # work # export one_thing # [...] env['a.model'].export_one_thing(the_thing_to_export) # => normal and synchronous function call env['a.model'].with_delay().export_one_thing(the_thing_to_export) # => the job will be executed as soon as possible delayable = env['a.model'].with_delay(priority=30, eta=60*60*5) delayable.export_one_thing(the_thing_to_export) # => the job will be executed with a low priority and not before a # delay of 5 hours from now @job(default_channel='root.subchannel') def export_one_thing(one_thing): # work # export one_thing @job(retry_pattern={1: 10 * 60, 5: 20 * 60, 10: 30 * 60, 15: 12 * 60 * 60}) def retryable_example(): # 5 first retries postponed 10 minutes later # retries 5 to 10 postponed 20 minutes later # retries 10 to 15 postponed 30 minutes later # all subsequent retries postponed 12 hours later raise RetryableJobError('Must be retried later') env['a.model'].with_delay().retryable_example()
Voir aussi :
related_action()
une action connexe peut être attachée à un job
Attache une action connexe à un job
Un action connexe apparaîtra comme un bouton dans la vue Odoo. Le bouton exécutera l’action, habituellement une ouverture de formulaire de l’enregistrement lié au job.
The
action
must be a method on the queue.job model.Exemple d’utilisation :
class QueueJob(models.Model): _inherit = 'queue.job' @api.multi def related_action_partner(self): self.ensure_one() model = self.model_name partner = self.env[model].browse(self.record_ids) # possibly get the real ID if partner_id is a binding ID action = { 'name': _("Partner"), 'type': 'ir.actions.act_window', 'res_model': model, 'view_type': 'form', 'view_mode': 'form', 'res_id': partner.id, } return action class ResPartner(models.Model): _inherit = 'res.partner' @api.multi @job @related_action(action='related_action_partner') def export_partner(self): # ...
Les
kwargs
sont transmis à l’action :class QueueJob(models.Model): _inherit = 'queue.job' @api.multi def related_action_product(self, extra_arg=1): assert extra_arg == 2 model = self.model_name ... class ProductProduct(models.Model): _inherit = 'product.product' @api.multi @job @related_action(action='related_action_product', extra_arg=2) def export_product(self): # ...
Internals¶
-
class
odoo.addons.queue_job.job.
DelayableRecordset
(recordset, priority=None, eta=None, max_retries=None, description=None, channel=None, identity_key=None)[source]¶ Bases :
object
Allow to delay a method for a recordset
Utilisation
delayable = DelayableRecordset(recordset, priority=20) delayable.method(args, kwargs)
method
must be a method of the recordset’s Model, decorated withjob()
.The method call will be processed asynchronously in the job queue, with the passed arguments.
-
class
odoo.addons.queue_job.job.
Job
(func, args=None, kwargs=None, priority=None, eta=None, job_uuid=None, max_retries=None, description=None, channel=None, identity_key=None)[source]¶ Bases :
object
Un job est une tâche à exécuter.
-
uuid
¶ Id (UUID) du job.
-
state
¶ État du job, peut être en attente, en queue, démarré, terminé, échoué. L’état initial est en attente et l’état final est terminé.
-
retry
¶ L’essai actuel, démarre à 0 et s’incrémente de 1 chaque fois que le job est exécuté.
-
max_retries
¶ Le nombre maximum d’essais permis avant que le job soit considéré comme échoué.
-
args
¶ Arguments transmis à la fonction pendant l’exécution.
-
kwargs
¶ Arguments nommés transmis à la fonction pendant l’exécution.
-
description
¶ Description du job à destination des utilisateurs.
-
func
¶ La fonction Python elle-même.
-
model_name
¶ Modèle Odoo pour lequel le job va fonctionner.
-
priority
¶ Priorité du job, 0 étant la plus haute priorité.
-
date_created
¶ Date et heure de création du job.
-
date_enqueued
¶ Date et heure de mise en queue du job.
-
date_started
¶ Date et heure de démarrage du job.
-
date_done
¶ Date et heure d’arrêt du job.
-
result
¶ Une description du résultat (à destination des utilisateurs).
-
user_id
¶ Id de l’utilisateur Odoo qui a créé le job
-
eta
¶ Heure estimée de lancement (ETA) du job. Il ne sera pas exécuté avant cette date/heure.
-
recordset
¶ Model recordset when we are on a delayed Model method
-
job_record_with_same_identity_key
()[source]¶ Check if a job to be executed with the same key exists.
-
classmethod
enqueue
(func, args=None, kwargs=None, priority=None, eta=None, max_retries=None, description=None, channel=None, identity_key=None)[source]¶ Create a Job and enqueue it in the queue. Return the job.
S’attend à ce que les arguments spécifiques au job soient déjà extraites de ceux à passer à la fonction du job.
If the identity key is the same than the one in a pending job, no job is created and the existing job is returned
-
func
-
identity_key
¶
-
description
-
uuid
Id du job, c’est un UUID
-
eta
-
postpone
(result=None, seconds=None)[source]¶ Écrit un heure estimée de lancement dans n secondes. Utilisé quand une Exception non fatale souhaite relancer un job.
-