Skip to content

Basic Tasks

Sending Tasks

With OutboxCelery, tasks are sent exactly like regular Celery:

from myproject.celery_app import app

@app.task
def send_email(user_id: int, template: str):
    ...

# All these work:
send_email.delay(123, 'welcome')
send_email.apply_async(args=[123, 'welcome'])
send_email.apply_async(kwargs={'user_id': 123, 'template': 'welcome'})

Inside Transactions

The outbox pattern only makes sense inside transactions:

from django.db import transaction

with transaction.atomic():
    user = User.objects.create(email='test@example.com')
    send_email.delay(user.id, 'welcome')
# Both committed together

If the transaction rolls back, the task is never sent.

Task Signatures

Celery signatures are fully supported:

from celery import signature, chain, group, chord

# Signature
sig = send_email.s(123, 'welcome')
sig.delay()

# Chain
chain(step1.s(), step2.s(), step3.s()).delay()

# Group (parallel execution)
group(task.s(i) for i in range(10)).delay()

# Chord (group + callback)
chord(group(task.s(i) for i in range(10)), callback.s()).delay()