2008-09-26 7 views
2

Je cours Hudson en tant que service de fenêtres par Tomcat, sans esclaves impliqués. La dernière étape de construction du travail est un fichier batch qui appelle du code Java. Le code utilise l'outil de ligne de commande de PostgreSQL psql (via Runtime.exec()) pour créer une base de données sur la machine locale et éventuellement exécuter des tests sur celle-ci.Le travail d'Hudson se bloque à Runtime.exec

Le travail progressera jusqu'à ce stade, puis se bloquera indéfiniment sans commencer à créer la base de données. Si j'exécute le fichier batch à partir de la ligne de commande, cela fonctionne parfaitement. Je ne pense pas http://hudson.gotdns.com/wiki/display/HUDSON/Spawning+processes+from+build s'applique, puisque le processus engendré ne semble même pas commencer à s'exécuter, mais je suis nouveau à cela, alors s'il vous plaît laissez-moi savoir si je me trompe. Le seul but du fichier batch est d'invoquer le code Java, et la seule entrée de l'utilisateur est transmise en tant qu'argument de ligne de commande, que je peux voir entrer directement via la sortie de la console de construction. L'Explorateur de processus montre que psql est démarré, mais il n'est évidemment pas exécuté, puisque la première commande psql est de créer une nouvelle base de données, mais cela ne se produit pas.

Édition 2: J'ai reçu quelques conseils de la liste de diffusion des utilisateurs de Hudson, je vais les essayer lundi et rendre compte.

Édition 3: Le code Java consommait déjà les flux de sortie, j'ai utilisé cet article lors du développement du code. Je n'arrive pas à comprendre ce qui se passe, donc je redéveloppe le code pour utiliser JDBC pour créer la base de données, au lieu de compter sur psql et Runtime.exec()

Répondre

0

Il y a une possibilité que le programme attende une entrée de l'utilisateur. Si le service n'est pas configuré pour accepter l'entrée utilisateur, il semblera être suspendu.

Vous pouvez essayer en configurant le service pour autoriser USER INPUT (GUI) - cela pourrait vous aider.

En outre, vous pouvez exécuter Sysinternals ProcessExplorer et ProcessMonitor - ils seront en mesure de savoir où le travail .BAT s'est arrêté.

3

Lisez-vous la sortie du processus? S'il produit plus de sortie que les tampons OS peuvent gérer, vous devez le lire ...

De plus, certains processus attendent que l'entrée soit terminée. Essayez d'appeler process.getInputStream(). Close() après avoir démarré le processus.

Peut-être que cet article est également intéressant. Il est appelé "Quand Runtime.exec() ne sera pas": http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

+0

C'est une excellente ressource, je l'ai utilisé lors de l'écriture du code lui-même. Il pendait, mais il a au moins commencé à créer la base de données, contrairement à maintenant. – rjohnston