كيف يمكنني اختبار ما إذا كان تجمع الاتصال الخاص بي يعمل بطريقة صحيحة؟

StackOverflow https://stackoverflow.com/questions/1093888

سؤال

أقوم بتنفيذ عميل الصابون باستخدام APACHE AXIS 2. نظرا لأن عميل الصابون يجب أن يتعامل مع عدد كبير من الطلبات التي أستخدمها تجمع اتصال.

للقيام بذلك، اضطررت إلى ضبط عدد قليل من تكوين طبقة النقل من كعبتي التي تم إنشاؤها من ملف 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);

يبدو أن موكلي يعمل بشكل جيد. ومع ذلك، أود أن أعرف كيف يمكنني اختبار ما إذا كان تجمع الاتصال يعمل بطريقة صحيحة (أي يتم تدمير الاتصالات التي تم إنشاؤها إلا بعد الوقت المحدد بواسطة Intle_Connection_Timeout الثابت). أيه أفكار؟

هل كانت مفيدة؟

المحلول

كود زائف بناء على 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**;
  }

إضافة 1 ثانية وطرح 1 ثانية يجب ضبطها اعتمادا على حساسية مدير الاتصال.

نصائح أخرى

اكتب تطبيق Testbed الذي سيعقد عددا كبيرا من الطلبات، وأكد أن عدد الاتصالات ليس أكثر من max_connections أبدا. قد تكون قادرا على التحقق من الأخير عن طريق إرفاق JConsole أو VisualVM بالعملية.

يمكنك أيضا النظر في استخدام جاكرتا JMeter. لتوليد الحمل على الفصل / العميل، ثم رسم تخطيط عدة Datapooints (غير متأكد من كيفية الوصول إلى عدد اتصالات العميل التي تم إنشاؤها، على الرغم من).

يمكنك اختباره عن طريق تغيير المعلمات

  • no_of_threads.
  • حجم تجمع
  • 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 );
}

}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top