Prise en Java pour dormir entre les boucles, le temps de sommeil désigné par ligne de commande sur Linux
J'ai été affecté à la conception d'un programme java sur une machine linux:
- Se connecte à une base de données
- lit un enregistrement
- récupérer certaines informations et de les envoyer à Nagios, en fonction d'un champ connu comme "threat_level'
- lire l'enregistrement suivant et répétez l'étape 3 jusqu'à ce que tous les enregistrements ont été lus
Maintenant, j'ai besoin d'obtenir ce à exécuter toutes les quelques minutes; donc ce que mon partenaire n'était de créer un script qui utilise une boucle pour exécuter le programme, dort quelques minutes et répétez.
Récemment, mon patron nous a dit que c'est bien, mais serait comme l'ensemble de la procédure pour être complètement autonome en java, ce qui signifie que c'boucles et dort dans java. En plus de cela, il aimerait que la durée du sommeil être déterminée par la ligne de commande à chaque fois que le programme est exécuté.
J'ai fait quelques recherches et il semble que l'utilisation de Fil.sleep() est inefficace dans certaines circonstances et je ne peux pas dire si c'est l'un d'eux ou pas. Aussi, je suis toujours dans le flou sur la façon d'avoir le temps de sommeil être déterminé via la ligne de commande lors de l'exécution du programme. Je peux fournir le code si nécessaire.
C'est une préoccupation que j'ai vu quelques fois pendant que je faisais des recherches sur le processus. Je n'ai toujours pas avoir une compréhension claire.
Si vous pouvez trouver une commande dans l'API Java qui est si inefficace que ça prend assez de temps important par rapport à la quelques minutes de sommeil, je vais manger mon chapeau. Je n'ai pas de chapeau, mais je juge une telle commande à être tellement improbable que je vous propose de sortir, acheter un chapeau, et de le consommer.
OriginalL'auteur exit_1 | 2012-07-26
Vous devez vous connecter pour publier un commentaire.
Thread.sleep()
est très bien, surtout quand vous voulez dormir pour "quelques minutes":Thread.sleep()
peut être inefficace ou pas assez précis à la milliseconde plages de temps, mais pas dans votre cas. Mais si vous voulez le processus à exécuter dans la même fréquence (par opposition à l'fixe avec retard), pensez à:C'est important de "faire votre travail" une partie peut prendre beaucoup de temps et vous souhaitez le processus avec la fréquence exacte.
Aussi pour des raisons de lisibilité envisager
TimeUnit
classe (utiliseThread.sleep()
- dessous):Je upvote mais je suis actuellement n'ont pas assez de réputation pour ce faire, Désolé.
J'ai essayé d'utiliser votre méthode suggérée cependant, j'obtiens une exception: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 à SnortMonitor.principale(SnortMonitor.java:26) je pense que c'est dû à la façon dont je entrer mon argument sur la ligne de commande mais je ne suis pas tout à fait sûr. Je suis à l'utilisation de linux et d'entrée de 5$, de sorte qu'il va exécuter toutes les 5 secondes pour le test
your-app.jar 5 ou
java Main 5
devrait fonctionner parfaitementhm, eh bien lorsque j'utilise 5 au lieu de 5$, il dit: "javac:drapeau invalide:5" faut-il faire une différence que je fais cela à l'intérieur d'un script? Je peux poster mon script si cela serait plus utile.
OriginalL'auteur Tomasz Nurkiewicz
Définir un système de propriété sur la ligne de commande lors du démarrage du programme: -Dmy.sommeil.temps=60000
Puis obtenir ce paramètre: long mySleepTime = Système.getProperty("mon.sommeil.temps");
Regarder l'Exécuteur cadre. Le ScheduledExecutorService a un scheduleWithFixedDelay qui va probablement faire ce que vous voulez (exécuter votre code avec un temps de retard entre les exécutions).
OriginalL'auteur Jeremy Brooks
Prendre un coup d'oeil à la
java.util.Concurrent
API, en particulier, vous pouvez être intéressé par la ScheduledExecutorServiceOriginalL'auteur MadProgrammer
Lorsque vous lancez quelque chose en Java avec des arguments de ligne de commande, ils sont stockés dans la fonction principale du paramètre args, comme dans:
Si vous avez seulement l'un argument, et c'est un nombre, vous pouvez la transformer en un entier en utilisant:
Qui permet de renvoyer la valeur de l'entier représenté par la Chaîne stockée comme le zéro de l'élément du tableau args.
EDIT: Notez que vous envoyez des arguments de ligne de commande lors de l'appel de la Machine Virtuelle Java avec:
Où MyCompiledFile est le nom du fichier que vous souhaitez exécuter, et arg0, arg1 et arg2 (vous pouvez avoir autant d'arguments que vous voulez) sont les Chaînes qui vont dans args[0], args[1], args[2] dans le paramètre passé à la main. Si vous avez plusieurs fichiers dans plusieurs répertoires, vous devez spécifier un chemin de classe - un répertoire qui contient tous les répertoires qui contiennent vos fichiers. (Notez que ce sont des fichiers binaires, le résultat de la compilation des fichiers sources, pas la source des fichiers eux-mêmes). Dans ce cas, utilisez:
Où MyClassPath est le Linux classpath (comme par exemple /home/usr/bin).
Vous entrez les arguments de ligne de commande avec la commande pour exécuter le programme; voir l'édition de mon post.
Ahhh, je vois, merci, très bien expliqué. Toutefois, il soulève une autre question. Actuellement, j'ai un petit script appelé "testrun" qui compile avec tous mon pot et src fichiers, de sorte que je n'ai pas besoin d'ajouter de chaque chemin. En outre, j'ai un script appelé "testrun2' qu'il fonctionne de la même manière. Est-ce que ça va poser un problème pour le passage d'arguments en java? Est-il une meilleure façon que je devrais être compilation et de l'exécution?
Il dépend de la façon dont le langage de script fonctionne. Si il y a une certaine façon de passer une commande directement sur la coque, essentiellement le fait de taper "java MyFile arg0 arg1" dans la ligne de commande sans réellement en tapant vous-même, il suffit d'ajouter les arguments de la commande. Si elle appelle une autre manière, il peut être un autre mécanisme, mais je suis à peu près certain qu'il y aura un moyen de passer en arguments de ligne de commande. Il peut avoir besoin d'un peu de lecture sur le langage de script que vous utilisez, cependant.
OriginalL'auteur CosmicComputer