188 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
| .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
 | |
|    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
 | |
|    :alt: License: AGPL-3
 | |
| 
 | |
| =========
 | |
| Job Queue
 | |
| =========
 | |
| 
 | |
| This addon adds an integrated Job Queue to Odoo.
 | |
| 
 | |
| It allows to postpone method calls executed asynchronously.
 | |
| 
 | |
| Jobs are executed in the background by a ``Jobrunner``, in their own transaction.
 | |
| 
 | |
| Example:
 | |
| 
 | |
| .. code-block:: python
 | |
| 
 | |
|   from odoo import models, fields, api
 | |
|   from odoo.addons.queue_job.job import job
 | |
| 
 | |
|   class MyModel(models.Model):
 | |
|      _name = 'my.model'
 | |
| 
 | |
|      @api.multi
 | |
|      @job
 | |
|      def my_method(self, a, k=None):
 | |
|          _logger.info('executed with a: %s and k: %s', a, k)
 | |
| 
 | |
| 
 | |
|   class MyOtherModel(models.Model):
 | |
|       _name = 'my.other.model'
 | |
| 
 | |
|       @api.multi
 | |
|       def button_do_stuff(self):
 | |
|           self.env['my.model'].with_delay().my_method('a', k=2)
 | |
| 
 | |
| 
 | |
| In the snippet of code above, when we call ``button_do_stuff``, a job capturing
 | |
| the method and arguments will be postponed.  It will be executed as soon as the
 | |
| Jobrunner has a free bucket, which can be instantaneous if no other job is
 | |
| running.
 | |
| 
 | |
| 
 | |
| Features:
 | |
| 
 | |
| * Views for jobs, jobs are stored in PostgreSQL
 | |
| * Jobrunner: execute the jobs, highly efficient thanks to PostgreSQL's NOTIFY
 | |
| * Channels: give a capacity for the root channel and its sub-channels and
 | |
|   segregate jobs in them. Allow for instance to restrict heavy jobs to be
 | |
|   executed one at a time while little ones are executed 4 at a times.
 | |
| * Retries: Ability to retry jobs by raising a type of exception
 | |
| * Retry Pattern: the 3 first tries, retry after 10 seconds, the 5 next tries,
 | |
|   retry after 1 minutes, ...
 | |
| * Job properties: priorities, estimated time of arrival (ETA), custom
 | |
|   description, number of retries
 | |
| * Related Actions: link an action on the job view, such as open the record
 | |
|   concerned by the job
 | |
| 
 | |
| 
 | |
| Installation
 | |
| ============
 | |
| 
 | |
| Be sure to have the ``requests`` library.
 | |
| 
 | |
| Configuration
 | |
| =============
 | |
| 
 | |
| * Using environment variables and command line:
 | |
| 
 | |
|  * Adjust environment variables (optional):
 | |
| 
 | |
|   - ``ODOO_QUEUE_JOB_CHANNELS=root:4``
 | |
| 
 | |
|    - or any other channels configuration. The default is ``root:1``
 | |
| 
 | |
|   - if ``xmlrpc_port`` is not set: ``ODOO_QUEUE_JOB_PORT=8069``
 | |
| 
 | |
|  * Start Odoo with ``--load=web,base_sparse_field,queue_job``
 | |
|    and ``--workers`` greater than 1. [1]_
 | |
| 
 | |
| 
 | |
| * Using the Odoo configuration file:
 | |
| 
 | |
| .. code-block:: ini
 | |
| 
 | |
|   [options]
 | |
|   (...)
 | |
|   workers = 4
 | |
|   server_wide_modules = web,web_kanban,queue_job
 | |
| 
 | |
|   (...)
 | |
|   [queue_job]
 | |
|   channels = root:4
 | |
| 
 | |
| * Confirm the runner is starting correctly by checking the odoo log file:
 | |
| 
 | |
| .. code-block:: none
 | |
| 
 | |
|   ...INFO...queue_job.jobrunner.runner: starting
 | |
|   ...INFO...queue_job.jobrunner.runner: initializing database connections
 | |
|   ...INFO...queue_job.jobrunner.runner: queue job runner ready for db <dbname>
 | |
|   ...INFO...queue_job.jobrunner.runner: database connections ready
 | |
| 
 | |
| * Create jobs (eg using ``base_import_async``) and observe they
 | |
|   start immediately and in parallel.
 | |
| 
 | |
| * Tip: to enable debug logging for the queue job, use
 | |
|   ``--log-handler=odoo.addons.queue_job:DEBUG``
 | |
| 
 | |
| .. [1] It works with the threaded Odoo server too, although this way
 | |
|        of running Odoo is obviously not for production purposes.
 | |
| 
 | |
| Usage
 | |
| =====
 | |
| 
 | |
| To use this module, you need to:
 | |
| 
 | |
| #. Go to ``Job Queue`` menu
 | |
| 
 | |
| .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
 | |
|    :alt: Try me on Runbot
 | |
|    :target: https://runbot.odoo-community.org/runbot/230/10.0
 | |
| 
 | |
| Known issues / Roadmap
 | |
| ======================
 | |
| 
 | |
| * After creating a new database or installing ``queue_job`` on an
 | |
|   existing database, Odoo must be restarted for the runner to detect it.
 | |
| 
 | |
| * When Odoo shuts down normally, it waits for running jobs to finish.
 | |
|   However, when the Odoo server crashes or is otherwise force-stopped,
 | |
|   running jobs are interrupted while the runner has no chance to know
 | |
|   they have been aborted. In such situations, jobs may remain in
 | |
|   ``started`` or ``enqueued`` state after the Odoo server is halted.
 | |
|   Since the runner has no way to know if they are actually running or
 | |
|   not, and does not know for sure if it is safe to restart the jobs,
 | |
|   it does not attempt to restart them automatically. Such stale jobs
 | |
|   therefore fill the running queue and prevent other jobs to start.
 | |
|   You must therefore requeue them manually, either from the Jobs view,
 | |
|   or by running the following SQL statement *before starting Odoo*:
 | |
| 
 | |
| .. code-block:: sql
 | |
| 
 | |
|   update queue_job set state='pending' where state in ('started', 'enqueued')
 | |
| 
 | |
| Bug Tracker
 | |
| ===========
 | |
| 
 | |
| Bugs are tracked on `GitHub Issues
 | |
| <https://github.com/OCA/queue/issues>`_. In case of trouble, please
 | |
| check there if your issue has already been reported. If you spotted it first,
 | |
| help us smashing it by providing a detailed and welcomed feedback.
 | |
| 
 | |
| Credits
 | |
| =======
 | |
| 
 | |
| Images
 | |
| ------
 | |
| 
 | |
| * Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
 | |
| 
 | |
| Contributors
 | |
| ------------
 | |
| 
 | |
| * Guewen Baconnier <guewen.baconnier@camptocamp.com>
 | |
| * Stéphane Bidoul <stephane.bidoul@acsone.eu>
 | |
| * Matthieu Dietrich <matthieu.dietrich@camptocamp.com>
 | |
| * Jos De Graeve <Jos.DeGraeve@apertoso.be>
 | |
| * David Lefever <dl@taktik.be>
 | |
| * Laurent Mignon <laurent.mignon@acsone.eu>
 | |
| * Laetitia Gangloff <laetitia.gangloff@acsone.eu>
 | |
| 
 | |
| Maintainer
 | |
| ----------
 | |
| 
 | |
| .. image:: https://odoo-community.org/logo.png
 | |
|    :alt: Odoo Community Association
 | |
|    :target: https://odoo-community.org
 | |
| 
 | |
| This module is maintained by the OCA.
 | |
| 
 | |
| OCA, or the Odoo Community Association, is a nonprofit organization whose
 | |
| mission is to support the collaborative development of Odoo features and
 | |
| promote its widespread use.
 | |
| 
 | |
| To contribute to this module, please visit https://odoo-community.org.
 |