IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Servlet qui renvoie un JSON: Traitement parallèle ?


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Par défaut Servlet qui renvoie un JSON: Traitement parallèle ?
    Bonjour,

    J'ai un probleme avec un servlet et des appels paralleles.
    J'envoie un request a mon Servlet et il me renvoie des données au format JSON.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public JSONArray getSQL(String aServletURL)
    {
     JSONArray statham = null;
     String returnString = "";
     try
     {
     	URL myUrl = new URL(aServletURL);
            URLConnection conn = myUrl.openConnection();
            conn.setDoOutput(true);
            BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream() ) );
            String s;
            while ((s = in.readLine()) != null )
             returnString += s;
            in.close();
     
            toReturn = new JSONArray(returnString);
     }
     catch(Exception e)
     {
     	return new JSONArray();
     }
            return toReturn;
    }
    Ca marche plutot bien, sauf que quand je fais beacoup de requetes en meme temps, les resultats se melangent.
    Pense qu'il s'agit du mode de reception, le BufferedReader qui lit String a partir du tInputStream de la URLConnection.

    Ma question: Comment faire pour etre sur que la réponse que je reçois correspond a la requete que j'ai envoyée ?

    Merci !

  2. #2
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    en théorie non ca ne doit pas poser de probleme.

    tu as des attributs dans ta servlet ?
    peux tu poster le code complet ?

  3. #3
    Membre averti
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Par défaut
    Le servlet fonctionne correctement (je pense). Enfin dans le doute...

    Explications:

    - Le servlet est la pour renvoyer les resultats de requetes SQL predefinies
    - On lui envoie le nom de la requete et les params et il renvoie le resultat sous forme de JSON array qui contient un JSON Object par resultset.
    - S'il ne connait pas la requette, il renvoie un JSON object contenant toutes les requetes disponibles.

    Le format des SQLs predefinis dans un fichier properties est le suivant:
    nomDeLaRequete=Select * from blabla where id = PARAM

    Le servlet va ensuite remplacer PARAM par le parametre qu'on lui donne.

    Le code du servlet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    public class QuerySql extends HttpServlet 
    {
    	// Constants
    	private static final long serialVersionUID = 1L;
    	private static final String QUERY_FILE_PATH = "/path/to/getSql.properties";
     
    	// Attributes
    	private Properties queryProps;
    	private HashMap allQueries;	
    	private JSONObject resultList;
    	private JSONArray statham;
     
        public QuerySql() {
            super();
            // TODO Auto-generated constructor stub
        }
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    	{
    		queryProps  = new Properties();
    		allQueries = new HashMap();
    		statham = new JSONArray();
     
    		response.setContentType("application/json");
    		PrintWriter out = response.getWriter();
     
    		// Read the Properties
    		AllSettings.readProps();
    		readPropsQueries();
     
    		// Get the query
    		String aStatement = (String) allQueries.get(request.getParameter("sqlStatement"));
     
    		// Get the params
    		ArrayList params = new ArrayList();
    		Map allFormParameters = request.getParameterMap();
            Set set = allFormParameters.keySet();
            Iterator iterator = set.iterator();
            String tmp = null;
     
            // Get the params from the web form
            while (iterator.hasNext()) 
            {
            	tmp = (String) iterator.next();
            	if (tmp.matches("param[0-9]+"))
            	{
            		String currentParamValue = ((String[])allFormParameters.get(tmp))[0];
            		if(!currentParamValue.equals(""))
            			params.add(currentParamValue);
            	}
            }
     
            // Check if the Query was found
            if(aStatement == null) // Not found
            {
            	resultList = new JSONObject();
            	try 
            	{
    				Set s = allQueries.keySet();
    				Iterator i = s.iterator();
    				while(i.hasNext())
    				{
    					Object key = i.next();
    					Object value = allQueries.get(key);
     
    					resultList.put((String) key, value);
    				}				
    			} catch (JSONException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    			String callBack = request.getParameter("jsoncallback");
    			if(callBack != null)
    				out.print(callBack + "(" + resultList + ");");
    			else
    				out.print(resultList);
    			out.close();
            }
            else // Found the query
            {
    	        // Replace the params in the query
    	        String newStatement = aStatement;
     
    	        // Loop over all the PARAMS
    	        for(int i = 0; i < params.size(); i++)
    	        {
    	        	String multipleParams = "";
    	        	String currentParam = (String) params.get(i);
    	        	String[] multipleParamsTable = currentParam.split(",");
     
    	        	// If one PARAM contains more than one value, split the values into an SQL list of values
    	        	for(int j = 0; j < multipleParamsTable.length; j++)
    	            {
    	        		if(j == multipleParamsTable.length - 1)
    	        			multipleParams += multipleParamsTable[j];
    	        		else
    	        			multipleParams += multipleParamsTable[j] + "','";
    	            }	            
     
    	        	newStatement = newStatement.replaceFirst("PARAM", "'" + multipleParams + "'");
    	        }
     
    			// Connect to the DB
    			java.sql.Connection conn = null;
    			java.sql.Statement s = null;
    			ResultSet rs = null;
     
    			try 
    			{
    				String dbInfo = AllSettings.myDboconf.getProperty("myDb");
    				String[] connectInfo = dbInfo.split(",");
    				Class.forName("oracle.jdbc.OracleDriver").newInstance();
    				String dbConnectionString = "jdbc:oracle:thin:@" + connectInfo[1] + ":" + connectInfo[2] + ":" + connectInfo[3];				
    				conn = DriverManager.getConnection (dbConnectionString, connectInfo[4], connectInfo[5]);
    	            s = conn.createStatement();
    	            rs = s.executeQuery(newStatement);
    	            ResultSetMetaData rsmd = rs.getMetaData();
     
    	            // Get the results
    	           	while(rs.next())
    	           	{
    	           		resultList = new JSONObject();
    	           		for(int i = 1; i <= rsmd.getColumnCount(); i++)
    	           		{
    	           			String valueForInsert = rs.getString(i);
    	           			if(valueForInsert == null)
    	           				valueForInsert = "null"; // Ensures that the values are added to the JSON object even when the value is null
    	           			resultList.put(rsmd.getColumnName(i), valueForInsert);
    	           		}
    	           		statham.put(resultList);
    	           	}
     
    	        }     
    	        catch (Exception e) {
    	        	e.printStackTrace();
    	        }
    	        finally
    	        {
    	            try {
    					s.close();
    		           	rs.close();
    		        	conn.close(); 
    				} catch (SQLException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    	        }
     
    			// Send back the results JSON
    			String callBack = request.getParameter("jsoncallback");
    			if(callBack != null)
    				out.print(callBack + "(" + statham + ");");
    			else
    				out.print(statham);
    			out.close();
    		}
    	}
    Je ne pense pas que le probleme vient du Servlet, mais plutot de la methode que j'utilise pour lire ses resultats (cf 1er post).

    Ce servlet est par ailleurs appellé par du JavaScript avec JQuery, et il existe pour cela le JSONCallback - me faut-il un mechanisme similaire ?

    Dsl pour le pavé

  4. #4
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Par défaut
    pour moi (j'ai lu en diagonale) ton problème vient des attributs
    private JSONObject resultList;
    private JSONArray statham;

    ces objets sont partagés par tous les threads qui passent dans cette servlet.
    declare les dans la méthode doPost, ca devrait régler ton problème.

    voir aussi
    private Properties queryProps;
    private HashMap allQueries;

    pas le temps de voir precisement a quoi ca sert, mais si c'est contextuel a un appel, il ne faut pas les declarer en attribut

  5. #5
    Membre averti
    Inscrit en
    Août 2006
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 46
    Par défaut
    Oh bah merde alors - merci beacoup, j'ai testé et pour le moment je n'ai plus d'erreurs. C'est toujours bien d'avoir un avis exterieur !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une seule ListView pour plusieurs fichier php qui renvoie des données JSON
    Par max8392 dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 22/08/2014, 10h46
  2. Json qui renvoie des tags html
    Par laloune dans le forum jQuery
    Réponses: 2
    Dernier message: 24/05/2013, 17h43
  3. Servlet qui renvoie plusieurs images
    Par Jidefix dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 28/10/2009, 17h31
  4. [Image] Servlet qui renvoie une image sur HttpServletResponse
    Par Z4ng3tsu dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 10/09/2009, 14h00
  5. servlet qui renvoi un string à un client desktop
    Par Halloula dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 11/03/2009, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo