JasperReports 7.0.x Architecture Lab

Level 3: Application Integration • Chapter 3.4 Scriptlets & Lifecycle Event Hooks

Enterprise Ready (Java 17/21 / JRDefaultScriptlet / State Interception)

⚡ Warm-up Quick Fire (Anti-Forgetting Protocol: Chapter 3.3 Review)

Snowball Scenario Check

คำถาม: ในระบบที่คอนฟิก Font Extension และเปิดใช้งาน HarfBuzz Shaper ในบทที่ 3.3 สมบูรณ์แล้ว หากมีการคำนวณภาษีหรือสถิติเชิงซ้อนในแถว Detail Band โดยนักพัฒนาเขียน Business Logic แฝงใน Expression `$F{amount}.multiply(new BigDecimal("0.07")).add(...)` ร่วมกับ Method Calls ภายนอกซ้ำๆ 500,000 แถว จะก่อให้เกิดผลกระทบใดต่อ JVM และเหตุใดจึงควรย้าย Logic ไปยัง JRDefaultScriptlet หรือ Pre-calculation Pipeline?

เฉลยทางสถาปัตยกรรม: การยัด Complex Business Logic ใน JRXML Expression ทำให้โค้ด Evaluator Bytecode ที่ถูก Gen ออกมาเกิด Object Allocation Churn รุนแรงใน JVM Young Gen และไม่สามารถทำ State Accumulation ที่สะอาดได้ Scriptlet ช่วยดักจับ Event Lifecycle ของ `JRVerticalFiller` (เช่น `beforeDetailEval()`, `afterGroupInit()`) เพื่อคำนวณ State In-place และอัปเดตตัวแปรลงใน Report Variable Registry ได้อย่างเป็นระเบียบตามหลัก Clean Architecture

1. Contextual Anchoring & Dynamic Core Pillars

The "Why" & Real-world Problem: The Side-Effect Spaghetti & Memory Leak
ในงานรายงานระดับสถาบันการเงิน มักมีความจำเป็นต้องคำนวณค่าสะสมข้ามกลุ่ม (Cross-group Aggregations), บันทึก Transaction Audit Trail, หรือแปลงตัวเลขเป็นตัวอักษรทางกฎหมาย (Legal Currency Text / BahtText) ข้อผิดพลาดร้ายแรงที่สุดคือการเรียกใช้ Static Helper Class ที่มี Side-Effects แฝง หรือการเชื่อมต่อฐานข้อมูลภายนอก (External I/O) ภายใน Report Expression ส่งผลให้:

Pillar 1: Deterministic Lifecycle Interception

Scriptlet สืบทอดมาจาก JRDefaultScriptlet ทำหน้าที่เป็น Observer Hook ที่ผูกติดกับ Filler State Machine ได้แก่ beforeReportInit, beforeGroupInit, beforeDetailEval, afterDetailEval, และ afterReportInit

Pillar 2: Direct Variable Registry Mutation

สามารถอ่าน Field/Parameter และเขียนผลลัพธ์กลับสู่ Report Variable Registry ผ่านเมธอด setVariableValue("VAR_NAME", value) ทำให้ Template คงความสะอาด ไร้ Logic รกใน XML

Pillar 3: Instance Isolation & Concurrency Safety

JasperReports Engine จะสร้าง Instance ใหม่ของ Custom Scriptlet ต่อ 1 การเรียกใช้งาน JasperFillManager.fillReport() เสมอ ไม่มีการแชร์ Instance ข้ามเธรด รับประกัน Thread-safety

Pillar 4: Zero-I/O Architectural Boundary

สถาปัตยกรรมระดับ Enterprise กำหนดให้ Scriptlet เป็น In-Memory Pure Computational Engine เท่านั้น ห้ามทำ Network I/O, DB Connection, หรือ Disk Writes เด็ดขาด

2. Step 1: Deep Dive - Engine Lifecycle & Production Hazards

Failure Pattern Engine & JVM Mechanics Architectural Defense (Standard 7.0.x)
Double Counting on Band Overflow เมื่อ Band เกิดการตัดหน้า (Split) Engine อาจประเมิน Expression ซ้ำในหน้าถัดไป ทำให้ตัวแปรนับยอดสะสมเบิ้ล 2 ครั้ง ใช้ Hook afterDetailEval() หรือควบคุม Flag ผ่าน Scriptlet เพื่อป้องกันการนับซ้ำเมื่อแถวเดิมถูกประเมินใหม่
External Network Blocking การยิง HTTP/REST API ใน Scriptlet เพื่อแปลงสกุลเงิน ทำให้ Filler Thread บล็อกค้าง Latency พุ่งทะลุเพดาน ย้าย External I/O ออกไปทำใน Spring Boot Pre-processing ก่อนส่งข้อมูลเข้า JRDataSource
ClassNotFoundException on Build/Fill Scriptlet class ไม่ได้อยู่ใน Classpath ของ Compilation Plugin หรือ Runtime Classloader จัดแพ็กเกจ Scriptlet เป็น JAR ใน Application Dependency และระบุ FQCN ในแอตทริบิวต์ scriptletClass
Memory Retention in Custom State การเก็บสะสม Object หนักๆ ลงใน List/Map ภายใน Scriptlet ตลอดการ Fill 1 ล้านแถวทำให้ Heap เต็ม ล้าง State ใน afterGroupInit() หรือใช้ Primitive Accumulators เท่านั้น

3. Step 2: Architecture Implementation - Hands-on Studio

สลับแท็บเพื่อศึกษาและทดสอบทั้ง 2 ส่วน: Lab 3.4.1 (Java 21 Custom Scriptlet Class) และ Lab 3.4.2 (Unified Element Model JRXML 7.0.x)

TARGET PRODUCTION ARTIFACT (Commercial PDF A4) Scale: 100% (595 x 842 pt)
ENTERPRISE AUDIT & TAX CLEARANCE DISPATCH
DISPATCH REF: AUD-2026-0916-7781 LIFECYCLE HOOK: INTERCEPTOR_ACTIVE FISCAL REGION: APAC-TH
ENTITY: GLOBAL ENTERPRISE HOLDINGS PLC. BASE CURRENCY: THB
TRANSACTION REF ITEM DESCRIPTION BASE AMOUNT COMPUTED TAX (7%)
TXN-202609-001 Enterprise Cloud Infrastructure Tier-4 1,200,000.00 84,000.00
TXN-202609-002 High-Speed Dedicated Fiber Backbone 450,000.00 31,500.00
TXN-202609-003 Kubernetes Cluster Orchestration Node 880,000.00 61,600.00
TXN-202609-004 Hardware Security Module (HSM) Vault 2,100,000.00 147,000.00
TOTAL ASSESSED TAX (SCRIPTLET ACCUMULATED): 324,100.00 THB
VERIFIED LEGAL AUDIT CHECKSUM: 0x8FA4C90B2E1D
Enterprise Java 21 Scriptlet Implementation JRDefaultScriptlet Hook
คลิก "Verify & Lint Implementation" เพื่อตรวจสอบความถูกต้องตามมาตรฐาน 7.0.x และ Scriptlet Hooks...

4. Step 3: Architectural Knowledge Assessment (15 In-depth Questions)

ทดสอบความเข้าใจเชิงลึกเกี่ยวกับ Scriptlet Lifecycle Hooks, State Accumulation, Concurrency, Split Overflow, และ Clean Architecture

Score: 0 / 15 (0 answered)
0%