Domanda

Sono l'attuazione di un client SOAP utilizzando Apache Axis 2. Dal momento che il client SOAP deve gestire un numero pesante di richieste Sto usando un pool di connessioni.

Per fare questo ho dovuto impostare un paio di configurazione di livello di trasporto del mio stub che è stato generato da un file 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);

Il mio cliente sembra funzionare bene. Tuttavia, vorrei sapere posso verificare se il pool di connessione funziona in modo corretto (cioè i collegamenti creati vengono distrutti solo dopo il tempo definito dalla costante IDLE_CONNECTION_TIMEOUT). Tutte le idee?

È stato utile?

Soluzione

Pseudo-codice basato su JUnit 3.x:

  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**;
  }

Aggiunta 1 secondo e sottraendo 1 secondo dovrebbe essere regolata a seconda della sensibilità della gestione connessione.

Altri suggerimenti

Scrivi un'applicazione banco di prova che farà un gran numero di richieste, e affermano che il numero di connessioni non è mai più di MAX_CONNECTIONS. Potreste essere in grado di controllare questi ultimi allegando JConsole o VisualVM al processo.

Si potrebbe anche considerare di usare Jakarta JMeter per la generazione del carico sulla classe / cliente, e poi graficamente fuori diverse datapoint (non so come ci si guadagna l'accesso al numero di connessioni client creato, però).

È possibile verificare che cambiando i parametri

  • 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 );
}

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top