Cet article étudie principalement l'explication détaillée des exemples de mécanisme de réessayer de la programmation Java et des exemples de code pertinents partagés. L'éditeur pense que c'est assez bon et a une certaine valeur de référence. Les amis qui en ont besoin peuvent y faire référence.
Une fonction doit être implémentée dans l'application: les données doivent être téléchargées sur le service de stockage à distance, et d'autres opérations sont effectuées lorsque le traitement de retour réussit. Cette fonction n'est pas compliquée et est divisée en deux étapes: la première étape consiste à appeler l'emballage logique de service de repos distant pour renvoyer le résultat de traitement à la méthode de traitement; La deuxième étape consiste à obtenir le résultat de la première étape ou à attraper l'exception. Si une erreur ou une exception se produit, la logique de téléchargement sera réessayée, sinon l'opération logique se poursuivra.
Sur la base de la logique de téléchargement normale, la logique de fonction est exécutée en jugeant si le résultat de retour ou l'écoute de la décision d'exception est de réessayer. Dans le même temps, afin de résoudre l'exécution non valide de la nouvelle tentative immédiate (en supposant que l'exception est causée par l'instabilité d'exécution externe), la logique de fonction est la réexécution d'un certain temps de retard.
public void Commonretry (map <string, object> dataMap) lève l'interruption de l'Exception {map <string, object> parAmmap = maps.newhashmap (); Parammap.put ("TableName", "Créativeable"); Parammap.put ("DS", "20160220"); Parammap.put ("DataMap", DataMap); Résultat booléen = false; essayez {result = uploadTOODPS (Parammap); if (! Result) {Thread.Sleep (1000); uploadToodps (Parammap); // essayez une fois}} catch (exception e) {Thread.Sleep (1000); uploadToodps (Parammap); // Essayez une fois}}La solution ci-dessus peut encore être invalide pour la réessayer. Pour résoudre ce problème, essayez d'augmenter l'intervalle d'intervalle de réessayer et de réessayer pour obtenir la possibilité d'augmenter la réessayer valide.
public void Commonretry (map <string, object> dataMap) lève l'interruption de l'Exception {map <string, object> parAmmap = maps.newhashmap (); Parammap.put ("TableName", "Créativeable"); Parammap.put ("DS", "20160220"); Parammap.put ("DataMap", DataMap); Résultat booléen = false; essayez {result = uploadTOODPS (Parammap); if (! Result) {reuploadTOODPS (Parammap, 1000l, 10); // Delay multiple retry}} catch (exception e) {reuploadToodps (Parammap, 1000l, 10); // retard plusieurs retey}}Il y a un problème avec la solution 1 et la solution 2: la logique normale et la logique de réessayer sont fortement couplées. La logique de réessayer repose beaucoup sur les résultats de l'exécution de la logique normale, et les déclencheurs passifs déclenchent les résultats attendus d'une logique normale. La cause profonde de la réessayer est souvent submergée par la logique complexe, ce qui peut conduire à une compréhension incohérente des problèmes à résoudre pour les opérations et la maintenance ultérieures. La réessayer est difficile à garantir et n'est pas propice à l'exploitation et à la maintenance, car la conception de réessayer repose sur des exceptions logiques normales ou réessayer la cause profonde de la conjecture.
Y a-t-il donc une solution qui peut être utilisée pour découpler la logique normale et la logique de réessayer, et en même temps, il peut donner à Reprying Logic une solution standardisée? La réponse est: c'est-à-dire un outil de réessayer basé sur le modèle de conception de l'agent. Nous essayons d'utiliser l'outil correspondant pour reconstruire le scénario ci-dessus.
La définition spécifique du modèle de conception de commande n'est pas expliquée. La raison principale est que le modèle de commande peut compléter la logique de fonctionnement de l'interface en exécutant l'objet, et en même temps, l'encapsulation interne de la logique de réessayer n'est pas exposée aux détails d'implémentation. Pour l'appelant, c'est l'exécution de la logique normale et atteindre l'objectif de découplage. Veuillez consulter l'implémentation de fonction spécifique. (Structure du diagramme de classe)
IRÉTRIE s'accorde sur l'interface Téléchargement et RETRY, qui implémente la logique de téléchargement ODPS de type ODPSretry et résume en même temps la stratégie de réessayer et de réessayer. Dans le même temps, utilisez la méthode de récupération pour effectuer l'opération de récupération à la fin.
Notre logicClient de l'appelant n'a pas besoin de faire attention à la réessayer. Il implémente la fonction d'interface de la convention via le Reryer Reryer. Dans le même temps, Retryer doit répondre et traiter la logique de réessayer. Le traitement spécifique de réessayer du Reryer est remis à la classe d'implémentation de l'interface Irtry réelle ODPSretry. En adoptant le mode de commande, la logique normale et la logique de réessayer sont séparées avec élégance, et en même temps, la logique normale et la logique de réessayer sont séparées en construisant le rôle des réryionurs, de sorte que la réessayer a une meilleure évolutivité.
Spring-Retry est une boîte à outils open source, actuellement disponible la version 1.1.2.Release, qui personnalise le modèle d'opération de réessayer, et peut définir des politiques de réessayer et des politiques de secours. Dans le même temps, réessayez l'instance d'exécution pour assurer la sécurité des filetages. Les exemples de fonctionnement spécifiques sont les suivants:
public void upload (final map <string, objet> map) lève une exception {// créer une instance de modèle de retulle reryTemplate reryTemplate = new reryTemplate (); // Définit la politique de réessayer, définissez principalement le nombre de Retries SimpleretryPolicy Policy = new SimpletryPolicy (3, Collections. <Class <? Étend Throwable>, Boolean> singletonMap (exception.class, true)); // Définit la politique d'opération de repère de réchauffement, définit principalement l'intervalle de réchauffement FIXEBOOFFPOLICY FIXEBACKOFFPOLICY = new FixedBackOffPolicy (); FixedBackOffPolicy.SetBackOffperiod (100); RetryTemplate.setRetryPolicy (politique); retRyTemplate.SetBackOffPolicy (FixedBackOffPolicy); // RetryCallback Retry Retry l'instance de rappel Pour envelopper la logique logique normale, la première exécution et la rétraction d'exécution sont toutes cette logique finale RetryCallback <objet, exception> retRyCallback = new RetryCallback <objet, exception> () {// RetryContext Retry-Retry the Operation Contexte Convention, Unify-Spring-Try Emballage Object Dowithretry (RetryConCon quelque chose"); Exception e = uploadTOODPS (MAP); System.out.println (context.getRetryCount ()); Jetez e; // accorde une attention particulière à ce point. La racine de la réessayer est renvoyée par exception}}; // Récupérer le processus de réessayer se termine normalement ou atteint la limite supérieure de réessayer. Final RecoveryCallback <Bject> RecoveryCallback = new RecoveryCallback <Bject> () {public Object Recover (ReryContext Context) lève exception {System.out.println ("Do Recovery Operation"); retourner null; }}; essayez {// exécuter la méthode EXECUTE par RetryTemplate pour démarrer l'exécution logique de RetryTemplate.Execute (RetryCallback, RecoveryCallback); } catch (exception e) {e.printStackTrace (); }}Après avoir analysé le code de cas, RetryTemplate assume le rôle de la réessayer exécuteur. Il peut définir SimpleretryPolicy (RETRY POLICE, SET RETRY UPPUT LIMIT, RETRY ROOT ENTITY), FIXEBACKOFFPOLICY (FIXE Fallback Policy, définissez l'intervalle de temps pour Retry Fallback). RetryTemplate exécute des opérations via l'exécution et deux instances de classe, RetryCallback et RecoveryCallback, sont nécessaires pour préparer deux instances de classe. Le premier correspond à l'instance de logique de rappel de réessayer et enveloppe les opérations fonctionnelles normales. RecoveryCallback implémente l'instance d'opération de récupération à la fin de l'opération d'exécution entière.
L'exécution de RetryTemplate est thread-safe et la logique d'implémentation utilise ThreadLocal pour enregistrer le contexte d'exécution RetryContext de chaque instance d'exécution.
Bien que l'outil Spring-Retry puisse mettre en œuvre élégamment la nouvelle tentative, il existe deux conceptions hostiles: l'une est que l'entité de réessayer est limitée à la sous-classe jetable, indiquant que la réessayer est destinée aux exceptions fonctionnelles accrocheuses comme la prémisse de conception, mais nous voulons compter sur une entité d'objet de données comme l'entité de réchauffement, mais le cadre de la fixation de printemps doit être cassé pour la sous-claire présentable. Un autre est l'objet Assertion qui réessayer la cause profonde utilise l'instance d'exception d'exception de Dowithretry, qui ne se conforme pas à la conception de retour des affirmations internes normales.
Spring Reryn plaide des méthodes de réessayer en annotation. La logique de réessayer est exécutée de manière synchrone. La «défaillance» de la réessayer est ciblée sur le jetable. Si vous souhaitez déterminer si vous devez réessayer en fonction d'un certain état de la valeur de retour, vous ne pourrez peut-être juger vous-même la valeur de retour vous-même, puis lancer explicitement une exception.
L'abstraction du printemps pour réessayer
"Résumé" est une qualité nécessaire pour chaque programmeur. Pour moi avec des qualifications médiocres, il n'y a pas de meilleur moyen d'améliorer que d'imiter et de comprendre d'excellents codes source. Pour ce faire, je réécrit sa logique principale ... Jetons un coup d'œil à l'abstraction de Spring Rery pour "Rerying".
Interface liée au printemps.jpg
L'outil de réryion de Guava est similaire à Spring-Retry. Il enveloppe la réessayer logique normale en définissant le rôle du réryion. Cependant, Guava Reryer a une meilleure définition de politique. Sur la base de la prise en charge du nombre de temps de réessayer et du contrôle de fréquence de réessayer, il peut être compatible avec la définition de la source de réessayer qui prend en charge plusieurs exceptions ou objets entités personnalisés, ce qui donne à la fonction de réessayer plus de flexibilité. Guava Reryer est également en file d'attente. La logique d'appel d'entrée utilise la méthode d'appel de java.util.concurrent. callable. L'exemple de code est le suivant:
public void uploadoDPS (carte finale <chaîne, objet> map) {// RetryerBuilder Créer un retryer d'instance de réchauffement, vous pouvez définir la source de rétraction et prendre en charge plusieurs sources de nouvelle tentative, vous pouvez configurer le nombre de temps de réessayer ou de réessayer le temps de temps, et vous pouvez configurer l'intervalle de temps d'attente. .RetryIfException () .// Définir l'exception de réchauffement Source RetryifResult (nouveau prédicat <boolean> () {// Définir le segment personnalisé Source Retry, @Override public Boolean Apply (Boolean State) {// Note spéciale: Cet application revient true;}}) .Withstopstrategy (stopstrategies.stopafterAttEmpt (5)) // Définissez la réessayer 5 fois, et vous pouvez également définir le temps de délai de rétraction. java.util.concurrent.Callable <v>, donc l'exécution est un résultat booléen de filetage = repryer.call (new Callable <boolean> () {@Override public booléen complemente () lève une exception {try {// spécial: return false déclaration ne nécessite pas de rétablissement, retourne la déclaration true pour continuer à retarder uploadToOdP Exception (e);}}}); } catch (ExecutionException e) {} catch (ReryException ex) {}}Exemple d'analyse des principes de code:
RetryerBuilder est un créateur d'usine qui peut personnaliser la source de réchauffement et peut prendre en charge plusieurs sources de réchauffement, peut configurer le nombre de temps de réessayer ou de relancer le délai d'expiration, et peut configurer l'intervalle de temps d'attente pour créer une instance de réryion de Reryer.
La source de réchauffement de ReryerBuilder prend en charge les objets d'exception exception et les objets d'assertion personnalisés, et est défini via RetryIfexception et RetryifResult, il prend en charge plusieurs et est compatible en même temps.
La configuration de limite de temps d'attente et de réessayer de RetryerBuilder est implémentée à l'aide de différentes classes de stratégie, et les fonctionnalités de temps d'attente peuvent prendre en charge les modes d'intervalle non intervalles et fixes.
Retryer est une instance du Reryer, qui exécute la logique d'opération via la méthode d'appel, et encapsule l'opération de source de réessayer.
Communinalité et principe élégants
Normal et réessayer élégamment découplé, réessayant, affirmant que les instances conditionnelles ou les instances d'exception logique sont les médiums de la communication entre les deux.
Acceptez des intervalles de réessayer, des stratégies de réessayer différentielles et définissez le temps de délai d'expiration pour assurer davantage l'efficacité de la réessayer et la stabilité du processus de réessayer.
Tous utilisent le modèle de conception de commande et les opérations logiques correspondantes sont terminées en déléguant l'objet de réessayer, et la logique de réessayer est implémentée en interne.
Les outils de lycée et de gueava sont tous deux à la fois de réessayer en filetage et peuvent prendre en charge l'exactitude de la logique de réessayer dans des scénarios commerciaux simultanés.
Scénarios applicables pour réessayer gracieusement
Il existe des scénarios de dépendance instables dans la logique fonctionnelle, et il est nécessaire d'utiliser RETRY pour obtenir le résultat attendu ou essayer de réexécuter la logique sans fin immédiatement. Par exemple, l'accès à l'interface distante, l'accès à la charge des données, la vérification de téléchargement des données, etc.
Il existe des scénarios qui doivent être réessayés pour des scénarios d'exception, et en même temps, il est espéré découpler la logique normale et la logique de réessayer.
Pour les interactions basées sur les supports de données, les schémas de réessayer peuvent également être pris en compte dans des scénarios qui nécessitent un sondage de réessayer pour détecter la logique d'exécution.
Ce qui précède est toutes les explications détaillées de l'exemple de mécanisme de réessayer Java Programming. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!