שילוב האביב של דרולים

1. הקדמה

במדריך מהיר זה, אנו הולכים לשלב את דרולים עם אביב. אם אתה רק מתחיל עם דרולים, עיין במאמר המבוא הזה.

2. תלות Maven

נתחיל בהוספת התלות הבאות שלנו pom.xml קוֹבֶץ:

 org.drools ריריות הליבה 7.0.0. Final org.kie kie-spring 7.0.0.Final 

הגרסאות העדכניות ביותר ניתן למצוא כאן עבור רירויות הליבה וכאן לקפיץ.

3. נתונים ראשוניים

בואו נגדיר את הנתונים שישמשו בדוגמה שלנו. אנו מתכוונים לחשב את מחיר הנסיעה לפי המרחק שעבר והדגל בתוספת תשלום לילה.

הנה אובייקט פשוט שישמש כ עוּבדָה:

מונית ציבורי TaxiRide {בוליאני פרטי הוא NightSurcharge; פרטי Long DistanceInMile; // בונים סטנדרטיים, גטרים / סטרים}

בואו נגדיר גם אובייקט עסקי אחר שישמש לייצוג תעריפים:

מחיר כניסה ציבורית {פרטי Long nightSurcharge; פרטי נסיעה ארוכה // בונים סטנדרטיים, גטרים / סטרים}

כעת, בואו נגדיר כלל עסקי לחישוב תעריפי המוניות:

com.baeldung.spring.drools.model.Fare rideFare עולמי; ניב כלל "mvel" "חישוב מחיר נסיעה במונית - תרחיש 1" כאשר taxiRideInstance: TaxiRide (isNightSurcharge == false && distanceInMile <10); ואז rideFare.setNightSurcharge (0); rideFare.setRideFare (70); סוֹף 

כפי שאנו רואים, מוגדר כלל לחישוב התעריף הכולל של הנתון TaxiRide.

כלל זה מקבל א TaxiRide מתנגד ובודק אם ה isNightSurcharge תכונה היא שֶׁקֶר וה distanceInMile ערך המאפיין הוא פחות מ -10, ואז חשב את מחיר הנסיעה כ- 70 וקבע את לילה תשלום נוסף נכס ל -0.

התפוקה המחושבת מוגדרת ל דמי נסיעה חפץ לשימוש נוסף.

4. שילוב אביב

4.1. תצורת שעועית אביב

עכשיו, בואו נעבור לשילוב האביב.

אנו הולכים להגדיר מחלקה לתצורת שעועית אביבית - אשר תהיה האחראית לאינסטינציה של TaxiFareCalculatorService שעועית ותלותיה:

@Configuration @ComponentScan ("com.baeldung.spring.drools.service") מעמד ציבורי TaxiFareConfiguration {סופי סטטי פרטי מחרוזת drlFile = "TAXI_FARE_RULE.drl"; @Bean הציבור KieContainer kieContainer () {KieServices kieServices = KieServices.Factory.get (); KieFileSystem kieFileSystem = kieServices.newKieFileSystem (); kieFileSystem.write (ResourceFactory.newClassPathResource (drlFile)); KieBuilder kieBuilder = kieServices.newKieBuilder (kieFileSystem); kieBuilder.buildAll (); KieModule kieModule = kieBuilder.getKieModule (); החזיר kieServices.newKieContainer (kieModule.getReleaseId ()); }} 

KieServices הוא יחיד אשר משמש ככניסה בנקודה אחת לקבלת כל השירותים הניתנים על ידי Kie. KieServices נשלף באמצעות KieServices.Factory.get ().

לאחר מכן, עלינו להשיג את מיכל KieContainer שהוא מציין מיקום לכל האובייקט הדרוש לנו כדי להפעיל את מנוע הכלל.

מיכל KieContainer בנוי בעזרת שעועית אחרת כולל KieFileSystem, KieBuilder, ו KieModule.

בואו נמשיך ליצור KieModule המהווה מיכל של כל המשאבים הנדרשים להגדרת ידע כלל המכונה KieBase.

KieModule kieModule = kieBuilder.getKieModule ();

KieBase הוא מאגר המכיל את כל הידע הקשור ליישום כגון כללים, תהליכים, פונקציות, מודלים מסוג והוא מוסתר בתוכו KieModule. ה KieBase ניתן להשיג מה- מיכל KieContainer.

פַּעַם KieModule נוצר, נוכל להמשיך ליצור מיכל KieContainerהמכיל את KieModule איפה ה KieBase הוגדר. ה מיכל KieContainer נוצר באמצעות מודול:

KieContainer kContainer = kieServices.newKieContainer (kieModule.getReleaseId ());

4.2. שירות אביב

בואו נגדיר מחלקת שירות שמבצעת את ההיגיון העסקי בפועל על ידי העברת ה- עוּבדָה התנגד למנוע לעיבוד התוצאה:

@Service במחלקה ציבורית TaxiFareCalculatorService {@ פרטי KieContainer פרטי kieContainer; ציבורי ארוך calcFare (TaxiRide taxiRide, נסיעה נסיעה) {KieSession kieSession = kieContainer.newKieSession (); kieSession.setGlobal ("rideFare", rideFare); kieSession.insert (taxiRide); kieSession.fireAllRules (); kieSession.dispose (); חזור rideFare.getTotalFare (); }} 

לבסוף, א KieSession נוצר באמצעות מיכל KieContainer למשל. א KieSession מופע הוא מקום שבו ניתן להכניס נתוני קלט. ה KieSession מתקשר עם המנוע כדי לעבד את ההיגיון העסקי בפועל המוגדר בכלל על סמך עובדות שהוכנסו.

גלובל (ממש כמו משתנה גלובלי) משמש להעברת מידע למנוע. אנו יכולים להגדיר את הגלובלי באמצעות setGlobal ("מפתח", ערך); בדוגמה זו קבענו דמי נסיעה התנגד כגלובל לאחסן את מחיר המונית המחושב.

כפי שדנו בסעיף 4, א כְּלָל דורש נתונים להפעלה. אנחנו מכניסים את עוּבדָה לפגישה באמצעות kieSession.insert (taxiRide);

לאחר שסיימנו עם הגדרת הקלט עוּבדָה, אנו יכולים לבקש מנוע לבצע את ההיגיון העסקי על ידי התקשרות fireAllRules ().

לבסוף, עלינו לנקות את ההפעלה כדי למנוע דליפת זיכרון על ידי קריאה ל- להשליך () שיטה.

5. דוגמה בפעולה

כעת נוכל לחבר את הקשר האביבי ולראות בפעולה שדרולים פועלים כצפוי:

@Test הציבור בטל כאשר NightSurchargeFalseAndDistLessThan10_thenFixWithoutNightSurcharge () {TaxiRide taxiRide = TaxiRide חדש (); taxiRide.setIsNightSurcharge (שקר); taxiRide.setDistanceInMile (9L); Fare rideFare = מחיר חדש (); TotalCharge ארוך = taxiFareCalculatorService.calculateFare (taxiRide, rideFare); assertNotNull (totalCharge); assertEquals (Long.valueOf (70), totalCharge); }

6. מסקנה

במאמר זה למדנו על שילוב האביב של דרולס עם מקרה שימוש פשוט.

כמו תמיד, היישום של דוגמאות וקטעי קוד זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found