Cria, revisa e refatora jobs agendados Sankhya com `@Job` (`extends IJob` + `onSchedule` + `getScheduleConfig` + CRON), incluindo migration via XML. Use ao criar, alterar, revisar, auditar ou padronizar jobs agendados, ao ajustar agendamento CRON, ao trabalhar com arquivos `*Job.java`, ou ao tocar em código com `@Job`/`IJob`.
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Cria, revisa e refatora jobs agendados Sankhya com `@Job` (`extends IJob` + `onSchedule` + `getScheduleConfig` + CRON), incluindo migration via XML. Use ao criar, alterar, revisar, auditar ou padronizar jobs agendados, ao ajustar agendamento CRON, ao trabalhar com arquivos `*Job.java`, ou ao tocar em código com `@Job`/`IJob`.
@Job substitui a configuracao via mgeschedule.xml por abordagem declarativa diretamente na classe Java. Jobs sao gerenciados pelo SDK e suportam injecao de dependencias.
1. Anatomia de um @Job
import br.com.sankhya.studio.annotations.Job;
import br.com.sankhya.studio.persistence.Transactional;
import br.com.sankhya.studio.stereotypes.IJob;
import com.google.inject.Inject;
@Job(
serviceName = "ProcessadorDeFilaSP", // Obrigatorio — convencao: terminar com "SP"
frequency = "0 0/5 * * * ?" // Opcional (default "&60000") — CRON e SEM "&"
)publicclassProcessadorDeFilaJobextendsIJob { // IJob e CLASSE ABSTRATA — use extendsprivatefinal FilaService filaService;
@InjectpublicProcessadorDeFilaJob(FilaService filaService) {
this.filaService = filaService;
}
@Override@TransactionalpublicvoidonSchedule() {
filaService.processarItens(); // Logica delegada ao Service
}
}
O prefixo & e EXCLUSIVO do intervalo em milissegundos. Expressao CRON e uma string pura de 6 campos: segundos minutos horas dia-mes mes dia-semana — nunca com &.
3. Classe abstrata IJob — Metodos
IJob e classe abstrata — sempre extends IJob, nunca implements.
Metodo
Retorno
Obrigatorio
Descricao
onSchedule()
void
Sim
Logica executada a cada disparo do agendador. abstract — precisa ser sobrescrito.
getScheduleConfig()
String
Nao
Retorna a frequencia dinamica. Se retornar valor nao-nulo, prevalece sobre frequency.
Quem retorna a frequencia dinamica e getScheduleConfig() (String), naogetScheduleConfigHook() (void, obsoleto). Se getScheduleConfig() retornar valor nao-nulo, ele sobrescreve o atributo frequency.
// import br.com.sankhya.modelcore.util.MGECoreParameter;@Overridepublic String getScheduleConfig() {
// Le frequencia de parametro do sistema — sobrepoe o atributo frequencytry {
Stringfrequencia= MGECoreParameter.getParameterAsString("MEUADDON_FREQ_JOB");
return frequencia != null ? frequencia : "&3600000"; // fallback: 1 hora (ms)
} catch (Exception e) {
return"&3600000"; // getParameterAsString declara throws Exception; o override nao
}
}
4. Controle transacional
Cenario
Abordagem
Job modifica dados
@Transactional no onSchedule() — garante atomicidade
Job somente leitura
transactionType = EJBTransactionType.NotSupported — melhor desempenho
Controle granular por trecho
transactionType = EJBTransactionType.Supports (padrao) + @Transactional no metodo
Injetar dependencias via construtor com @Inject (Guice).
Implementar onSchedule() (retorno void) delegando logica para Service.
Adicionar @Transactional se job modificar dados.
Definir transactionType = EJBTransactionType.NotSupported se job for somente leitura.
Envolver corpo de onSchedule() em try/catch com logging adequado.
Se frequencia for dinamica: sobrescrever getScheduleConfig() retornando String (nao getScheduleConfigHook()).
Confirmar que nao existemmgeschedule.xml nem mgechedule-cfg.xml no projeto.
Registrar no modulo Guice os services/dependencias injetados na classe — o job em si nao precisa de binding (o SDK o descobre pela anotacao @Job). Ver dependency-injection.
Skills relacionadas
dependency-injection — wiring Guice dos services injetados no job
repository — jobs tipicamente operam sobre dados via repository
value — configuração agendamento via @Value/SANKHYA_PARAM