Précédent   Forum du club des développeurs et IT Pro > Java > Développement Web en Java > Servlets/JSP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 13h21   #1
giffle
Invité régulier
 
Inscription : janvier 2003
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 42
Points : 8
Points : 8
Par défaut Problème avec InputStreamReader

Bonjour,

J'ai un petit soucis pendant la migration d'une application de Solaris/Jrun vers RH5/Tomcat :

En fait il s'agit d'un servlet qui lance un script shell qui lui-meme execute une requete SQL ( à travers sqplus ) . Le resultat est censé être affiché via un JSP ! Tous cela marche bien sous Solaris mais pas dans la nouvelle config.

J'ai tracké le problème et le soucis se situe au niveau du InputStreamReader ( dans le servlet ) qui ne récupère rien en RH5 . Le bout de code concerné est plus bas.

Je ne suis pas très à l'aise avec ces notions et je ne sais pas par quel bout continuer mes recherches .

Merci d'avance à ceux qui voudront bien m'aider à comprendre.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
Process processus = java.lang.Runtime.getRuntime().exec(cmd); // cmd est la ligne de commande qui lance le script  
BufferedReader in = new BufferedReader(new InputStreamReader(processus.getInputStream()));
String inputline;
while ((inputline = in.readLine()) != null) {
  if (inputline.startsWith("-"))
	inputline = "<p align='center'><img src='" + rootPath + "/images/separateur.gif' width='100%' height='20'></p>";
  else if (format.equals("CSV") || format.equals("TXT"))
	inputline = inputline + "<BR>";
 
if (inputline.startsWith("Connected."))
	inputline = " ";
	resultlist.add(inputline);
}
in.close();
processus.destroy();
giffle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 13h56   #2
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
parmi le code que tu n'as pas montré, y a t'il un traitement de ton inputline ?

puisqu'il a l'air de manquer plusieurs éléments, voici un exemple de comment je traite les inputstreams de mes process:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
BufferedReader br = null;
StringBuffer content = new StringBuffer();
try{
	br = new BufferedReader(new InputStreamReader(processus.getInputStream()));
	String line = null;
	String endline = "\n";
	while ( (line = br.readLine()) != null ){
		content.append(line).append(endline);
	}
} catch (IOException ioe){
	// Log exception
} finally {
	if (br != null){
		try {
			br.close();
		} catch (IOException ioe) {
			//Log exception
		}
	}
	if (processus.getInputStream() != null){
		try {
			stream.close();
		} catch (IOException ioe) {
			//Log exception
		}
	}
}
// Tout l'output du process est contenu dans content
System.out.println(content.toString());
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 14h13   #3
fxrobin
Membre Expert
 
Avatar de fxrobin
 
Homme
Formateur JAVA / XML
Inscription : novembre 2007
Messages : 849
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Formateur JAVA / XML
Secteur : Service public

Informations forums :
Inscription : novembre 2007
Messages : 849
Points : 1 277
Points : 1 277
Bonjour,

et la commande de script qui est lancée, elle est disponible ?
Quelle est cette commande ?
Est-ce que la JVM (sous-entendu, le process owner de la JVM) peut-elle lancer ce processus ?

Car je pense plutôt que c'est la commande qui ne se lance pas et pas le traitement de sa réponse.
__________________
Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...
fxrobin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 14h36   #4
giffle
Invité régulier
 
Inscription : janvier 2003
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 42
Points : 8
Points : 8
Oui je penche aussi pour un pb au lancement de la commande.

C'est ce que je suis en train de vérifier . Mais comment ?

Je récupère dans le log la ligne de commande cmd utilisée ici :
Code :
1
2
 
Process processus = java.lang.Runtime.getRuntime().exec(cmd);
je lance cette commande dans une fenetre avec le user utilisé par Tomcat et ca marche bien .

Par contre je ne sais pas vérifier si, via le servlet la commande est bien lancée ( je pense que non ...)
giffle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 15h01   #5
Gardyen
Membre chevronné
 
Avatar de Gardyen
 
Inscription : août 2005
Messages : 494
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France

Informations forums :
Inscription : août 2005
Messages : 494
Points : 676
Points : 676
Envoyer un message via ICQ à Gardyen
de la même manière que tu récupères l'output, tu peux récupérer l'ErrorStream de ton process, ainsi que l'exitValue (cf doc)

en les loggant tu devrais avoir quelques indices de plus...
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
Plus les choses changent, plus elles restent les mêmes
Gardyen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 15h41   #6
fxrobin
Membre Expert
 
Avatar de fxrobin
 
Homme
Formateur JAVA / XML
Inscription : novembre 2007
Messages : 849
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Formateur JAVA / XML
Secteur : Service public

Informations forums :
Inscription : novembre 2007
Messages : 849
Points : 1 277
Points : 1 277
Légère digression toutefois, depuis JAVA 5 il existe ProcessBuilder et Process qui sont bien plus pratiques pour exécuter les commandes externes ... :

http://javasearch.developpez.com/j2s...ssBuilder.html

http://blog.bensmann.com/executing-o...ystem-commands
__________________
Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...
fxrobin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 15h45   #7
giffle
Invité régulier
 
Inscription : janvier 2003
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 42
Points : 8
Points : 8
J'essaie ça dès Lundi !
giffle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 16h20   #8
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Ce n'est pas comme ça qu'on crée des processus:

1) on n'appelle pas destroy() n'importe où, on attends gentillement que le processus aie terminé (waitFor), ça évite de le tuer alors qu'il a pas fini son boulot
2) on traite les process.getErrorStream aussi. Sinon, on ne sais jamais ce qui se passe comme erreur
3) on préfère le exec(String[]) au exec(String) qui permet de mieux passer les argument
4) on catche l'exception qui peux être lancée par exec (par exemple si la commande n'existe pas)
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 17h15   #9
giffle
Invité régulier
 
Inscription : janvier 2003
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 42
Points : 8
Points : 8
Je comprends bien ce que tu dis mais je ne suis ni un champion de java ni l'auteur de ce code . J'essai de comprendre pourquoi ca ne marche plus :

J'hérite de cette appli que je dois migrer vers un nouvel environnement de production et ceci sans la réécrire ...

Cependant si je peux améliorer les choses pourquoi pas. Aurais tu un exemple de code utilisant les méthodes que tu décris ? Je pourrais ainsi traiter mon process proprement et détecter ce qui ne marche pas.

Merci d'avance
giffle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 18h50   #10
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
D'abord, ce code ne lit pas le errorSTream. Du coup, impossible pour toi de voir les messages d'erreur de l'application et donc impossible de savoir pourquoi elle "ne marche pas".


Une première correction, serait, en passant par processBuilder, de faire cette correction:

Code :
1
2
 
Process processus =  new ProcessBuilder(cmd).redirectErrorStream(true).start();
Ceci, au moins, te permettra d'avoir tes erreur dans la jsp.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 15h24   #11
giffle
Invité régulier
 
Inscription : janvier 2003
Messages : 42
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 42
Points : 8
Points : 8
Bonjour,

Je reviens sur ce topic pour vous dire que mon pb est résolu : en fait il s'agissait d'un problème de Shell :
Une commande sqlplus lancée par un script ksh : celui-ci fontionne bien lorsqu'on le lance à la main mais ne foncionnnait plus lorsqu'il est lancé par un process Java.

Le fait d'utiliser le bash à la place du ksh sur la nouvelle machine résout le pb.

Merci pour votre aide
giffle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h46.


 
 
 
 
Partenaires

Hébergement Web