Apr.09

Dependências do Maven para um projeto utilizando Spring Batch!

Para criar um projeto com Spring Batch + Maven precisamos definir algumas dependências, são elas:

Adicionar ao POM.xml dentro da raiz <project>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>

Abração!

Spring Batch

Apr.09

Como ler um arquivo CSV com Spring Batch?

Estava fazendo uns testes utilizando um arquivo CSV, como fazer sua leitura para posteriormente gravar os dados em uma base de dados.

Bom, é bem simples de se fazer e utilizei como referência a propria documentação do Spring Batch e o livro Spring Batch in Action. 

———

Neste exemplo utilizarei um arquivo csv chamado: pessoas.csv que conterá objetos pessoa possuindo id, nome e idade;

 Arquivo CSV

id,nome,idade

1,Monica,19

2,Joao,30

3,Juliana,20

4,Sandra,23

5,Jose,10

Para efetuarmos a leitura de um arquivo CSV (Comma Separated Values) podemos utilizar uma implementação bem tranquila do Spring que abstrai e facilita o nosso trabalho, vamos utilizar a classe: FlatFileItemReader.

No entanto o FlatFileItemReader necessita de dois parâmetros para o funcionamento, que é uma classe de Domínio (Bean) referente ao arquivo (É aquela classe que possui os atributos, getters, setters e etc)  e alguem que implemente a interface LineMapper.

Com relação ao LineMapper o Spring já nos fornece uma implementação, a classe DefaultLineMapper.

A Classe DefaultLineMapper precisa ter duas propriedades para o seu funcionamento, que é uma classe que implemente LineTokenizer (responsável por pegar os elementos e separar os seus atributos) e uma implementação de FieldSetMapper que será  a classe responsável por fazer o “MOR” (mapeamento objeto relacional) do arquivo na classe de domínio Java.

Com relação ao LineTokenizer podemos usar uma implementação já existente do Spring que é a classe DelimitedLineTokenizer onde só precisamos especificar a propriedade “names” que corresponde aos atributos do arquivo csv.  Já quando falamos do FieldSetMapper precisamos cria-lo e customiza-lo para a nossa aplicação como no exemplo da classe PessoaFieldSetMapper.java abaixo:


import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;

import br.eti.hussamaismail.batch.poc.csv.domain.Pessoa;

public class PessoaFieldSetMapper implements FieldSetMapper<Pessoa> {

public Pessoa mapFieldSet(FieldSet arg) {

Pessoa p = new Pessoa();

p.setId(arg.readInt("id"));
p.setNome(arg.readString("nome"));
p.setIdade(arg.readInt("idade"));

return p;
}

}

 

Pronto, feito isso já conseguiriamos ler um arquivo CSV no entanto um STEP é composto de um Reader e um Writer, como só temos um reader precisamos implementar um writer para nosso projeto.

Para implementar um writer é bem simples basta criar uma classe que implemente a interface ItemWriter seguindo o exemplo:


public class Writer implements ItemWriter<Pessoa> {

public void write(List<? extends Pessoa> arg0) throws Exception {
System.out.println(arg0.toString());
}

}

Arquivo do Job

<bean id=”reader” class=”org.springframework.batch.item.file.FlatFileItemReader”>
   <property name=”resource”>
     <bean class=”org.springframework.core.io.FileSystemResource”>
         <constructor-arg value=”src/main/resources/csvs/pessoas.csv“/>
     </bean>
   </property>
   <property name=”lineMapper” ref=”defaultLineMapper”/>
   <property name=”linesToSkip” value=”1″/>
</bean>

<bean id=”defaultLineMapper” class=”org.springframework.batch.item.file.mapping.DefaultLineMapper”>
   <property name=”lineTokenizer”>
      <bean class=”org.springframework.batch.item.file.transform.DelimitedLineTokenizer”>
        <property name=”names” value=”id,nome,idade”/>
      </bean>
   </property>
   <property name=”fieldSetMapper”>
     <bean class=”br.eti.hussamaismail.batch.poc.csv.mapper.PessoaFieldSetMapper”/>
   </property>
</bean>

<bean id=”writer” class=”br.eti.hussamaismail.batch.poc.csv.other.Writer”></bean>

<batch:job id=”readCsvJob” job-repository=”jobRepository”>
   <batch:step id=”step1″>
      <batch:tasklet>
         <batch:chunk reader=”reader” writer=”writer” commit-interval=”1″></batch:chunk>
      </batch:tasklet>
   </batch:step>
</batch:job>

PS: atributo commit-interval refere-se a quantidade de itens que serão processados antes que a transação seja comitada.

Bom, é isso pessoal com isso temos um exemplo de como fazer a leitura de um arquivo CSV de maneira bem simples

Abração.

Spring Batch

Apr.04

Conceitos Básicos de Spring Batch!

Segue alguns conceitos importantes aprendidos durante os estudos sobre Spring Batch.

[ Conceitos Importantes ]

Processamento em Lotes: São rotinas muito utilizadas em mainframes que ocorrem em segundo plano e que geralmente podem ser executadas sem a intervenção do usuário.

Spring Batch: É um framework do projeto Spring que visa fornecer funções reutilizáveis para processamento e gerenciamento de dados em um determinado cenário. Quando a principal vantagem da sua utilização é que o programador pode se preocupar com a regra de negócio e deixar que o framework cuidará da parte de infraestrutura.

Batch: É um conjunto de JOBS que são executados em uma aplicação possuindo uma sequência / fluxo bem definido.

STEP: É um passo a ser realizado dentro de um determinado JOB, basicamente é o que realmente executa uma leitura, escrita ou envia informações ou seja, realiza a ação. Um Job pode ter um ou vários steps. Um step pode ser simples ou complexo dependendo do pedido do programador podendo ter poucos ou nenhum código dependendo da implementação utilizada.

JOB: É um conjunto de STEPS que juntos executam uma determinada tarefa do fluxo de processamento. Podemos dizer que o job possui um nome e que possui a ordem dos steps que o compõem.

Exemplo:

<job id=”TrocarLampada”>

<step id=”subirEscada” next=”retirarLampada”/>

<step id=”retirarLampada” next=”colocarLampadaNova”/>

<step id=”colocarLampadaNova” next=”descerEscada/>

<step id=”descerEscada” />

</job>

[ Principais Elementos do Spring Batch ]

ITEM READER : Abstração para qualquer fonte de dados que será utilizada como entrada em um STEP dentro do JOB, podendo ser criado de várias formas, implementando a interface ItemReader do Spring ou estendendo as classes  JdbcCursorItemReader, FlatFileItemReader,JmsItemReader.

ITEM WRITER: Abstração de saída de um Step que ao contrario do ItemReader que só lê o ItemWriter escreve ou envia informações para uma fonte de dados. Ele pode ser criado apartir da interface ItemWriter ou extendendo as classes FlatFileItemWriter, HibernateItemWriter, IBatisBatchItemWriter.

Estes dois elementos estão presentes em um step, cada step possui um ItemWriter e um ItemReader, ou seja cada step realiza duas ações.

Apartir do Batch 2.x temos também um elemento chamando ITEM PROCESSOR que está no mesmo nível do Writer e Reader e é utilizado quando precisamos transformar um item antes de grava-lo.

[ Propriedades do JOB  ]

Um job é composto por Job Instance e job Executions:

JOB INSTANCE: Cada job instance pode ter vários multiplas execuções no entanto um JOB só pode ter uma Job Instance.

Vamos supor que um job falhou em um determinado passo, caso utilizemos um novo Job Instance iremos recomeçar o job desde o inicio e se utilizarmos o mesmo, ele começará de onde parou, de onde ocorreu a falha.

JOB PARAMETERS: São o que difere um Job Instance de outro, os parametros que são passados para ele, ex: uma data de execução, e etc.

Então temos que: JOB INSTANCE = JOB + JOB PARAMETERS;

[ Propriedades do STEP ]

Cada step dentro de um JOB possui um StepExecution que pertence a um exclusivo JobExecution. Cada vez que um passo é executado o novo StepExecution é criado.

Spring Batch

Apr.04

Como começar os estudos com Spring Batch?

Pessoal tudo bem?

Estes dias estou estudando um pouco sobre Spring Batch, e decidi começar por um artigo muito bom postado no DevMedia, artigo este que usarei como base e postarei algumas notas de estudo:

Link do Artigo: http://www.devmedia.com.br/artigo-java-magazine-74-conhecendo-o-spring-batch/15041

Documentação Spring Batch:

http://static.springsource.org/spring-batch/

http://static.springsource.org/spring-batch/reference/html/index.html

http://static.springsource.org/spring-batch/cases/index.html

http://static.springsource.org/spring-batch/batch-principles-guidelines.html

 

Spring Batch