18 commandes maximum en 30 secs.. [Résolu]

Signaler
-
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
-
Bonjour,

Je suis entrain de developper un bot pour un server et le server a une restriction sur le nombre de commandes. Ils ne laisse que 18 commandes en 30 secondes sinon il y a une consequence (je vous epargne les details inutile). Enfin bref, en premier j'avais penser de faire en sorte que les commandes se "queue" dans une HashMap et qu'un Timer (aux 30 secs) execute les 18 premieres commandes dans la liste et les efface, ainsi de suite.. le probleme avec cette facon c'est que les commandes ne se font qu'aux 30 secondes au lieu d'etre instantané..

Quelqu'un connait une facon de proceder a une queue de commandes avec une limite de 18 en 30 secondes, que la commande s'execute si sa fait moins de 18 commandes en 30 secondes, sinon ca la met en queue et l'execute quand il faut ?

C'est surtout un probleme mathematique..

PS: Je ne demande pas necessairement le code, une simple explication de comment je devrais proceder suffit ;-)

Merci!

2 réponses

Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

Sinon pour faire dans ton idée de départ:
import static java.lang.System.out;
import static java.lang.Thread.sleep;

import java.util.ArrayDeque;
import java.util.Queue;

public class TestQueue {
  
  private static final int SLEEP_DELAY  = 3000;
  private static final int MAX_REQUESTS = 18;
  private static final int QUEUE_INIT   = 100;
  
  public static void main(final String[] args) {
    final Queue<String> queue = new ArrayDeque<String>();
    for (int i = 0; i < QUEUE_INIT; i++)
      queue.add("Queue item " + i);
    
    new Thread(new Runnable() {
      @Override
      public void run() {
        int nb = 1;
        while (!queue.isEmpty()) {
          if (nb != 1 && (nb % MAX_REQUESTS) == 1)
            try {
              out.println("Max reached wait 3sec.");
              sleep(SLEEP_DELAY);
            } catch (final InterruptedException e) {
              e.printStackTrace();
            }
          out.println(queue.poll());
          nb++;
        }
      }
    }).start();
  }
}


Finalement, j'ai trouver une solution..

J'entre toutes les commandes que je fait dans une hashmap en y indiquant l'heure que la commande a ete performé, quand je dois faire une commande, je prend l'heure actuelle - 30 seconds et je compte combien de resultats il y a dans la HashMap dans ses dernieres secondes, si il y en a moins que 18.. je fait la commande.