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`.
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