2017-05-11 4 views
0

Je travaille actuellement à un projet de ressort qui est fixé à un taux fixe programmée de 30 secondes comme ceci:prévenir d'autres exécutions jusqu'à la prochaine fois calendrier au printemps

@Scheduled(fixedRate = 30000) 
public void doThings() { 
    ... 
    ... 
    if(true) { 
    // How to stop the method from executing the codes below 
    // until the next 30 seconds interval? 
    } 
    ... 
    ... 
} 

La méthode est planifier actuellement toutes les 30 secondes .

Il va exécuter du code pour déterminer si le conditionnel de l'instruction if est vrai.

Si ce n'est pas le cas, le reste du code est également exécuté.

Si la valeur est true, la méthode est arrêtée jusqu'à ce que la méthode soit à nouveau invoquée automatiquement en raison de l'intervalle planifié de 30 secondes, et la méthode exécute à nouveau le code depuis le début.

Quelle ligne doit être placée dans l'instruction if? Ou y a-t-il une façon spécifique au printemps de le faire?

Merci.

+1

ajouterait return; être une option? – dev4Fun

+0

@ xsx4u Merci. Peut-être, mais j'espérais voir s'il y avait un meilleur moyen. Puisque si je retourne null, certains des journaux devient un gâchis. – 000000000000000000000

Répondre

-1

Traditionnellement, le mantra d'une méthode Java est "une entrée, une sortie". Avoir un return; pour arrêter le reste du code d'exécution brise cette convention, donc je déconseille. Au lieu de cela, vous pouvez faire une analyse logique simple:

@Scheduled(fixedRate = 30000) 
public void doThings() { 
    ... 
    // Analysis for condition 
    ... 
    if (condition) { 
    // Do code that only needs to be run if this condition is true 
    } else { 
    // Execute for when this is not true 
    } 
} 

Si vous cherchez à ne faire exécuter du code lorsque condition n'est pas vrai, alors faites ceci:

@Scheduled(fixedRate = 30000) 
public void doThings() { 
    ... 
    // Analysis for condition 
    ... 
    if (!condition) { 
    // Do code that only needs to be run if this condition is not true 
    } 
} 

Depuis l'intention de votre question n'est pas totalement clair, je m'excuse à l'avance si cet exemple est trop simplifié. S'il vous plaît ajouter plus d'informations pour éclaircir exactement ce que vous cherchez.

+0

Note à qui que ce soit descendu: Je voudrais savoir pourquoi. Est-ce que la logique est imparfaite? Le paradigme? L'exemple n'était pas assez large? Aidez-moi pour que je puisse aider un autre OP à un moment donné. Merci! –

0

Vous aurez besoin de construire l'état dans votre travail. Voici une façon de le faire. Lorsque votre "vrai" instruction se produit, définissez le travail en mode PENDING. Puis sur le prochain 30 deuxième cycle, PENDING-> READY. Puis réinitialiser après l'exécution du code.

public class ScheduleTasks { 

private static final Logger logger = Logger.getLogger(ScheduleTasks.class); 

public enum JobState { 
    NONE, 
    PENDING, 
    READY; 
} 

JobState jobState = JobState.NONE; 
static int x = 0; 

@Scheduled(fixedRate = 30000) 
public void doThings() { 

    if (jobState == JobState.PENDING) 
     jobState = JobState.READY; 

    // Here I am just simulating your 'true' statement every now and then 
    x++; 
    if (x % 3 == 0) { 
     jobState = JobState.PENDING; 
    } 

    logger.info("jobState="+jobState); 
    if (jobState == JobState.NONE || jobState == JobState.READY) { 
     logger.info("Executing code"); 
     jobState = JobState.NONE; 
    } 

}