Lewati ke konten

E08 — Compensation Event

KodeE08
Nama BPMNCompensation Event
TierA (wajib dikuasai)
DiperkenalkanModul 9
SpesifikasiOMG BPMN 2.0.2 §10.4.7 TODO-VERIFY

E08 — Compensation Event: simbol ◀◀ (dua panah kiri) di dalam lingkaran
Unduh .bpmn

Memuat diagram…

Simbol: lingkaran dengan ◀◀ (dua panah ke kiri, seperti “rewind”) di dalamnya.

Dua varian utama:

  • Compensation Boundary Event: menempel di tepi aktivitas (Subprocess atau Task). Mendaftarkan Compensation Handler untuk aktivitas itu.
  • Intermediate Throw Compensation Event: lingkaran dengan ◀◀ filled. Mentrigger kompensasi.

Cara membuat di demo.bpmn.io: Untuk Boundary: klik elemen → “Append Boundary Event” → “Compensation”. Untuk Throw: klik ganda canvas → “Intermediate Throwing Event” → ubah ke “Compensation”.


Compensation Event menyatakan dua hal yang berbeda tergantung konteks:

  • Boundary: “Aktivitas ini dapat dibalikkan. Jika kompensasi ditrigger, jalankan handler yang terhubung ke event ini.”
  • Throw: “Triggerkan kompensasi — jalankan semua handler yang terdaftar untuk aktivitas yang sudah selesai.”

Memungkinkan pembalikan aktivitas yang sudah berhasil diselesaikan ketika situasi berubah (pembatalan, rollback). Menyatakan hubungan eksplisit antara aktivitas dan pembaliknya dalam model.


Ketika Intermediate Throw Compensation Event dieksekusi:

  1. Engine memeriksa scope — aktivitas mana yang sudah selesai dan memiliki Compensation Handler terdaftar.
  2. Handler dipanggil dalam urutan terbalik dari urutan eksekusi asli.
  3. Setelah semua handler selesai, token melanjutkan ke Sequence Flow setelah Throw Event.

Compensation Boundary Event tidak memiliki incoming Sequence Flow. Ia dihubungkan ke Handler via Association (bukan Sequence Flow).


Gunakan Compensation Event ketika:

  • Aktivitas yang sudah berhasil dilakukan perlu “dibalikkan” (rollback).
  • Ada beberapa aktivitas yang perlu dibalikkan dalam urutan tertentu.
  • Pembalikan harus terkait eksplisit ke aktivitas aslinya dalam model.

Jangan gunakan Compensation untuk menangani kegagalan teknis — gunakan Error Event. Jangan gunakan Compensation jika pembalikan hanya perlu satu task sederhana yang tidak terkait ke aktivitas sebelumnya.


Dalam Modul 9:

  • Ketika customer membatalkan pesanan, Intermediate Throw Compensation Event dipanggil.
  • Engine menemukan: Subprocess “Pemenuhan” sudah selesai → handler “Batalkan pemenuhan” dipanggil.
  • Engine menemukan: Task “Serahkan ke kurir” sudah selesai → handler “Tarik paket dari kurir” dipanggil.
  • Urutan: pembalikan dilakukan dalam urutan terbalik dari eksekusi asli.

Compensation Boundary Events dan Intermediate Throw Compensation Event di jalur pembatalan
Unduh .bpmn

Memuat diagram…


  1. Temukan lingkaran dengan ◀◀ menempel di tepi aktivitas → Compensation Boundary Event.
  2. Ikuti Association (panah putus-putus) ke Compensation Handler Task.
  3. Cari Intermediate Throw Compensation Event (◀◀ filled) di alur utama → ini adalah trigger.
  4. Ketika trigger dieksekusi, semua handler yang terdaftar akan dipanggil.

“Compensation disamakan task ‘Refund’ biasa.”

Task “Refund” tidak terikat ke aktivitas yang dibalikkan. Jika prosedur kemas berubah, task refund tidak ikut berubah. Compensation Boundary Event menyatakan hubungan “ini adalah kebalikan dari X” secara eksplisit dalam model.


Anti-pattern: Sequence Flow dari Compensation Handler.

Gejala: Handler terhubung ke task berikutnya via Sequence Flow.

Diagnosis: Handler tidak boleh memiliki Sequence Flow masuk atau keluar ke elemen lain. Handler dieksekusi oleh engine, bukan via Sequence Flow. Menambahkan Sequence Flow dari handler melanggar semantik BPMN.


ElemenBedanya
Compensation Event (E08)Membalikkan aktivitas yang sudah selesai
Error Event (E06)Menangkap exception selama eksekusi
Task “Refund” biasaSatu tindakan tanpa keterkaitan eksplisit ke aktivitas yang dibalik

  • Membalikkan aktivitas yang sudah berhasil → Compensation.
  • Menangkap exception saat aktivitas berlangsung → Error Boundary.
  • Satu tindakan pembalikan sederhana → Task biasa.

  • Apakah ada aktivitas yang perlu “dibalikkan” jika pembatalan terjadi? → Compensation Boundary.
  • Apakah perlu trigger untuk memulai pembalikan? → Intermediate Throw Compensation.
  • Apakah pembalikan perlu terjadi dalam urutan terbalik? → Compensation (otomatis).

Dalam Modul 9, Compensation dipilih karena ada dua aktivitas berbeda yang perlu dibalikkan (pemenuhan dan pengiriman kurir) ketika customer membatalkan. Task “Refund” biasa tidak bisa memodelkan ketergantungan antara “apa yang sudah dilakukan” dan “apa yang harus dibalikkan” secara eksplisit.


  • Compensation Boundary harus terhubung ke Compensation Handler via Association, bukan Sequence Flow.
  • Handler harus memiliki atribut isForCompensation="true".
  • Intermediate Throw Compensation mentrigger semua handler dalam scope saat ini.

Di Camunda, Compensation didukung natively. Handler dieksekusi secara synchronous setelah Throw Event. Pastikan handler tidak melempar exception karena itu bisa memutus alur kompensasi.


Compensation Event menyatakan pembalikan aktivitas yang sudah selesai — Boundary mendaftarkan handler, Throw mentrigger semua handler terdaftar secara otomatis dalam urutan terbalik.