Est-il sûr ou conseillé de recueillir un Runnable avec le même exécuteur si un problème se produit et que je veux réessayer?

StackOverflow https://stackoverflow.com/questions/5034693

  •  15-11-2019
  •  | 
  •  

Question

Je viens d'écrire ce code dans mon runnable's run() méthode:

try {
    dbConnection = MyApp.datasource.getConnection();
} catch (SQLException e) {
    logger.log(Level.SEVERE, "Could not obtain a DB connection! Re-enqueuing this task. Message: " + e.getMessage(), e);
    MyApp.executor.execute(this);
    return;
}

Comme vous pouvez le voir, si la tâche ne peut pas obtenir de connexion DB, elle devrait se réenquier elle-même, dans la même file d'attente dans laquelle elle était avant sa diffusion.

Je pense que c'est Probablement En toute sécurité, mais c'est drôle, et je veux juste m'assurer qu'il n'y a pas de gatchyas qui me manque.

Merci!

Était-ce utile?

La solution

C'est bien en ce qui concerne l'exécuteur testamentaire.

Mais gardez à l'esprit que les échecs peuvent se produire assez rapidement, puis l'exécuteur testamentaire peut rediriger votre code rapidement. Cela peut entraîner une combustion de beaucoup de CPU sans résultats.

Construisez des retards de réchauffement forcé et des dénombrements de boucle maximale.

Autres conseils

  1. Il y a un risque de soi-disant message de poison se produire: la tâche se répétera infiniment si le SQLException ne s'enfuira pas. Vous devez fournir une sorte de comptoir ou de minuterie.

  2. Selon l'occupation de l'exécuteur testamentaire (combien de tâches simultanées sont déjà prévues), l'intervalle entre les tentatives peut varier considérablement. Vous pouvez soit utiliser 100% du processeur ou attendre pour réessayer très longtemps.

  3. Si, par incident, votre parent La tâche (celle qui se reproduira) attend le résultat du enfant (Re-Scheduled) Invocation, vous pourriez ressentir une impasse lorsque l'exécuteur exécute sur un seul fil.

  4. Vous utilisez des champs bruts de MyApp, semble être un mauvais schéma.

Quant à l'idée globale: pourquoi ne pas simplement avoir une boucle run()? Vous voulez être plus "juste" pour les autres tâches exécutées?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top