2009-07-07 5 views
2

J'implémente un client SOAP en utilisant Apache Axis 2. Comme le client SOAP doit gérer un grand nombre de requêtes, j'utilise un pool de connexions.Comment puis-je tester si mon pool de connexions fonctionne correctement?

Pour que je devais définir quelques configuration de la couche de transport de mon talon qui a été généré à partir d'un fichier WSDL:

stub._getServiceClient().getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Constants.VALUE_TRUE); 

MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); 
connectionManager.getParams().setDefaultMaxConnectionsPerHost(MAX_CONNECTIONS_PER_HOST); 
connectionManager.closeIdleConnections(IDLE_CONNECTION_TIMEOUT); 
HttpClient httpClient = new HttpClient(connectionManager); 

stub._getServiceClient().getOptions().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); 

Mon client semble fonctionner très bien. Cependant, je voudrais savoir comment je peux tester si le pool de connexion fonctionne correctement (c'est-à-dire que les connexions créées ne sont détruites qu'après le temps défini par la constante IDLE_CONNECTION_TIMEOUT). Des idées?

Répondre

1

Pseudo-code sur la base 3.x JUnit:

setUp() { 
    initialize connection manager; 
    initialize connection by creating client; 
    } 

    tearDown() { 
    close connection if necessary; 
    close connection manager if necessary; 
    } 

    testConnectionOpen() { 
    assert that connection is open; 
    pause for time of idle connection timeout - 1 second; 
    assert that connection **is still open**; 
    } 

    testConnectionClosed() { 
    assert that connection is open; 
    pause for time of idle connection timeout + 1 second; 
    assert that connection **is closed**; 
    } 

Ajout de 1 seconde et 1 seconde soustraction doit être ajustée en fonction de la sensibilité du gestionnaire de connexion.

0

Écrivez une application de test qui fera un grand nombre de demandes, et affirment que le nombre de connexions n'est jamais plus que MAX_CONNECTIONS. Vous pourriez être en mesure de vérifier sur ce dernier en attachant jconsole ou VisualVM au processus. Vous pouvez également utiliser Jakarta JMeter pour générer une charge sur la classe/client, puis extraire plusieurs points de données (ne savez pas comment vous auriez accès au nombre de connexions client créées, cependant).

0

Vous pouvez le tester en changeant les paramètres

  • NO_OF_THREADS
  • POOL_SIZE
  • ENABLE_CONNECTION_POOLING

/** number of concurrent searches */ 
private static final int NO_OF_THREADS = 20; 

/** size of the http connection pool */ 
private static final int POOL_SIZE = 20; 

/** enabling or disabling the connection pool */ 
private static boolean ENABLE_CONNECTION_POOLING = true; 

/** close idle connection time in milliseconds 
* connections will be release if they are idle for this time */ 
private static int CLOSE_IDLE_CONNECTION_TIME = 1000; 

public void test() 
{ 
    init(); 

    long start = System.currentTimeMillis(); 

    List<Thread> threads = new ArrayList<Thread>(); 
    for (int i = 0; i < NO_OF_THREADS; i++) 
    { 
     SimpleThread thread = new SimpleThread(); 
     thread.start(); 

     threads.add(thread); 
    } 

    for (Thread t : threads) 
    { 
     try 
     { 
      t.join(); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    logger.info("************* Test Finish In *******************" + (System.currentTimeMillis() - start) + " ms"); 
} 

public void init() 
{ 
    super.init(); 

    try 
    { 
     long t1 = System.currentTimeMillis(); 
     stub = new Viva_x0020_external_x0020_API_x0020_for_x0020_partnersStub(endUrl); 

     if (ENABLE_CONNECTION_POOLING) 
     { 
      stub._getServiceClient().getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Constants.VALUE_TRUE); 
      MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); 
      connectionManager.getParams().setDefaultMaxConnectionsPerHost(POOL_SIZE); 
      connectionManager.closeIdleConnections(CLOSE_IDLE_CONNECTION_TIME); 
      HttpClient httpClient = new HttpClient(connectionManager); 
      stub._getServiceClient().getOptions().setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); 
     } 

     logger.info("Connection Established in " + (System.currentTimeMillis() - t1) + "ms"); 
    } 
    catch (AxisFault e1) 
    { 
     e1.printStackTrace(); 
     fail("Error on creating the stub"); 
    } 

    logger.info("Connection Initialized successfully"); 
} 

public class SimpleThread extends Thread 
{ 
    public void run() 
    { 
     search(); 
    } 
} 

private static void search() 
{ 
    logger.info("$$$$$$$$$$$$$ Start the Search $$$$$$$$$$$$$$"); 
    GetAirportConnections request = new GetAirportConnections(); 
    request.setAirportCode("MTY"); 

    GetAirportConnectionsResponse response = null; 
    try 
    { 
     long t1 = System.currentTimeMillis(); 
     response = stub.getAirportConnections(request, getUserCredentials()); 
     logger.info("Results Retrived in " + (System.currentTimeMillis() - t1) + "ms"); 
    } 
    catch (Exception e) 
    { 
     logger.error("------------------------- Connection Timeout --------------------------"); 
     e.printStackTrace(); 
     fail(e.getMessage()); 
    } 

    Airport[] airports = response.getGetAirportConnectionsResult().getAirport(); 
    logger.info("Number of airports : " + airports.length); 
} 

}

+0

comment ce test si les connexions sont détruites après le délai d'inactivité? –