BT

Processamento em lote no Java EE 7 e melhorias no Spring Batch

por Dan Woods , traduzido por Marcelo Cenerino em 19 Nov 2013 |

O Java EE 7 foi lançado em junho trazendo um conjunto de novas especificações, entre elas a JSR-352. Essa nova especificação define um modelo de programação para processamento em lote dentro da plataforma Java EE e baseia-se fortemente no projeto Spring Batch da VMware. O Spring Batch também recebeu atenção recentemente por conta de um lançamento importante que traz configurações mais enxutas e simplifica o acesso a dados.

A JSR-352 (Batch Applications for the Java Platform) oferece aos desenvolvedores um modelo de programação para desenvolver sistemas de processamento em lote robustos. O ponto central desse modelo de programação é um padrão de desenvolvimento emprestado do Spring Batch: o Reader-Processor-Writer. Esse pattern incentiva os desenvolvedores a adotar um estilo padrão de processamento orientado a pedaços (chunks).

O padrão Reader-Processor-Writer é composto por um fluxo de trabalho de três passos que os desenvolvedores devem seguir:

  • Uma classe ItemReader que consome um pedaço do dado a ser processado (normalmente um único registro);
  • Um ItemProcessor que processa cada um dos pedaços, aplicando a lógica de negócio e de domínio;
  • E, finalmente, um ItemWriter para o qual os registros serão delegados após o processamento e agregados.

De acordo com a especificação, os Jobs (tarefas) são descritos através de documentos XML e contém Steps (passos) no fluxo de processamento. Cada Step é responsável por descrever como cada pedaço de dado será processado e qual o intervalo entre os commits. Requisitos mais complexos para se processar determinados Steps do fluxo de trabalho podem ser implementados com um batchlet. Um batchlet é a versão da JSR-352 para o tasklet do Spring Batch, o qual oferece estratégias para processar Steps.

A JSR-352 também emprega o padrão do Spring Batch para acessar e controlar jobs. Jobs são invocados através de um JobOperator e os resultados são acessíveis através de um JobRepository. No Spring Batch o nome JobRepositorypermanece o mesmo, enquanto o JobOperator é chamado de JobLauncher.

A forma de definição de jobs no Java EE 7 é um pouco diferente do Spring Batch. Os desenvolvedores são obrigados a colocar os documentos XML de configuração de jobs no diretório META-INF/batch-jobs dos projetos. Com o Spring Batch, os desenvolvedores podem colocar as configurações de jobs em qualquer local do contexto do Spring para torná-las disponíveis no container.

Os arquivos XML de configuração de jobs no Java EE 7 definem classes concretas para as interfaces ItemReader, ItemProcessor e ItemWriter, além de especificar o tamanho do buffer, o intervalo entre commits e a política de checkpoints. A política de checkpoints indica como os commits serão tratados. O valor padrão é "item", mas os desenvolvedores podem optar por usar "time" (tempo) como estratégia. O primeiro caso especifica o número de registos processados, enquanto o último descreve os segundos decorridos entre um commit e outro.

<job xmlns="http://batch.jsr352/jsl">
    <step id="myStep">
        <chunk
                reader="MyItemReader"
                writer="MyItemWriter"
                processor="MyItemProcessor"
                buffer-size="5"
                checkpoint-policy="item"
                commit-interval="10" />
    </step>
</job>

A configuração de jobs no Spring Batch é quase idêntico ao Java EE 7. A exceção é que os passos (steps) são colocados em uma diretiva tasklet. Os atributos reader, process e writer de configuração dos chunks (pedaços) são referências para beans que existem no contexto da aplicação. A partir da versão 2.2.0, o intervalo de commits na configuração de chunks indica quantos itens devem ser processados ​​antes de se efetivar um commit.

<job id="myJob">
    <step id="myStep">
        <tasklet>
            <chunk
                    reader="myItemReader"
                    processor="myItemProcessor"
                    writer="myItemWriter"
                    commit-interval="2" />
        </tasklet>
    </step>
</job>  

<bean class="...MyItemReader" />
<bean class="...MyItemProcessor" />
<bean class="...MyItemWriter" />

Embora o Spring Batch esteja atualmente sendo trabalhado para se tornar aderente à JSR-352, ele vai além da especificação para oferecer aos desenvolvedores uma perfeita integração com outros componentes do ecossistema Spring. No caso do processamento em lote, o Spring Data pode ser aproveitado diretamente como uma instância de ItemReader no padrão Reader-Processor-Writer, para permitir que os desenvolvedores recuperem chunks de um repositório de dados do Spring Data. A versão 2.2.0 do Spring Batch oferece interface simplificada para bancos de dados MongoDB e Neo4J usando o Spring Data.

Além da interface simplificada para leitura de várias fontes de dados, a última versão do Spring Batch disponibiliza uma extensão para configuração do Spring Java, de forma a simplificar as funcionalidades de processamento em lote. Para habilitar essa configuração simplificada, os desenvolvedores só precisam fornecer a anotação @EnableBatchProcessing em uma classe anotada com @Configuration. A partir dessa classe, qualquer recurso de processamento em lote, como a JobRepository e JobLauncher, pode ser diretamente injetado sem nenhuma configuração adicional.

@Configuration
@EnableBatchProcessing
public class AppConfig {
    @Autowired
    private JobBuilderFactory jobs;

    @Bean
    public Job job() {
        return jobs.get("myJob").start(step1()).next(step2()).build();
    }

    @Bean
    protected Step step1() {
       ...
    }

    @Bean
    protected Step step2() {
     ...
    }
}

Além das melhorias no Spring Batch 2.2.0 para recuperação de dados e configuração, esse lançamento também atualizou sua dependência com o framework Spring. Agora os desenvolvedores que quiserem utilizar a última versão do Spring Batch terão que atualizar a versão do Spring para a 3.1.2 (mínima).

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.