קביעת תצורה של דלג ההיגיון באביב אצווה

1. הקדמה

כברירת מחדל, כל שגיאה שתיתקל במהלך עיבוד עבודת Spring Batch תגרום לכשל המתאים. עם זאת, ישנם מצבים רבים בהם אנו מעדיפים לדלג על הפריט המעובד כעת למעט חריגים מסוימים.

במדריך זה, נבדוק שתי גישות להגדרת לוגיקה של דלג במסגרת Spring Batch.

2. מקרה השימוש שלנו

לצורך דוגמאות, נשתמש שוב בעבודה פשוטה וממוקדת בגושים המוצגת כבר במאמר ההיכרות של Spring Batch.

עבודה זו ממירה נתונים פיננסיים מסוימים מפורמט CSV לפורמט XML.

2.1. נתוני קלט

ראשית, בואו נוסיף כמה שורות לקובץ ה- CSV המקורי:

שם משתמש, user_id, transaction_date, transaction_amount devendra, 1234, 31/10/2015, 10000 john, 2134, 3/12/2015, 12321 robin, 2134, 2/02/2015, 23411, 2536, 3/10/2019, 100 מייק, 9876, 5/11/2018, -500, 3425, 10/10/2017, 9999

כפי שאנו רואים, שלוש השורות האחרונות מכילות נתונים לא חוקיים - בשורות 5 ו- 7 חסר שדה שם המשתמש, וסכום העסקה בשורה 6 הוא שלילי.

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

3. קביעת תצורה של חריגות דלג וחריגים שניתן לדלג עליהם

3.1. באמצעות לדלג ו skipLimit

בואו נדון כעת בדרכים הראשונות משתי הגדרות התפקיד שלנו לדלג על פריטים במקרה של כשל - ה- לדלג ו skipLimit שיטות:

@Bean הצעד הציבורי מדלג על Steep (מעבד ItemProcessor, כותב ItemWriter) זורק ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)). מעבד (מעבד) .writer (כותב) .faultTolerant ( ) .skipLimit (2) .skip (MissingUsernameException.class) .skip (NegativeAmountException.class) .build (); }

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

בְּתוֹך לדלג() ו skipLimit (), אנו מגדירים את החריגים עליהם אנו רוצים לדלג ואת המספר המרבי של פריטים שדילגו עליהם.

בדוגמה שלעיל, אם א חסר שם משתמש חריג אוֹ NegativeAmountException נזרק בשלב הקריאה, התהליך או הכתיבה, ואז הפריט שעובד כעת יושמט ויספר כנגד המגבלה הכוללת של שניים.

כתוצאה מכך, אם יוצא מהכלל חריג כלשהו בפעם השלישית, כל הצעד ייכשל.

3.1. באמצעות noSkip

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

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

בואו נראה כיצד נוכל להגדיר זאת באמצעות לדלג, skipLimit, ו noSkip:

@Bean הצעד הציבורי מדלג על Steep (מעבד ItemProcessor, כותב ItemWriter) זורק ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)). מעבד (מעבד) .writer (כותב) .faultTolerant ( ) .skipLimit (2) .skip (Exception.class) .noSkip (SAXException.class) .build (); }

עם התצורה לעיל, אנו מורים למסגרת Spring Batch לדלג על כל אחת מהן יוצא מן הכלל (בגבול מוגדר) למעט SAXException. זה אומר SAXException תמיד גורם לכישלון צעד.

הסדר של לדלג() ו noSkip () שיחות לא משנה.

4. שימוש בהתאמה אישית SkipPolicy

לפעמים אנו זקוקים למנגנון מתוחכם יותר. למטרה הזאת, מסגרת באביב אצווה מספקת את SkipPolicy מִמְשָׁק.

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

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

למרות זאת, אילוץ נוסף הוא שנוכל לדלג עליו NegativeAmountException, אך רק אם הסכום אינו עולה על מגבלה מוגדרת.

בואו ניישם את המנהג שלנו SkipPolicy:

מחלקה ציבורית CustomSkipPolicy מיישמת SkipPolicy {final final static int MAX_SKIP_COUNT = 2; סופי סטטי פרטי int INVALID_TX_AMOUNT_LIMIT = -1000; @Override בוליאני ציבורי צריך לדלג (Throwable לזרוק, int skipCount) זורק SkipLimitExceededException {אם (למשל לזרוק של חסר UsernameException && skipCount <MAX_SKIP_COUNT) {return נכון; } אם (מופע זורק של NegativeAmountException && skipCount <MAX_SKIP_COUNT) {NegativeAmountException ex = (NegativeAmountException) ניתן לזריקה; אם (למשל .getAmount () <INVALID_TX_AMOUNT_LIMIT) {return false; } אחר {להחזיר נכון; }} להחזיר שקר; }}

כעת נוכל להשתמש במדיניות המותאמת אישית שלנו בהגדרת צעד:

 @Bean הצעד הציבורי מדלג על Steep (מעבד ItemProcessor, כותב ItemWriter) זורק ParseException {return stepBuilderFactory .get ("skippingStep") .chunk (10) .reader (itemReader (invalidInputCsv)). מעבד (מעבד) .writer (כותב) .faultTolerant ( ) .skipPolicy (CustomSkipPolicy חדש ()) .build (); }

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

אולם הפעם איננו מתקשרים לדלג() אוֹ noSkip (). במקום זאת, אנו משתמשים ב- skipPolicy () שיטה לספק יישום משלנו של SkipPolicy מִמְשָׁק.

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

5. מסקנה

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

למרות שמשתמשים ב- skipLimit () ביחד עם לדלג() ו noSkip () נראה כי שיטות פופולריות יותר, אנו עשויים למצוא יישום מותאם אישית SkipPolicy להיות נוח יותר במצבים מסוימים.

כרגיל, כל דוגמאות הקוד זמינות ב- GitHub.


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