Grails: Simpan catatan audit terlepas dari keberhasilan/kegagalan?

Di Grails, pola apa yang direkomendasikan untuk menulis catatan audit untuk tindakan tertentu terlepas dari bagaimana transaksi tersebut berakhir? Contoh: Upaya pendaftaran pengguna online yang mungkin gagal karena sejumlah alasan.

Asumsi dasar, logika bisnis terbatas pada metode layanan transaksional.

Ketidakpastian yang mendasari: Haruskah saya membatalkan transaksi dengan memasukkan RuntimeException ke dalam layanan? Panduan Grails menyiratkan demikian, tetapi Burt Beckwith pernah berkata (sambil tertawa, saya yakin) ini seperti memukul diri sendiri dengan palu untuk mendapatkan perhatian.

Mengingat logika bertele-tele dengan beberapa pemeriksaan, akan lebih mudah untuk memberikan pengecualian ketika konflik terdeteksi. Keseluruhan transaksi harus dibatalkan, namun catatan audit harus tetap ditulis.

Catatan Ada beberapa plugin Grails audit, tetapi plugin tersebut mencatat perubahan pada objek domain yang dikomit.


person sodastream    schedule 31.05.2015    source sumber


Jawaban (1)


Dalam aplikasi kami, kami menggunakan plugin Platform Core untuk ini. Pada dasarnya ketika beberapa hal menarik terjadi, seperti:

  • Pengguna masuk
  • Pengguna baru mendaftar
  • Pengguna membuat instance baru dari beberapa objek bisnis
  • Pengguna menghapus sesuatu
  • dll...

Kami menjalankan acara, seperti ini:

event(
    'myApp.activity', [
    userId: userService.currentUser?.id,
    detail: [name: "some useful information about this activity", timestamp: new Date(), ...],
    activityType: ActivityType.CREATED,
    action: "create",
    ...
])

Kita kemudian dapat mendefinisikan metode di kelas layanan lain yang mendengarkan beberapa peristiwa ini, misalnya.

@Listener(topic="myApp.activity")
def audit(parameters) {
    //create an audit record for the thing that just happened
}

Manfaatnya adalah

  • itu menjauhkan hal-hal lintas sektoral seperti logika audit dari logika aplikasi Anda yang lain
  • audit dilakukan di thread terpisah (sehingga tidak terlibat dalam transaksi yang sama dengan yang memicu peristiwa tersebut)
  • Anda dapat menetapkan beberapa metode pendengar ke satu aktivitas sehingga Anda memiliki opsi lain untuk memperluas aplikasi Anda nanti
person rcgeorge23    schedule 31.05.2015
comment
Jelas dan bagus secara arsitektural. Aku akan melakukannya! - person sodastream; 01.06.2015