Queue¶
Modèles¶
- 
class 
odoo.addons.queue_job.models.base.Base(pool, cr)[source]¶ Bases :
odoo.models.BaseModelThe 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
DelayableRecordsetThe 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
writeis 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_INTERVALseconds. 
Indicates that a method of a Model can be delayed in the Job Queue.
When a method has the
@jobdecorator, its calls can then be delayed with:recordset.with_delay(priority=10).the_method(args, **kwargs)
Where
the_methodis the method decorated with@job. Its arguments and keyword arguments will be kept in the Job Queue for its asynchronous execution.default_channelindicates in which channel the job must be executedretry_patternis 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
actionmust 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
kwargssont 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 :
objectAllow to delay a method for a recordset
Utilisation
delayable = DelayableRecordset(recordset, priority=20) delayable.method(args, kwargs)
methodmust 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 :
objectUn 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.
-