{"id":17707575,"url":"https://github.com/rafaelrok/spring-batch","last_synced_at":"2026-04-09T01:32:38.871Z","repository":{"id":258612727,"uuid":"874265742","full_name":"rafaelrok/spring-batch","owner":"rafaelrok","description":"This project aims to explore the entire spring-batch universe, working with file processing, bringing concepts, processing performance...","archived":false,"fork":false,"pushed_at":"2024-10-29T14:52:17.000Z","size":1356,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-13T17:02:15.384Z","etag":null,"topics":["java","jdk17","maven","mysql","spring-batch","spring-batch-jobs","spring-boot","spring-framework"],"latest_commit_sha":null,"homepage":"https://docs.spring.io/spring-batch/reference/index.html","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rafaelrok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-10-17T14:23:59.000Z","updated_at":"2024-10-29T14:52:21.000Z","dependencies_parsed_at":"2025-02-06T10:41:53.819Z","dependency_job_id":"bcbd58dc-76b7-4887-8764-978c874979af","html_url":"https://github.com/rafaelrok/spring-batch","commit_stats":null,"previous_names":["rafaelrok/spring-batch"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rafaelrok/spring-batch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelrok%2Fspring-batch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelrok%2Fspring-batch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelrok%2Fspring-batch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelrok%2Fspring-batch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafaelrok","download_url":"https://codeload.github.com/rafaelrok/spring-batch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelrok%2Fspring-batch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31581864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","jdk17","maven","mysql","spring-batch","spring-batch-jobs","spring-boot","spring-framework"],"created_at":"2024-10-25T01:05:37.562Z","updated_at":"2026-04-09T01:32:38.843Z","avatar_url":"https://github.com/rafaelrok.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![SPRING-BATCH](resources/image.png)\r\n\u003cp align=\"center\"\u003e\r\n    \u003cimg alt=\"GitHub branch status\" src=\"https://img.shields.io/github/checks-status/rafaelrok/spring-batch/main\"\u003e\r\n     \u003c/a\u003e  \r\n     \u003ca href=\"https://github.com/ms-sales/README.md/commits/master\"\u003e\r\n      \u003cimg alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/rafaelrok/spring-batch\"\u003e\r\n     \u003c/a\u003e\r\n     \u003ca href=\"https://github.com/rafaelrok/ms-sales/blob/main/LICENSE\"\u003e\r\n      \u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/rafaelrok/spring-batch?style=flat\"\u003e\r\n     \u003c/a\u003e  \r\n     \u003ca href=\"https://github.com/tgmarinho/README-ecoleta/stargazers\"\u003e\r\n      \u003cimg alt=\"Stargazers\" src=\"https://img.shields.io/github/stars/rafaelrok/spring-batch?style=social\"\u003e\r\n     \u003c/a\u003e\r\n     \u003ca href=\"https://medium.com/@rafael\"\u003e\r\n      \u003cimg alt=\"medium\" src=\"https://img.shields.io/twitter/url?label=Medium\u0026logo=medium\u0026style=social\u0026url=https%3A%2F%2Fmedium.com%2F%40rafael.\"\u003e\r\n     \u003c/a\u003e\r\n  \u003c/p\u003e\r\nEsse projeto tem como base de estudo de sistemas que realiza um processamento infinito de dados controlados pela batch com Jobs. \r\nSpring Batch é um framework que surgiu da necessidade de realizar processamento em lote. A afirmação “os dados são o novo petróleo” deve ser familiar para você. \r\nA nuvem armazena uma enorme quantidade de dados, que cresce com o tempo. Portanto, é importante que os sistemas sejam capazes de consultar e armazenar esses dados \r\nem tempo hábil, sem impactar a experiência do usuário.\r\n\r\n\u003c!--— Esses são exemplos. Veja https://shields.io ---\u003e\r\n## Tecnologias\r\n\r\n* **Java 17**\r\n* **Spring Boot**\r\n* **Spring Batch**\r\n* **API REST**\r\n* **Docker**\r\n* **MySQL**\r\n\r\n## Arquitetura do Spring Batch\r\n\r\nO Spring Batch veio para facilitar o processo de criação de jobs . Um job no Spring Batch é basicamente uma máquina de estados com sequência de etapas ( steps ) que possui uma lógica própria.:\r\n\r\n![Arquitetura Proposta](resources/image-1.png)\r\n\r\nOs componentes que compõe essa máquina de estados são exibidos na imagem abaixo:\r\n\r\n![Arquitetura Proposta](resources/image-2.png)\r\n\r\n### Fluxo Batch\r\n\r\n- *Job Repository*: Mantém o estado do *job* (duração da execução, status da execução, erros, escritas, leituras, …), que é compartilhado com os outros componentes da solução.\r\n- *Step*: Representa uma etapa ou passo na qual uma lógica é realizada. *Etapas* são encadeadas para obter o produto final do processamento. Se o *passo* for baseado em [*chunk](https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#chunkOrientedProcessing)* (pedaços), ele terá etapas de leitura (ItemReader), processamento (ItemProcessor) e escrita de dados (ItemWriter). O *step* também pode ser uma tarefa simples, e nesse caso seria baseada em [*tasklets*](https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#taskletStep) .\r\n- *Job Launcher*: Executa o *job* de fato, considerando fator como forma de execução ( *thread* único , distribuído), validação de parâmetros, *restart* , e outras propriedades de execução.\r\n\r\n## Principais Recursos\r\n\r\n### Observação:\r\n\u003ePara todos os projetos batch que envolve processamento de arquivos ou scripts deve ser configurado o parametro para indetificar o seu files da seguinte forma:\r\n \r\n```\r\narquivoClientes=file:{NOME_DO_PROJETO}/files/clientes.txt\r\n```\r\n\r\nPara atender a diversos cenários, o Spring Batch conta com uma série de recursos que permitem a elaboração de uma solução que atende ao máximo seus requisitos funcionais e não funcionais. Vamos listar algumas delas:\r\n\r\n\u003e #Leitura de banco de dados: Essa é uma funcionalidade essencial. Muitos *trabalhos* fazem leitura e escrita em banco de dados, por isso o Spring Batch já fornece [componentes](https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database) de acesso ao banco de forma diferenciada (paginada, em lote, transacional, …).\r\n\u003e\r\n\r\n\u003e Manipulação de arquivos: Assim como em banco de dados, a leitura e escrita em arquivos é algo muito comum em *jobs* . Pensando nisso, o Spring Batch disponibiliza diferentes [manipuladores de arquivo](https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#flatFiles) , que podem ser escolhidos de acordo com a natureza dos dados a serem lidos.\r\n\u003e\r\n\r\n\u003e Tratamento de abordagens: É importante que um *trabalho* se recupere de falhas sem comprometer o processamento. Para isso, existem [mecanismos de *nova tentativa* e manipuladores de exceção](https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#faultTolerant) para que o *job* comece mantendo seu estado consistente para posteriores reinicializações.\r\n\u003e\r\n\r\n\u003e *Restart* : Essa capacidade é essencial para *lotes* atrasados, que podem ter sua execução interrompida. Seria muito custoso começar o processamento do zero, por isso o Spring Batch possui um [mecanismo de reinicialização](https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#restartability) , que utiliza os [metadados do *trabalho](https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#metaDataSchema)* salvos em sua última execução para retomá-la.\r\n\u003e\r\n\r\n\u003e Paralelismo: Existem [opções](https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability) que permitem escalar a aplicação horizontalmente ( *chunking* e particionamento remoto) e verticalmente ( *steps* paralelos e *multithread* ). Isso é importante para melhorar o tempo de processamento quando uma abordagem de único *thread* não é suficiente.\r\n\u003e\r\n\r\n## Processamento Batch\r\nO processamento batch (ou processamento em lote) é uma abordagem para processar grandes volumes de dados em um ambiente computacional. Em vez de tratar dados individualmente e em tempo real, \r\ncomo no processamento transacional ou online (OLTP), o processamento batch acumula dados e os processa todos de uma vez em intervalos regulares ou programados. Essa abordagem é muito utilizada \r\nem diversos contextos, como sistemas corporativos, ciência de dados, big data, e operações de TI.\r\n\r\n\r\n## Características do Processamento Batch\r\n\r\n1. **Volume de Dados**:\r\n    \u003e- Processa grandes volumes de dados de uma só vez.\r\n    \u003e- Ideal para tarefas que requerem manipulação de um grande conjunto de registros, como a geração de relatórios, análises de dados e backups.\r\n2. **Agendamento**:\r\n    \u003e- Tarefas batch são geralmente agendadas para serem executadas em horários específicos, como durante a noite ou nos fins de semana, para minimizar o impacto no desempenho do sistema durante as horas de pico.\r\n3. **Automação**:\r\n    \u003e- Muitas vezes, o processamento batch é automatizado e não requer intervenção humana contínua após ser configurado.\r\n4. **Recursos Computacionais**:\r\n    \u003e- Pode utilizar intensivamente recursos computacionais (CPU, memória, disco), mas como é agendado, pode ser planejado para momentos de baixa utilização.\r\n5. **Latência**:\r\n    \u003e- Geralmente, a latência não é crítica. Os resultados não são necessários em tempo real, então há um atraso aceitável entre o início do processamento e a disponibilidade dos resultados.\r\n\r\n### Exemplos de Uso\r\n\r\n1. **Processamento de Folha de Pagamento**:\r\n    - Calcula os salários dos funcionários, deduções, impostos e gera relatórios e pagamentos. Normalmente executado mensalmente.\r\n2. **Relatórios Empresariais**:\r\n    - Geração de relatórios financeiros, de vendas ou de inventário a partir dos dados acumulados ao longo do dia, semana ou mês.\r\n3. **ETL (Extract, Transform, Load)**:\r\n    - Extração de dados de várias fontes, transformação desses dados conforme necessário e carregamento em um data warehouse.\r\n4. **Backups de Sistemas**:\r\n    - Criação de backups de sistemas e bancos de dados, muitas vezes agendados para horários fora do expediente para evitar interrupções.\r\n\r\n### Tecnologias e Ferramentas\r\n\r\n- **Apache Hadoop**:\r\n    - Framework para processamento de grandes conjuntos de dados em um ambiente distribuído.\r\n- **Apache Spark**:\r\n    - Motor de processamento de dados de código aberto que pode ser usado tanto para processamento batch quanto para processamento em tempo real.\r\n- **Spring Batch**:\r\n    - Framework no ecossistema Spring projetado para facilitar o desenvolvimento de aplicações de processamento batch.\r\n- **MapReduce**:\r\n    - Modelo de programação associado ao Hadoop para processamento e geração de grandes conjuntos de dados.\r\n\r\n### Vantagens do Processamento Batch\r\n\r\n- **Eficiência**:\r\n    - Pode ser mais eficiente do que o processamento em tempo real para grandes volumes de dados, uma vez que opera em blocos.\r\n- **Agendamento**:\r\n    - Flexibilidade para agendar tarefas em horários que minimizem o impacto no desempenho do sistema.\r\n- **Automação**:\r\n    - Reduz a necessidade de intervenção manual contínua após a configuração inicial.\r\n\r\n### Desvantagens do Processamento Batch\r\n\r\n- **Latência**:\r\n    - Não é adequado para tarefas que exigem respostas em tempo real.\r\n- **Recursos**:\r\n    - Pode consumir muitos recursos de sistema, o que pode impactar outras operações se não for bem gerenciado.\r\n- **Complexidade**:\r\n    - Configuração e manutenção podem ser complexas, especialmente em ambientes distribuídos.\r\n\r\n## Tipo de Steps “Tasklet” e “Chunk”\r\nO `Tasklet` é uma interface simples usada para definir uma única tarefa dentro de um step. Essa tarefa pode ser qualquer operação simples e atômica, como deletar arquivos, \r\nfazer uma limpeza de dados, ou qualquer outra lógica que precise ser executada como uma única unidade de trabalho.\r\n\r\nExemplo de `Tasklet`\r\n```java\r\n@Configuration\r\n@EnableBatchProcessing\r\npublic class TaskletConfig {\r\n\r\n    @Autowired\r\n    private JobBuilderFactory jobBuilderFactory;\r\n\r\n    @Autowired\r\n    private StepBuilderFactory stepBuilderFactory;\r\n\r\n    @Bean\r\n    public Tasklet tasklet() {\r\n        return (StepContribution contribution, ChunkContext chunkContext) -\u003e {\r\n            System.out.println(\"Olá, mundo! - Tasklet\");\r\n            return RepeatStatus.FINISHED;\r\n        };\r\n    }\r\n\r\n    @Bean\r\n    public Step taskletStep() {\r\n        return stepBuilderFactory\r\n                .get(\"taskletStep\")\r\n                .tasklet(tasklet())\r\n                .build();\r\n    }\r\n\r\n    @Bean\r\n    public Job taskletJob() {\r\n        return jobBuilderFactory\r\n                .get(\"taskletJob\")\r\n                .start(taskletStep())\r\n                .build();\r\n    }\r\n}\r\n```\r\n### Chunk\r\n\r\nO processamento `Chunk` é usado para lidar com grandes volumes de dados que precisam ser processados em blocos ou pedaços. O Spring Batch divide os dados em pedaços menores, processa cada pedaço, e então escreve o resultado. Essa abordagem é mais eficiente para operações de leitura/gravação em massa.\r\n\r\nNo `Chunk` processing, você define três componentes principais:\r\n\r\n1. **ItemReader**: Leitura de dados.\r\n2. **ItemProcessor**: Processamento de dados.\r\n3. **ItemWriter**: Escrita dos dados processados.\r\n\r\nExemplo de `Chunk`\r\n```java\r\n@Configuration\r\n@EnableBatchProcessing\r\npublic class ChunkConfig {\r\n\r\n    @Autowired\r\n    private JobBuilderFactory jobBuilderFactory;\r\n\r\n    @Autowired\r\n    private StepBuilderFactory stepBuilderFactory;\r\n\r\n    @Bean\r\n    public ItemReader\u003cString\u003e reader() {\r\n        List\u003cString\u003e data = Arrays.asList(\"Primeiro\", \"Segundo\", \"Terceiro\");\r\n        return new ListItemReader\u003c\u003e(data);\r\n    }\r\n\r\n    @Bean\r\n    public ItemProcessor\u003cString, String\u003e processor() {\r\n        return item -\u003e item.toUpperCase();\r\n    }\r\n\r\n    @Bean\r\n    public ItemWriter\u003cString\u003e writer() {\r\n        return items -\u003e items.forEach(System.out::println);\r\n    }\r\n\r\n    @Bean\r\n    public Step chunkStep() {\r\n        return stepBuilderFactory.get(\"chunkStep\")\r\n                .\u003cString, String\u003echunk(2)\r\n                .reader(reader())\r\n                .processor(processor())\r\n                .writer(writer())\r\n                .build();\r\n    }\r\n\r\n    @Bean\r\n    public Job chunkJob() {\r\n        return jobBuilderFactory\r\n                .get(\"chunkJob\")\r\n                .start(chunkStep())\r\n                .build();\r\n    }\r\n}\r\n```\r\n### Diferenças entre Tasklet e Chunk\r\n\r\n- **Granularidade**:\r\n    - `Tasklet` é usado para tarefas atômicas ou unitárias.\r\n    - `Chunk` é usado para processar grandes volumes de dados em pedaços menores.\r\n- **Complexidade**:\r\n    - `Tasklet` é mais simples e direto, adequado para tarefas simples.\r\n    - `Chunk` envolve mais componentes (leitura, processamento, escrita) e é mais adequado para tarefas complexas de processamento de dados.\r\n- **Uso de memória**:\r\n    - `Tasklet` geralmente consome menos memória, pois lida com pequenas tarefas.\r\n    - `Chunk` pode consumir mais memória dependendo do tamanho dos pedaços e dos dados processados.\r\n\r\nCom essas explicações e exemplos, você deve ser capaz de implementar e entender a diferença entre `Tasklet` e `Chunk` no Spring Batch, e escolher o mais adequado para suas necessidades de processamento de dados.\r\nesse projeto tem como base de estudo de sistemas que realiza um processamento infinito de dados controlados pela batch com Jobs.\r\naqui pode consultar e testar os projetos nesse repositorio.\r\n\r\n## Desenvolvedor\r\n\u003ctable\u003e\r\n  \u003ctr\u003e\r\n    \u003ctd align=\"center\"\u003e\r\n      \u003ca href=\"#\"\u003e\r\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/8467131?v=4\" width=\"100px;\" alt=\"Foto do Rafael Vieira no GitHub\"/\u003e\u003cbr\u003e\r\n        \u003csub\u003e\r\n          \u003cb\u003eRafael Vieira\u003c/b\u003e\r\n        \u003c/sub\u003e\r\n      \u003c/a\u003e\r\n    \u003c/td\u003e\r\n  \u003c/tr\u003e\r\n\u003c/table\u003e\r\n\u003ctable\u003e\r\n  \u003ctr\u003e\r\n    \u003ca href=\"https://www.linkedin.com/in/rafaelvieira-s/\"\u003e\r\n      \u003cimg alt=\"linkedin\" src=\"https://img.shields.io/twitter/url?label=Linkedin\u0026logo=linkedin\u0026style=social\u0026url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Frafaelvieira-s%2F\"\u003e\r\n    \u003c/a\u003e\r\n    \u003ca href=\"https://medium.com/@rafael\"\u003e\r\n      \u003cimg alt=\"medium\" src=\"https://img.shields.io/twitter/url?label=Medium\u0026logo=medium\u0026style=social\u0026url=https%3A%2F%2Fmedium.com%2F%40rafael.\"\u003e\r\n    \u003c/a\u003e\r\n    \u003ca href = \"mailto:rafaelrok25@gmail.com\"\u003e\r\n      \u003cimg alt=\"gmail\" src=\"https://img.shields.io/twitter/url?label=gmail\u0026logo=gmail\u0026style=social\u0026url=https%3A%2F%2Fmail.google.com%2F\"\u003e\r\n    \u003c/a\u003e\r\n  \u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n\r\n## 📝 Licença\r\n\r\nEsse projeto está sob licença. Veja o arquivo [LICENÇA](LICENSE.md) para mais detalhes.\r\n\r\n##  Versões do README\r\n\r\n[⬆ Voltar ao topo](#Tecnologias)\u003cbr\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelrok%2Fspring-batch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafaelrok%2Fspring-batch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelrok%2Fspring-batch/lists"}