Bird
Raised Fist0
Laravelframework~10 mins

Job chaining and batching in Laravel - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Job chaining and batching
Create Jobs
↓
Chain Jobs?
Yes→Set chain order
↓
Dispatch chained jobs
↓
Batch Jobs?
Yes→Create batch
↓
Dispatch batch
↓
Dispatch single job
↓
Job(s) execute in order or parallel
↓
Jobs complete with success/failure callbacks
This flow shows how Laravel creates jobs, optionally chains or batches them, dispatches, and then executes with callbacks.
Execution Sample
Laravel
use App\Jobs\Job1;
use App\Jobs\Job2;

Job1::withChain([new Job2()])->dispatch();
This code dispatches Job1 and chains Job2 to run after Job1 finishes.
Execution Table
StepActionJobs CreatedChain SetBatch CreatedDispatch ActionJob Execution OrderCallback Triggered
1Create Job1 instanceJob1NoNoNoNoneNo
2Create Job2 instance for chainJob1, Job2Yes (Job2 after Job1)NoNoNoneNo
3Dispatch Job1 with chainJob1, Job2YesNoJob1 dispatchedJob1 firstNo
4Job1 executesJob1, Job2YesNoJob1 runningJob1 runningNo
5Job1 completes successfullyJob1, Job2YesNoJob1 doneJob1 doneNo
6Job2 dispatched automatically after Job1Job1, Job2YesNoJob2 dispatchedJob2 nextNo
7Job2 executesJob1, Job2YesNoJob2 runningJob2 runningNo
8Job2 completes successfullyJob1, Job2YesNoJob2 doneJob2 doneSuccess callback triggered
9All chained jobs doneJob1, Job2YesNoNoAll doneChain complete callback triggered
10ExitJob1, Job2YesNoNoAll doneAll callbacks done
💡 All chained jobs executed in order; callbacks triggered after completion.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 6After Step 9
Jobs CreatedNoneJob1, Job2Job1, Job2Job1, Job2Job1, Job2
Chain SetNoYes (Job2 after Job1)YesYesYes
Batch CreatedNoNoNoNoNo
Dispatch ActionNoNoJob1 dispatchedJob2 dispatchedNo
Job Execution OrderNoneNoneJob1 firstJob2 nextAll done
Callback TriggeredNoNoNoNoChain complete callback
Key Moments - 3 Insights
Why does Job2 only start after Job1 finishes?
Because the chain sets Job2 to run only after Job1 completes successfully, as shown in execution_table step 6 where Job2 dispatch happens after Job1 done.
What happens if a job in the chain fails?
The chain stops executing further jobs and failure callbacks run. This is implied by the chain behavior in the execution_table where jobs run sequentially and callbacks trigger on success or failure.
How is batching different from chaining?
Batching runs multiple jobs in parallel as a group, while chaining runs jobs one after another. Our example shows chaining with no batch created (Batch Created stays 'No').
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4. What is the job execution order?
AJob1 is running
BJob2 is running
CBoth Job1 and Job2 running in parallel
DNo job running
💡 Hint
Check the 'Job Execution Order' column at step 4 in the execution_table.
At which step does Job2 get dispatched automatically?
AStep 3
BStep 6
CStep 5
DStep 7
💡 Hint
Look for 'Job2 dispatched' in the 'Dispatch Action' column in the execution_table.
If we added a batch instead of a chain, which variable would change in variable_tracker?
AChain Set
BJobs Created
CBatch Created
DCallback Triggered
💡 Hint
Check the 'Batch Created' row in variable_tracker to see when batches are created.
Concept Snapshot
Laravel Job Chaining & Batching:
- Chain jobs to run one after another using withChain()
- Batch jobs to run many in parallel using Bus::batch()
- Dispatch chains or batches to queue
- Callbacks run on success or failure
- Chains run sequentially; batches run concurrently
Full Transcript
In Laravel, you create jobs to do tasks. You can chain jobs so one runs after another finishes, or batch jobs to run many at once. When you chain jobs, Laravel waits for the first job to finish before starting the next. If a job fails, the chain stops. Batching runs jobs in parallel and lets you track progress. This example shows creating two jobs, chaining them, dispatching the first, then the second runs automatically after the first completes. Callbacks run after all jobs finish. This helps organize complex tasks in order or groups.

Practice

(1/5)
1. What is the main difference between job chaining and job batching in Laravel?
easy
A. Job chaining is for database tasks only; job batching is for email tasks only.
B. Job chaining runs jobs in parallel; job batching runs jobs sequentially.
C. Job chaining runs jobs one after another; job batching runs jobs together and tracks progress.
D. Job chaining requires manual tracking; job batching does not track progress.

Solution

  1. Step 1: Understand job chaining

    Job chaining runs jobs one after another in a specific order.
  2. Step 2: Understand job batching

    Job batching runs many jobs together and tracks their progress as a group.
  3. Final Answer:

    Job chaining runs jobs one after another; job batching runs jobs together and tracks progress. -> Option C
  4. Quick Check:

    Job chaining = sequential, Job batching = grouped with progress [OK]
Hint: Chaining = sequence; batching = group with progress tracking [OK]
Common Mistakes:
  • Confusing parallel and sequential execution
  • Thinking batching runs jobs one by one
  • Assuming chaining tracks progress automatically
2. Which of the following is the correct syntax to chain two jobs JobA and JobB in Laravel?
easy
A. JobA::chain([new JobB])->dispatch();
B. JobA::dispatch()->chain([JobB]);
C. dispatch(new JobA)->chain(new JobB);
D. dispatch(new JobA)->chain([new JobB]);

Solution

  1. Step 1: Recall chaining syntax

    In Laravel, chaining jobs uses dispatch(new JobA)->chain([new JobB]).
  2. Step 2: Check options for correct method calls

    dispatch(new JobA)->chain([new JobB]); matches the correct syntax with dispatch(new JobA)->chain([new JobB]);.
  3. Final Answer:

    dispatch(new JobA)->chain([new JobB]); -> Option D
  4. Quick Check:

    dispatch + chain array = correct chaining syntax [OK]
Hint: Use dispatch(new Job)->chain([jobs]) for chaining [OK]
Common Mistakes:
  • Calling chain() on the job class instead of dispatch
  • Passing a single job without array to chain()
  • Using incorrect method order
3. Given the following code, what will be the output in the logs if all jobs succeed?
Bus::batch([
    new Job1(),
    new Job2(),
    new Job3()
])->then(function () {
    Log::info('Batch completed successfully');
})->dispatch();
medium
A. Logs 'Batch completed successfully' immediately after dispatch.
B. Logs 'Batch completed successfully' after all jobs finish.
C. No logs will be created because then() is not supported.
D. Logs 'Batch failed' if any job fails.

Solution

  1. Step 1: Understand batch then() callback

    The then() callback runs after all jobs in the batch succeed.
  2. Step 2: Analyze the code behavior

    Since all jobs succeed, the callback logs 'Batch completed successfully' after finishing.
  3. Final Answer:

    Logs 'Batch completed successfully' after all jobs finish. -> Option B
  4. Quick Check:

    Batch then() runs after success [OK]
Hint: then() runs after all batch jobs succeed [OK]
Common Mistakes:
  • Thinking then() runs immediately after dispatch
  • Assuming then() runs on failure
  • Believing no logs are created
4. Identify the error in this job chaining code:
dispatch(new JobA)->chain(new JobB);
medium
A. chain() expects an array of jobs, not a single job instance.
B. dispatch() cannot be used with chaining.
C. JobB must be dispatched separately before chaining.
D. JobA must be a queued job class, not a job instance.

Solution

  1. Step 1: Check chain() parameter requirements

    The chain() method requires an array of job instances.
  2. Step 2: Analyze the code

    The code passes a single job instance new JobB without wrapping it in an array.
  3. Final Answer:

    chain() expects an array of jobs, not a single job instance. -> Option A
  4. Quick Check:

    chain() needs array of jobs [OK]
Hint: Always pass an array to chain(), even for one job [OK]
Common Mistakes:
  • Passing a single job without array to chain()
  • Trying to dispatch chained jobs separately
  • Confusing dispatch and chain usage
5. You want to run three jobs JobX, JobY, and JobZ where JobY should only run after JobX completes, but JobZ can run anytime in parallel. Which Laravel approach correctly handles this?
hard
A. Use job chaining for JobX and JobY, and dispatch JobZ separately.
B. Use job batching for all three jobs together.
C. Chain JobX, JobY, and JobZ in one chain to run sequentially.
D. Dispatch all three jobs separately without chaining or batching.

Solution

  1. Step 1: Understand job dependencies

    JobY depends on JobX finishing first, so they must run sequentially.
  2. Step 2: Consider JobZ's independence

    JobZ can run anytime, so it should run separately in parallel.
  3. Step 3: Choose correct Laravel approach

    Use chaining for JobX and JobY, and dispatch JobZ separately to run in parallel.
  4. Final Answer:

    Use job chaining for JobX and JobY, and dispatch JobZ separately. -> Option A
  5. Quick Check:

    Chain dependent jobs, dispatch independent jobs separately [OK]
Hint: Chain dependent jobs; dispatch independent jobs separately [OK]
Common Mistakes:
  • Batching all jobs when order matters only for some
  • Chaining all jobs forcing sequential run
  • Ignoring job dependencies