Bevezetés a tavaszi tételbe

1. Bemutatkozás

Ebben a cikkben a Spring Batch gyakorlati, kódközpontú bevezetőjére fogunk koncentrálni. A Spring Batch egy olyan feldolgozási keretrendszer, amelyet a feladatok robusztus végrehajtására terveztek.

Ez a jelenlegi 3.0-ás verzió, amely támogatja a Spring 4-et és a Java 8-at. Tartalmazza a JSR-352-et is, amely egy új java specifikáció a kötegelt feldolgozáshoz.

Íme néhány érdekes és praktikus keretrendszer-felhasználási eset.

2. Munkafolyamat alapjai

A tavaszi köteg követi a hagyományos kötegelt architektúrát, ahol egy jobtár az ütemezés és a munka interakciójának munkáját végzi.

Egy munkának több lépése lehet - és minden lépés általában az adatok olvasásának, feldolgozásának és írásának sorrendjét követi.

És természetesen a keretrendszer a legtöbb nehéz feladatot elvégzi számunkra itt - különösen, ha a munkával való foglalkozás alacsony szintű kitartó munkájáról van szó - sqlite az állástárhoz.

2.1. Példánk a felhasználásra

Az egyszerű felhasználási mód, amellyel itt foglalkozni fogunk, néhány pénzügyi tranzakciós adatot áttelepítünk CSV-ből XML-be.

A bemeneti fájl nagyon egyszerű felépítésű - soronként tartalmaz egy tranzakciót, amely a következőkből áll: felhasználónév, felhasználói azonosító, a tranzakció dátuma és az összeg:

felhasználónév, felhasználói azonosító, tranzakció_dátum, tranzakció_összeg devendra, 1234, 2015.10.31., 10000 john, 2134, 2015.12.3., 12321 robin, 2134, 2015.02.22., 23411

3. A Maven POM

A projekthez szükséges függőségek: rugómag, rugós köteg és sqlite jdbc csatlakozó:

   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 Config

Első lépésként konfiguráljuk a Spring Batch-et XML-lel:

Természetesen Java konfiguráció is elérhető:

@Configuration @EnableBatchProcessing public class SpringConfig {@Value ("org / springframework / batch / core / schema-drop-sqlite.sql") private Resource dropReopsitoryTables; @Value ("org / springframework / batch / core / schema-sqlite.sql") privát erőforrás dataReopsitorySchema; @Bean public DataSource dataSource () {DriverManagerDataSource dataSource = új DriverManagerDataSource (); dataSource.setDriverClassName ("org.sqlite.JDBC"); dataSource.setUrl ("jdbc: sqlite: repository.sqlite"); return dataSource; } @Bean public DataSourceInitializer dataSourceInitializer (DataSource dataSource) dob MalformedURLException {ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator (); databasePopulator.addScript (dropReopsitoryTables); databasePopulator.addScript (dataReopsitorySchema); databasePopulator.setIgnoreFailedDrops (true); DataSourceInitializer inicializáló = new DataSourceInitializer (); inicializáló.setDataSource (dataSource); Initializer.setDatabasePopulator (databasePopulator); visszatérő inicializáló; } privát JobRepository getJobRepository () dobja a Kivételt {JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean (); factory.setDataSource (dataSource ()); factory.setTransactionManager (getTransactionManager ()); gyár.afterPropertiesSet (); return (JobRepository) factory.getObject (); } privát PlatformTransactionManager getTransactionManager () {return new ResourcelessTransactionManager (); } public JobLauncher getJobLauncher () dobja a Kivételt {SimpleJobLauncher jobLauncher = új SimpleJobLauncher (); jobLauncher.setJobRepository (getJobRepository ()); jobLauncher.afterPropertiesSet (); return jobLauncher; }}

5. Tavaszi kötegelt feladat konfigurálása

Most írjuk meg a munkaköri leírásunkat a CSV-ből XML-munkába:

                           com.baeldung.spring_batch_intro.model.Transaction 

És természetesen a hasonló Java-alapú job-konfiguráció:

public class SpringBatchConfig {@Autowired private JobBuilderFactory munkahelyek; @Autowired private StepBuilderFactory lépések; @Value ("input / record.csv") privát erőforrás inputCsv; @Value ("fájl: xml / output.xml") privát erőforrás outputXml; @Bean public ItemReader itemReader () dobja az UnexpectedInputException, ParseException {FlatFileItemReader olvasót = new FlatFileItemReader (); DelimitedLineTokenizer tokenizer = új DelimitedLineTokenizer (); String [] tokenek = {"felhasználónév", "felhasználói azonosító", "tranzakció dátuma", "összeg"}; tokenizer.setNames (tokenek); reader.setResource (inputCsv); DefaultLineMapper lineMapper = új DefaultLineMapper (); lineMapper.setLineTokenizer (tokenizer); lineMapper.setFieldSetMapper (új RecordFieldSetMapper ()); reader.setLineMapper (lineMapper); visszatérő olvasó; } @Bean public ItemProcessor itemProcessor () {return new CustomItemProcessor (); } @Bean public ItemWriter itemWriter (Marshaller marshaller) dobja a MalformedURLException {StaxEventItemWriter itemWriter = új StaxEventItemWriter (); itemWriter.setMarshaller (marshaller); itemWriter.setRootTagName ("tranzakciórekord"); itemWriter.setResource (outputXml); return itemWriter; } @Bean public Marshaller marshaller () {Jaxb2Marshaller marshaller = új Jaxb2Marshaller (); marshaller.setClassesToBeBound (új osztály [] {Transaction.class}); visszatérő rendező; } @Bean védett 1. lépés: (ItemReader olvasó, ItemProcessor processzor, ItemWriter író) {return steps.get ("1. lépés"). darab (10) .olvasó (olvasó) .processzor (processzor) .író (író) .építés (); } @Bean (név = "firstBatchJob") nyilvános munka (@Qualifier ("1. lépés") 1. lépés) {return jobs.get ("firstBatchJob"). Start (1. lépés) .build (); }}

OK, tehát most, hogy megvan a teljes konfiguráció, bontsuk le és kezdjük el megvitatni.

5.1. Adatok olvasása és objektumok létrehozása a ItemReader

Először konfiguráltuk a cvsFileItemReader amely kiolvassa az adatokat a rekord.csv és alakítsa át a Tranzakció tárgy:

@SuppressWarnings ("korlátozás") @XmlRootElement (name = "tranzakcióRecord") public class Transaction {private String felhasználónév; private int userId; privát LocalDateTime tranzakcióDátum; magán dupla összeg; / * getterek és beállítók a * / @Orride public String toString () {tulajdonságok felülírására összeg + "]"; }}

Ehhez egy egyedi térképkészítőt használ:

public class RecordFieldSetMapper végrehajtja a FieldSetMapper {public Transaction mapFieldSet (FieldSet fieldSet) dobja a BindException {DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("d / M / yyy"); Tranzakciós tranzakció = új Tranzakció (); tranzakció.setUsername (fieldSet.readString ("felhasználónév")); tranzakció.setUserId (fieldSet.readInt (1)); tranzakció.setAmount (fieldSet.readDouble (3)); String dateString = fieldSet.readString (2); tranzakció.setTransactionDate (LocalDate.parse (dateString, formatter) .atStartOfDay ()); visszaküldési tranzakció; }}

5.2. Adatok feldolgozása a következővel: ItemProcessor

Saját cikkfeldolgozót hoztunk létre, CustomItemProcessor. Ez nem dolgoz fel semmit a tranzakciós objektummal kapcsolatban - csupán annyit tesz, hogy az olvasóból érkező eredeti objektumot átadja az írónak:

public class CustomItemProcessor implementálja a ItemProcessor {public Transaction process (Transaction item) {return item; }}

5.3. Objektumok írása az FS-re ItemWriter

Végül ezt tároljuk tranzakció címen található xml fájlba xml / output.xml:

5.4. A kötegelt feladat konfigurálása

Tehát csak annyit kell tennünk, hogy összekapcsoljuk a pontokat egy munkával - a tétel: munka szintaxis.

Vegye figyelembe a elkötelezettség-intervallum - ennyi tranzakciót kell megőrizni a memóriában, mielőtt a köteget elköteleznénk a itemWriter; a tranzakciókat addig a memóriáig fogja tartani (vagy amíg a bemeneti adatok végére nem kerül):

5.5. Kötegelt feladat futtatása

Ennyi - állítsunk be és futtassunk mindent:

public class App {public static void main (String [] args) {// Tavaszi Java config AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (); context.register (SpringConfig.class); context.register (SpringBatchConfig.class); context.refresh (); JobLauncher jobLauncher = (JobLauncher) context.getBean ("jobLauncher"); Munkahely = (Munka) context.getBean ("firstBatchJob"); System.out.println ("Kötegelt feladat indítása"); próbáld ki a {JobExecution végrehajtást = jobLauncher.run (job, új JobParameters ()); System.out.println ("Munka állapota:" + végrehajtás.getStatus ()); System.out.println ("Munka befejezve"); } catch (e kivétel) {e.printStackTrace (); System.out.println ("Nem sikerült a feladat"); }}}

6. Következtetés

Ez az oktatóanyag ötletet ad a következőkről: hogyan kell működni a Spring Batch-kel és hogyan lehet használni egy egyszerű felhasználási módban.

Bemutatja, hogyan fejlesztheti könnyedén a kötegelt feldolgozási folyamatot, és hogyan szabhatja testre az olvasás, a feldolgozás és az írás különböző szakaszait.

A teljes végrehajtása ennek az oktatóanyagnak a github projektje található meg - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.