Grails: จัดเก็บบันทึกการตรวจสอบโดยไม่คำนึงถึงความสำเร็จ/ความล้มเหลวใช่หรือไม่

ใน Grails รูปแบบที่แนะนำในการเขียนบันทึกการตรวจสอบสำหรับการดำเนินการบางอย่างคืออะไร ไม่ว่าธุรกรรมจะสิ้นสุดอย่างไร ตัวอย่าง: ความพยายามในการลงทะเบียนผู้ใช้ออนไลน์ที่อาจล้มเหลวด้วยเหตุผลหลายประการ

สมมติฐานพื้นฐาน ตรรกะทางธุรกิจจำกัดอยู่เพียงวิธีการบริการธุรกรรม

ความไม่แน่นอนพื้นฐาน: ฉันควรยกเลิกธุรกรรมโดยโยน RuntimeException ในบริการหรือไม่ คู่มือ Grails มีความหมายเช่นนั้น แต่ เบิร์ต เบ็ควิธเคยกล่าวไว้ (ฉันแน่ใจว่าฉันหัวเราะเบาๆ) มันเหมือนกับการทุบตัวเองด้วยค้อนเพื่อดูแลตัวเอง

เนื่องจากตรรกะที่ยืดยาวและมีการตรวจสอบหลายครั้ง จึงสะดวกที่จะโยนข้อยกเว้นเมื่อตรวจพบข้อขัดแย้ง ธุรกรรมโดยรวมควรถูกย้อนกลับ แต่ควรเขียนบันทึกการตรวจสอบให้เหมือนกันทั้งหมด

เอ็นบี มีปลั๊กอิน Grails การตรวจสอบหลายรายการ แต่จะบันทึกการเปลี่ยนแปลงไปยังออบเจ็กต์โดเมนที่คอมมิต


person sodastream    schedule 31.05.2015    source แหล่งที่มา


คำตอบ (1)


ในแอปพลิเคชันของเรา เราใช้ปลั๊กอิน Platform Core สำหรับสิ่งนี้ โดยพื้นฐานแล้วเมื่อมีเรื่องน่าสนใจเกิดขึ้น เช่น:

  • ผู้ใช้เข้าสู่ระบบ
  • ผู้ใช้ใหม่สมัครใช้งาน
  • ผู้ใช้สร้างอินสแตนซ์ใหม่ของวัตถุทางธุรกิจบางอย่าง
  • ผู้ใช้ลบบางสิ่งบางอย่าง
  • ฯลฯ...

เราเริ่มกิจกรรมเช่นนี้:

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

จากนั้นเราสามารถกำหนดวิธีการในคลาสบริการอื่นที่รับฟังเหตุการณ์เหล่านี้บางส่วนได้ เช่น

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

ประโยชน์ที่ได้รับคือ

  • มันเก็บสิ่งที่ตัดขวางเช่นตรรกะการตรวจสอบให้ห่างจากตรรกะที่เหลือของแอปพลิเคชันของคุณ
  • การตรวจสอบจะดำเนินการในเธรดแยกต่างหาก (ดังนั้นจึงไม่เกี่ยวข้องกับธุรกรรมเดียวกันกับสิ่งที่ทำให้เกิดเหตุการณ์)
  • คุณสามารถกำหนดวิธีการฟังหลายวิธีให้กับกิจกรรมเดียวเพื่อให้คุณมีตัวเลือกอื่นสำหรับการขยายแอปพลิเคชันของคุณในภายหลัง
person rcgeorge23    schedule 31.05.2015
comment
ชัดเจนและเสียงทางสถาปัตยกรรม ฉันจะไปหามัน! - person sodastream; 01.06.2015