Рубрики
Без рубрики

Пример пакета Spring – XML-файл В МонгоДБ База данных

– Пример пакета Spring – XML-файл В МонгоДБ База данных

В этом уроке мы покажем вам, как настроить пакетное задание Spring для чтения данных из XML-файла ( XStream библиотека) в базу данных без SQL ( MongoDB ). Кроме того, создайте модульный тестовый набор для запуска и тестирования пакетных заданий.

Используемые инструменты и библиотеки

  1. Мавен 3
  2. Затмение 4.2
  3. JDK 1.6
  4. Пружинный сердечник 3.2.2.ВЫСВОБОЖДЕНИЕ
  5. Весенняя партия 2.2.0.ВЫПУСК
  6. Весенний пакетный тест 2.2.0.ВЫПУСК
  7. Пружина OXM 3.2.2. ВЫПУСК
  8. Драйвер Java MongoDB 2.11.2
  9. MongoDB 2.2.3
  10. Юнит 4.11
  11. Тест 6.8.5

P.S Этот пример – XML-файл (читатель) – MongoDB (писатель).

1. Простой Проект Java

1. Создайте быстрый запуск Java-проекта с помощью Maven, преобразуйте и импортируйте его в среду разработки Eclipse.

$ mvn archetype:generate -DgroupId=com.mkyong -DartifactId=SpringBatchExample2 
  -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
$ cd SpringBatchExample/
$ mvn eclipse:eclipse

2. Зависимости проекта

Объявляет все зависимости проекта в pom.xml


	4.0.0
	com.mkyong
	SpringBatchExample
	jar
	1.0-SNAPSHOT
	SpringBatchExample
	http://maven.apache.org

	
		1.6
		3.2.2.RELEASE
		2.2.0.RELEASE
		1.2.1.RELEASE
		2.11.2
	

	

		
		
			org.springframework
			spring-core
			${spring.version}
		

		
		
			org.springframework
			spring-oxm
			${spring.version}
		

		
		
			org.springframework.batch
			spring-batch-core
			${spring.batch.version}
		
		
			org.springframework.batch
			spring-batch-infrastructure
			${spring.batch.version}
		

		
		
			org.springframework.batch
			spring-batch-test
			${spring.batch.version}
		

		
		
			org.mongodb
			mongo-java-driver
			${mongodb.driver.version}
		

		
		
			org.springframework.data
			spring-data-mongodb
			${spring.data.version}
		

		
		
			junit
			junit
			4.11
			test
		

		
		
			org.testng
			testng
			6.8.5
			test
		

	
	
	    spring-batch
	    
		
			org.apache.maven.plugins
			maven-eclipse-plugin
			2.9
			
				true
				false
			
		
		
			org.apache.maven.plugins
			maven-compiler-plugin
			2.3.2
			
				${jdk.version}
				${jdk.version}
			
		
	    
	


3. Структура каталогов проектов

Просмотрите окончательную структуру проекта, получите общее представление о том, что будет происходить дальше.

4. XML-файл

Это XML-файл в папке ресурсов.



    
        6/1/2013
        139,237
        40
        220.90
    
    
        6/2/2013
        339,100
        60
        320.88
    
    
        6/3/2013
        431,436
        76
        270.80
    

5. Прочитать XML-файл

В пакете Spring мы можем использовать StaxEventItemReader для чтения XML-файлов и xstreammarshaller для сопоставления значений и атрибутов XML с объектом.

    
    
	
	
	
    

    

	
	    
		
	    
	
	
	    
		
	    
	
				
    
	
    
package com.mkyong.model;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Report {

	private int id;
	private Date date;
	private long impression;
	private int clicks;
	private BigDecimal earning;

	//getter and setter methods

}

Чтобы сопоставить значение XML со “сложным” типом данных, например Дата и Большой десятичный , вам нужно прикрепить пользовательский конвертер для преобразования и отображения значения вручную.

package com.mkyong.converter;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import com.mkyong.model.Report;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class ReportConverter implements Converter {

	@Override
	public boolean canConvert(Class type) {
		//we only need "Report" object
		return type.equals(Report.class);
	}

	@Override
	public void marshal(Object source, 
            HierarchicalStreamWriter writer, MarshallingContext context) {
	    //do nothing
	}

	@Override
	public Object unmarshal(
            HierarchicalStreamReader reader, UnmarshallingContext context) {
		
		Report obj = new Report();
		
		//get attribute
		obj.setId(Integer.valueOf(reader.getAttribute("id")));
		reader.moveDown(); //get date
		
		Date date = null;
		try {
			date = new SimpleDateFormat("M/d/yyyy").parse(reader.getValue());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		obj.setDate(date);
		reader.moveUp();
		
		reader.moveDown(); //get impression
		
		String impression = reader.getValue();
		NumberFormat format = NumberFormat.getInstance(Locale.US);
                Number number = 0;
		try {
			number = format.parse(impression);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		obj.setImpression(number.longValue());
		
		reader.moveUp();
		
		reader.moveDown(); //get click
		obj.setClicks(Integer.valueOf(reader.getValue()));
		reader.moveUp();
		
		reader.moveDown(); //get earning
		obj.setEarning(new BigDecimal(reader.getValue()));
                reader.moveUp();
        
                return obj;
        
	}
}

6. МонгоДБ База данных

Определите экземпляр mongodb, а также MongoTemplate .



        
	
	
 
	
		
	
	  

7. Установка Сердечника Пружинной партии

Определить Место работы и Безработный .



     
    
	
    
 	
    
	
 
    
	
    


8. Весенние пакетные Задания

Пакетное задание Spring, прочитайте report.xml файл, сопоставьте с Отчетом объектом и запишите его в MongoDB . Прочитайте комментарий, он должен быть понятным.



    
	
	  
		
		
	  
	
    

    
    
	
	
	
    

    
    
	
	  
		
	  
	

        
	
	  
		
	  
	

    

    

    //write it to MongoDB, 'report' collection (table)
    
	
	
    
	

9. Модульный тест

Модульное тестирование с помощью фреймворков JUnit или TestNG. Во-первых, вы должны вручную объявить JobLauncherTestUtils .


 
    
    
    

Пример JUnit

package com.mkyong;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "classpath:spring/batch/jobs/job-report.xml",
    "classpath:spring/batch/config/context.xml",
    "classpath:spring/batch/config/database.xml",
    "classpath:spring/batch/config/test-context.xml"})
public class AppTest {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void launchJob() throws Exception {

        //JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        
        JobExecution jobExecution = jobLauncherTestUtils.launchStep("step1");
        
        assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
        
    }
}

Пример тестирования

package com.mkyong;

import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.Assert;
import org.testng.annotations.Test;

@ContextConfiguration(locations = {
    "classpath:spring/batch/jobs/job-report.xml",
    "classpath:spring/batch/config/context.xml",
    "classpath:spring/batch/config/database.xml",
    "classpath:spring/batch/config/test-context.xml"})
public class AppTest2 extends AbstractTestNGSpringContextTests {

    @Autowired
    private JobLauncherTestUtils jobLauncherTestUtils;

    @Test
    public void launchJob() throws Exception {

        JobExecution jobExecution = jobLauncherTestUtils.launchJob();
        Assert.assertEquals(jobExecution.getStatus(), BatchStatus.COMPLETED);
        
    }
}

Выход. Значения XML вставляются в MongoDB.

mongo
MongoDB shell version: 2.2.3
connecting to: test

> use yourdb
switched to db yourdb
> show collections
report
system.indexes

> db.report.find()
{ "_id" : 1, "_class" : "com.mkyong.model.Report", 
"date" : ISODate("2013-05-31T16:00:00Z"), "impression" : NumberLong(139237), 
"clicks" : 40, "earning" : "220.90" }

{ "_id" : 2, "_class" : "com.mkyong.model.Report", 
"date" : ISODate("2013-06-01T16:00:00Z"), "impression" : NumberLong(339100), 
"clicks" : 60, "earning" : "320.88" }

{ "_id" : 3, "_class" : "com.mkyong.model.Report", 
"date" : ISODate("2013-06-02T16:00:00Z"), "impression" : NumberLong(431436), 
"clicks" : 76, "earning" : "270.80" }
> 

10. Как насчет метаданных работы?

Извините, у меня пока нет решения для этого. Как я знаю, реляционная база данных необходима для метаданных заданий, чтобы обеспечить возможность перезапуска и отката заданий. MongoDB не имеет “надежного” управления транзакциями, по замыслу.

Решение 1. Создайте другую реляционную базу данных для хранения метаданных задания, хм… Это звучит глупо, но работает. У тебя есть идеи получше?

Решение 2: Подождите, пока команда Spring предложит решение для этого.

Скачать Исходный Код

Рекомендации

  1. Учебное пособие по преобразователю XStream
  2. Поддержка пакета Spring для не-СУБД
  3. Средства чтения и записи XML-элементов весеннего пакета
  4. Весенний пакет – Настройка и запуск работа
  5. Создайте проект Java с помощью Maven

Оригинал: “https://mkyong.com/spring-batch/spring-batch-example-xml-file-to-database/”