History Cleanup (Limpeza automática de histórico) do Camunda não funciona. O que pode ser?
- William Robert Alves
- 2 de ago. de 2024
- 3 min de leitura
Atualizado: 5 de mar.
Você configurou tudo que precisava e mesmo assim sua limpeza de histórico automática não fez nada no horário agendado? Entenda neste post o que pode ser e como resolver isso!

Se sua estratégia de limpeza está baseada em "removal time", ou seja, usando a propriedade historyCleanupStrategy: removalTimeBased, o Camunda não removerá seu histórico caso a coluna REMOVAL_TIME_ das tabelas de histórico esteja em branco, pois o mecanismo utiliza ela para verificar a partir de que data e hora este histórico já pode ser excluído...
Lembrando que: Não há como definir o REMOVAL_TIME_ de forma SÍNCRONA, pois a API do Camunda trata o histórico como IMUTÁVEL.
Se este é seu caso... então vamos ver quais soluções podemos usar pra resolver isto. ESCOLHA UMA DAS FORMAS DE SOLUÇÃO ABAIXO QUE MAIS SE ADEQUA A SUA APLICAÇÃO: para banco de dados com poucos registros de histórico a solução 1 é mais adequada, para bancos com muitos registros de histórico utilize a opção 2 para atualizar a tabela em lotes.
1 - Definir o REMOVAL_TIME_ diretamente pelo banco de dados:
Uma instrução SQL simples pode ser utilizada para atualizar a coluna de REMOVAL_TIME_.
Exemplo - Coluna REMOVAL_TIME_ como null na tabela ACT_HI_ACTINST, e queremos atualizar ela calculando 30 dias a partir da data atual.
Com o seguinte comando SQL abaixo executado em nosso banco H2, conseguimos atualizar a coluna REMOVAL_TIME_ desta tabela:
Script SQL válido para os bancos: H2, SQLServer, MariaDB. |
UPDATE ACT_HI_ACTINST SET REMOVAL_TIME_ = DATEADD('DAY', 30, CURRENT_TIMESTAMP) WHERE REMOVAL_TIME_ IS NULL; |
Script SQL válido para os bancos: PostgreSQL, MySQL. |
UPDATE ACT_HI_ACTINST SET REMOVAL_TIME_ = CURRENT_TIMESTAMP + INTERVAL '30 days' WHERE REMOVAL_TIME_ IS NULL; |
Script SQL válido para os bancos: Oracle DB. |
UPDATE ACT_HI_ACTINST SET REMOVAL_TIME_ = SYSDATE + 30 WHERE REMOVAL_TIME_ IS NULL; |
Após executar nosso comando SQL, percebemos que a coluna REMOVAL_TIME_ foi atualizada com 30 dias após a data de hoje (01/08/2024).
2 - Definir o REMOVAL_TIME_ de forma ASSÍNCRONA com Java Code:
Para definirmos o REMOVAL_TIME_ de forma assíncrona, precisamos criar um lote (batch), no qual o motor do Camunda usará Job Executors para atualizar o banco em partes menores (chunks).
Para esta atualização podemos criar um endpoint com código Java conforme exemplo abaixo, injetando no construtor a dependência da interface HistoryService do Camunda e então definir neste endpoint a maneira com que atualizaremos nosso REMOVAL_TIME_ (alternativas comentadas no código). O retorno deste endpoint é void, pois ele apenas criará o lote para executar a atualização da coluna de nossa tabela de histórico e não precisa nos retornar nada.
OBS.: O código abaixo foi feito da maneira mais simples possível para fins de exemplo, implementado diretamente na Controller, mas você poderá ajustar da maneira que for mais adequada à arquitetura e padrão do seu projeto:
Com isto, ao chamarmos este endpoint, o Camunda irá atualizar a coluna REMOVAL_TIME_ de forma assíncrona.
Se seu problema era realmente este, deverá estar resolvido... Agora, quando a data e hora atual do servidor de sua aplicação Camunda, for a igual ou posterior a data e hora definidas nas colunas de REMOVAL_TIME_ das tabelas de histórico, estes registros estarão "liberados" para serem excluídos, então na próxima janela de limpeza configurada, o mecanismo do Camunda irá iniciar a limpeza automaticamente para os registros liberados.
OBS.: Somente serão excluídos os registros nos quais a data atual for igual ou posterior a data descrita na coluna REMOVAL_TIME_, os demais permanecerão ali até a devida data descrita para serem excluídos na próxima janela de limpeza.
ATENÇÃO - É importante que a configuração do horário de limpeza automática do histórico (cleanup) seja agendada para momentos de baixo uso do Camunda para evitar problemas...
Definir um bom horário de agendamento da limpeza automática é importante para evitar sobrecarga em sua aplicação e em seu banco de dados, isto se dá pelo fato do Camunda utilizar Job Executors para executarem a limpeza de fato...
Entenda melhor sobre isto acessando o post no link abaixo:
Quer conhecer um pouco mais sobre esta ferramenta e outras tecnologias?
Nos siga nas redes sociais @gerandocodigo (instagram / youtube / tiktok / facebook).
Comments