|  | @@ -172,6 +172,44 @@ The callbacks/errbacks will then be called in order, and all
 | 
	
		
			
				|  |  |  callbacks will be called with the return value of the parent task
 | 
	
		
			
				|  |  |  as a partial argument.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +.. _calling-on-message:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +On message
 | 
	
		
			
				|  |  | +============================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Celery supports catching all states changes by setting on_message callback.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For example for long-running tasks to send task progress you can do something like this:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @app.task(bind=True)
 | 
	
		
			
				|  |  | +    def hello(self, a, b):
 | 
	
		
			
				|  |  | +        time.sleep(1)
 | 
	
		
			
				|  |  | +        self.update_state(state="PROGRESS", meta={'progress': 50})
 | 
	
		
			
				|  |  | +        time.sleep(1)
 | 
	
		
			
				|  |  | +        self.update_state(state="PROGRESS", meta={'progress': 90})
 | 
	
		
			
				|  |  | +        time.sleep(1)
 | 
	
		
			
				|  |  | +        return 'hello world: %i' % (a+b)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: python
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def on_raw_message(body):
 | 
	
		
			
				|  |  | +        print(body)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    r = hello.apply_async()
 | 
	
		
			
				|  |  | +    print(r.get(on_message=on_raw_message, propagate=False))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Will generate output like this:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.. code-block:: 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    {'task_id': '5660d3a3-92b8-40df-8ccc-33a5d1d680d7', 'result': {'progress': 50}, 'children': [], 'status': 'PROGRESS', 'traceback': None}
 | 
	
		
			
				|  |  | +    {'task_id': '5660d3a3-92b8-40df-8ccc-33a5d1d680d7', 'result': {'progress': 90}, 'children': [], 'status': 'PROGRESS', 'traceback': None}
 | 
	
		
			
				|  |  | +    {'task_id': '5660d3a3-92b8-40df-8ccc-33a5d1d680d7', 'result': 'hello world: 10', 'children': [], 'status': 'SUCCESS', 'traceback': None}
 | 
	
		
			
				|  |  | +    hello world: 10
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  .. _calling-eta:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ETA and Countdown
 |