מבוא לאביב אצווה

1. הקדמה

במאמר זה אנו נתמקד במבוא מעשי וממוקד קוד ל- Spring Batch. Spring Batch היא מסגרת עיבוד המיועדת לביצוע עבודות חזק.

זוהי גרסה 3.0 הנוכחית, התומכת באביב 4 וב- Java 8. היא מכילה גם את JSR-352, שהוא מפרט Java חדש לעיבוד אצווה.

להלן מספר מקרי שימוש מעניינים ופרקטיים של המסגרת.

2. יסודות זרימת העבודה

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

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

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

2.1. מקרה השימוש שלנו לדוגמא

מקרה השימוש הפשוט שאנו נתמודד כאן הוא - אנו נעביר כמה נתוני עסקאות פיננסיות מ- CSV ל- XML.

לקובץ הקלט יש מבנה פשוט מאוד - הוא מכיל עסקה בכל שורה, המורכבת מ: שם משתמש, מזהה המשתמש, תאריך העסקה והסכום:

שם משתמש, userid, transaction_date, transaction_amount devendra, 1234, 31/10/2015, 10000 john, 2134, 3/12/2015, 12321 robin, 2134, 2/02/2015, 23411

3. POM של Maven

התלות הנדרשת לפרויקט זה היא ליבת קפיץ, אצווה קפיצית ו סקליט מחבר jdbc:

   org.xerial sqlite-jdbc 3.15.1 org.springframework spring-oxm 5.2.0.RELEASE org.springframework spring-jdbc 5.2.0.RELEASE org.springframework.batch spring-batch-core 4.2.0.RELEASE 

4. תצורת אצווה באביב

הדבר הראשון שנעשה הוא להגדיר את Spring Batch עם XML:

כמובן שתצורת Java זמינה גם:

@Configuration @EnableBatchProcessing מחלקה ציבורית SpringConfig {@Value ("org / springframework / batch / core / schema-drop-sqlite.sql") dropReopsitoryTables משאבים פרטיים; @Value ("org / springframework / batch / core / schema-sqlite.sql") נתוני משאבים פרטיים DataReopsitorySchema; @Bean DataSource ציבורי DataSource () {DriverManagerDataSource dataSource = חדש DriverManagerDataSource (); dataSource.setDriverClassName ("org.sqlite.JDBC"); dataSource.setUrl ("jdbc: sqlite: repository.sqlite"); להחזיר dataSource; } @Bean DataSourceInitializer ציבוריים dataSourceInitializer (DataSource dataSource) זורק MalformedURLException {ResourceDatabasePopulator databasePopulator = חדש ResourceDatabasePopulator (); databasePopulator.addScript (dropReopsitoryTables); databasePopulator.addScript (dataReopsitorySchema); databasePopulator.setIgnoreFailedDrops (נכון); מאתחל DataSourceInitializer = DataSourceInitializer חדש (); initializer.setDataSource (dataSource); initializer.setDatabasePopulator (databasePopulator); אתחול חזרה; } JobRepository פרטי getJobRepository () זורק חריג {JobRepositoryFactoryBean מפעל = JobRepositoryFactoryBean חדש (); factory.setDataSource (dataSource ()); factory.setTransactionManager (getTransactionManager ()); factory.afterPropertiesSet (); return (JobRepository) factory.getObject (); } PlatformTransactionManager פרטי getTransactionManager () {להחזיר ResourcelessTransactionManager חדש (); } JobLauncher ציבורי getJobLauncher () זורק חריג {SimpleJobLauncher jobLauncher = חדש SimpleJobLauncher (); jobLauncher.setJobRepository (getJobRepository ()); jobLauncher.afterPropertiesSet (); החזר JobLauncher; }}

5. תצורת עבודת אצווה באביב

בואו נכתוב כעת את תיאור התפקיד שלנו לעבודה CSV ל- XML:

                           com.baeldung.spring_batch_intro.model.Transaction 

וכמובן, תצורת העבודה דומה מבוססת Java:

מעמד ציבורי SpringBatchConfig {@ משרות פרטיות JobBuilderFactory פרטיות; צעדים StepBuilderFactory פרטיים אוטומטיים; @Value ("input / record.csv") inputCsv משאבים פרטיים; @Value ("file: xml / output.xml") פלט משאבים פרטי Xml; @Bean ציבורי ItemReader itemReader () זורק UnexpectedInputException, ParseException {קורא FlatFileItemReader = FlatFileItemReader חדש (); DelimitedLineTokenizer tokenizer = DelimitedLineTokenizer חדש (); מחרוזת [] אסימונים = {"שם משתמש", "userid", "transactiondate", "סכום"}; tokenizer.setNames (אסימונים); reader.setResource (inputCsv); DefaultLineMapper lineMapper = חדש DefaultLineMapper (); lineMapper.setLineTokenizer (tokenizer); lineMapper.setFieldSetMapper (RecordFieldSetMapper חדש ()); reader.setLineMapper (lineMapper); קורא חוזר; } @Bean ItemProcessor publicProcessor () {להחזיר CustomItemProcessor חדש (); } @Bean ItemWriter הציבורי itemWriter (Marshaller marshaller) זורק MalformedURLException {StaxEventItemWriter itemWriter = StaxEventItemWriter חדש (); itemWriter.setMarshaller (marshaller); itemWriter.setRootTagName ("transactionRecord"); itemWriter.setResource (outputXml); פריט להחזיר } @Bean Marshaller Marshaller () {Jaxb2Marshaller Marshaller = חדש Jaxb2Marshaller (); marshaller.setClassesToBeBound (מחלקה חדשה [] {Transaction.class}); להחזיר מרשל; } שלב שלב 1 מוגן @Bean (קורא ItemReader, מעבד ItemProcessor, כותב ItemWriter) {return steps.get ("step1"). נתח (10). קורא (קורא). מעבד (מעבד) .סופר (כותב) .בניין (); } @Bean (name = "firstBatchJob") משרה ציבורית ציבורית (@Qualifier ("step1") שלב step1) {return jobs.get ("firstBatchJob"). התחל (step1) .build (); }}

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

5.1. קרא נתונים וצור אובייקטים באמצעות ItemReader

ראשית הגדרנו את ה- cvsFileItemReader אשר יקרא את הנתונים מה- record.csv ולהמיר אותו ל- עִסקָה לְהִתְנַגֵד:

@SuppressWarnings ("הגבלה") @ XmlRootElement (name = "transactionRecord") עסקה ברמה ציבורית {שם משתמש מחרוזת פרטי; private int userId; פרטי LocalDateTime transactionDate; סכום כפול פרטי; / * קבלנים וקובעים לתכונות * / @ העבר ציבורי מחרוזת toString () {החזר "Transaction [username =" + username + ", userId =" + userId + ", transactionDate =" + transactionDate + ", סכום =" + סכום + "]"; }}

לשם כך - הוא משתמש במפה מותאם אישית:

מחלקה ציבורית RecordFieldSetMapper מיישמת את FieldSetMapper {עסקה ציבורית mapFieldSet (FieldSet fieldSet) זורק את BindException {DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("d / M / yyy"); עסקת עסקה = עסקה חדשה (); transaction.setUsername (fieldSet.readString ("שם משתמש")); transaction.setUserId (fieldSet.readInt (1)); transaction.setAmount (fieldSet.readDouble (3)); מחרוזת dateString = fieldSet.readString (2); transaction.setTransactionDate (LocalDate.parse (dateString, formatter) .atStartOfDay ()); עסקת החזר; }}

5.2. עיבוד נתונים באמצעות פריט מעבד

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

מחלקה ציבורית CustomItemProcessor מיישם ItemProcessor {תהליך עסקה ציבורית (פריט עסקה) {פריט חוזר; }}

5.3. כתיבת אובייקטים ל- FS עם ItemWriter

לבסוף, אנו הולכים לאחסן זאת עִסקָה לקובץ XML שנמצא ב xml / output.xml:

5.4. קביעת התצורה של עבודת האצווה

אז כל שעלינו לעשות הוא לחבר את הנקודות לעבודה - באמצעות ה- אצווה: עבודה תחביר.

שים לב ל מרווח התחייבות - זה מספר העסקאות שיש לשמור בזיכרון לפני ביצוע האצווה ל itemWriter; הוא יחזיק את העסקאות בזיכרון עד לאותה נקודה (או עד לתום נתוני הקלט):

5.5. הפעלת עבודת האצווה

זהו זה - בואו נקים ונפעיל הכל:

App class class {public static void main (String [] args) {// Spring Java config AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (); context.register (SpringConfig.class); context.register (SpringBatchConfig.class); context.refresh (); JobLauncher jobLauncher = (JobLauncher) context.getBean ("jobLauncher"); עבודה משרה = (עבודה) context.getBean ("firstBatchJob"); System.out.println ("התחלת עבודת האצווה"); נסה {JobExecution ביצוע = jobLauncher.run (עבודה, JobParameters חדשים ()); System.out.println ("מצב עבודה:" + ביצוע.גט סטטוס ()); System.out.println ("העבודה הושלמה"); } לתפוס (חריג e) {e.printStackTrace (); System.out.println ("העבודה נכשלה"); }}}

6. מסקנה

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

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

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


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