dsp-job-geo-file-generation — Visão geral¶
Job batch do DSP que pré-gera arquivos de download territoriais (níveis 2 e 3) e publica no SeaweedFS (API S3). O backend entrega esses bytes quando existem; senão usa WFS no GeoServer Download. Orquestração: dsp-core (profile object-storage). Na demo local este job costuma ficar desligado.
Sumário¶
- Papel no DSP
- Quando entra em cena
- Fluxo de uma execução
- Coordenação com a migração
- Objetos no bucket
- Formatos e temas
- Limpeza de órfãos
- Bancos e configuração
- Execução no core
- Rodar sem o core
- Onde aprofundar
Papel no DSP¶
| Entrada | Saída |
|---|---|
Flags em dsp.territory_level_2 / _3 |
CSV e GeoPackage no bucket S3 |
Feições em dsp-geoserver-db (mesma base do WFS) |
Metadados generated-at no objeto |
downloadThemesConfig.json |
Flags desligadas + last_generated_s3_file_at por território |
Reduz carga no GeoServer Download em consultas públicas de grande volume (ex.: escala consulta CAR).
Quando entra em cena¶
| Cenário | Job geo-file |
|---|---|
| Demo / quickstart sem JDBC | Normalmente off (downloads via WFS) |
| Adotante real | On com DSP_OBJECT_STORAGE_ENDPOINT e agenda do ./setup.sh |
Fluxo de uma execução¶
flowchart LR
dsp[(dsp-db)]
geo[(dsp-geoserver-db)]
job[job geo-file]
s3[(SeaweedFS)]
job -->|lê flags pendentes| dsp
job -->|lê geom / atributos| geo
job -->|grava CSV e GPKG| s3
job -->|grava batch + limpa flags| dsp
- Lista territórios com
requires_s3_file_regeneration = true(nível 2 antes do 3). - Para cada território, percorre temas habilitados em
downloadThemesConfig.jsone osformats[]de cada tema. - Exporta lendo
dsp-geoserver-db(paridade com WFS). - Publica no bucket; user-metadata
generated-at(ISO UTC) — o backend usa comolastFileGenerated. - Só desliga a flag e grava
last_generated_s3_file_atquando todos os formatos habilitados do território foram publicados. Falha parcial mantém pendente para a próxima rodada.
Se o bucket não existir, o job registra erro, não publica e termina sem derrubar o processo — flags permanecem para a próxima tentativa.
Coordenação com a migração¶
O geo-file não consulta BATCH_JOB_EXECUTION_SYNC_STATE.
| Etapa | Quem |
|---|---|
| Delta na origem | Job de migração (watermark) |
| Marcar territórios | Migração, ao terminar COMPLETED, na mesma janela temporal |
| Gerar arquivos | Este job, na agenda DSP_GEO_FILE_GENERATION_CRON |
Colunas no dsp-db (só níveis 2 e 3): requires_s3_file_regeneration, last_generated_s3_file_at. Detalhe: Bancos de dados — Pendências.
Objetos no bucket¶
| Nível | Chave S3 (padrão) |
|---|---|
| 2 | {formato}/level-2/{slugNível2}_{codigoTema}.{ext} |
| 3 | {formato}/level-3/{slugNível2}_{slugNível3}_{codigoTema}.{ext} |
Slug a partir de name (minúsculo, sem acento, hífens). Nível 3 inclui slug do pai (homônimos). API e flags usam id territorial.
O nome do arquivo que o cidadão baixa na UI não é a chave do objeto — o backend monta {tema}_{nível2}.{ext} na resposta HTTP.
Formatos e temas¶
- CSV: mesmo layout do WFS (
FID, atributos na ordem da tabela, geometria em WKT). - GeoPackage (
.gpkg): gerado quando o tema declaragpkgemformats[]. Uma tabela de feições por arquivo, com o código do tema, geometria emthe_geom(WKB). O SRID vem da camada. Sem SRID, a geometria fica no SRS geográfico indefinido do GeoPackage (srs_id0); a coluna não aceita valor vazio. Feição sem geometria é ignorada. O backend não tem fallback WFS para esse formato. - Novo formato: implementar
GeoFileExportere declarar emformats[]do tema — chaves e endpoints do backend permanecem.
Temas e códigos vêm de downloadThemesConfig.json (gerado pelo ./config.sh a partir do adotante).
Limpeza de órfãos¶
Ao final da execução, o job lista {formato}/level-2/ e {formato}/level-3/ no bucket e remove objetos que não correspondem a nenhum (território, tema, formato) válido — por exemplo após renomear um território.
Bancos e configuração¶
| Datasource | Destino |
|---|---|
batch |
dsp-db · schema geo_file_generation (isolado da migração) |
target |
dsp-db · schema dsp (flags territoriais) |
geo-target |
dsp-geoserver-db · schema dsp |
Object storage (não é JDBC):
dsp:
object-storage:
endpoint: http://dsp-object-storage:8333
region: us-east-1
bucket: dsp-geo-files
access-key: ...
secret-key: ...
path-style-access: true
Arquivo de runtime: config/Job-Geo-File-Generation/application/application.yaml (gerado pelo ./config.sh a partir de environment.object_storage no adopter-config.yaml). O bucket deve existir — o job não cria.
| Stack | Java 21, Spring Boot 3.4.2, Spring Batch, PostGIS, AWS SDK v2 (S3), Maven |
Execução no core¶
| Variável / modo | Efeito |
|---|---|
DSP_OBJECT_STORAGE_ENDPOINT |
Liga profile object-storage (SeaweedFS + job) |
DSP_GEO_FILE_GENERATION_CRON |
Agenda no supercronic — definida no ./setup.sh, não no wizard |
DSP_GEO_FILE_GENERATION_EXECUTION_MODE |
continuous (padrão) ou once |
Container dsp-job-geo-file-generation: sem porta HTTP; sobe junto com dsp-object-storage no adotante real.
Rodar sem o core¶
Exige application.yaml com os três datasources, bucket acessível e dsp-geoserver-db já populado pela migração. Uso típico: via ./setup.sh do core.
Onde aprofundar¶
| Tema | Página |
|---|---|
| Fluxo download (backend / S3 / WFS) | Fluxo de dados |
| Papéis de banco | Bancos de dados |
| Migração e flags | Job data-migration |
Variáveis .env e Compose |
dsp-core |
| API de downloads | dsp-backend |