Boa tarde pessoal,
Estou com o seguinte problema, tenho uma classe de teste simples, como mostrado abaixo:
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Stateless
public class TestScheduler {
private String moduleName = "RestApi";
private String cluster;
Canal para a criação do cluster.
private JChannel channel;
// Indicador se o nó é o owner do cluster.
private Boolean isOwner = false;
private final Logger log = LoggerFactory.getLogger(TestScheduler.class);
public TestScheduler() {
try {
// Nome do cluster.
this.cluster = this.moduleName + "EventosOpcCluster";
// Verifica se os clientes foram configurados.
log.debug("Inicializando cluster de Scheduler [" + this.cluster + "]...");
// Cria o cluster.
channel = new JChannel();
// Sempre que algum nó entrar ou sair do cluster verifica se ele deve assumir a coleta dos dados ou ficar em stand-by.
channel.setReceiver(new ReceiverAdapter() {
@Override
public void viewAccepted(View view) {
// Busca o coordenados do cluster.
// Somente o coordenador cexecuta o procedimento
Address clusterOwner = view.getCoord();
log.info(cluster + " cluster address [" + channel.getAddressAsString() + "]");
log.info(cluster + " cluster owner [" + clusterOwner.toString() + "].");
// Verifica se sou o coordenador.
if (clusterOwner.toString().equals(channel.getAddressAsString())) {
// Como sou o coordenador assuma a coleta dos dados.
log.info("Assumindo cluster [" + cluster + "].");
isOwner = true;
} else {
// Como não sou coordenador fico em stand-by.
log.info(cluster + " cluster stand-by.");
isOwner = false;
}
}
});
// Entra no cluster.
channel.connect(this.cluster);
} catch (Exception ex) {
log.error("Erro ao inicializar o cluster de eventos do OPC.", ex);
}
}
@Schedule(hour = "*", minute = "*", second = "*/5", persistent = true)
public void testRun() {
log.info("[" + channel.getAddressAsString() + "] Executou...");
}
}
Porém estou tendo problemas com a execução deste scheduler em um ambiente WebSphere.
O código em si, está sendo executado em cluster.
Existe os seguintes cenários:
Servidor 1 (Executando) - Servidor 2 (Executando) = Scheduler sendo executado no Servidor 1
Servidor 1 (Parado) - Servidor 2 (Executando) = Scheduler sendo executado no Servidor 2
Servidor 1 (Executando) - Servidor 2 (Parado) = Scheduler sendo executado no Servidor 1
Até aqui, tudo funcionando como esperado.
Porém ocorre o seguinte caso que no meu caso não deveria ocorrer:
Meu scheduler está configurado como persistence=true e para ser executado a cada 5 segundos, porém se ambos os nós (Servidor 1 e Servidor 2) ficar parados por um determinado tempo, como por exemplo 1 minuto e após este tempo voltarem a funcionar, o scheduler em questão irá executar 12 vezes seguidas referente ao tempo que ficou desligado, no meu pensamento o tempo perdido para mim não tem mais importancia e estas execuções não deveriam ocorrer…as execuções futuras sim, essas sim deveriam continuar a serem executadas conforme confiugração (neste exemplo, a cada cinco segundos).
O que deveria ser feito para que as execuções passadas e que não foram executadas pois os servidores estavam desligados voltem a ser executados assim que os mesmos voltem a em execução?