Как приостановить объект Runnable () для тестирования - PullRequest
0 голосов
/ 23 сентября 2019

У меня следующая ситуация: я отправляю n потоков в NotifyingBlockingThreadPoolExecutor следующим образом:

while ( index < customers.length ) {
    threadPoolExecutor.submit( new Runnable() {                       
        @Override
        public void run() {
            //callToExternalServiceHere;
            response = mockWebService();
        }
    });
    index++;
}

Каждый поток вызывает внешний веб-сервис, который нам пока недоступен.В итоге я создал фиктивный класс, который возвращает ответ с некоторыми данными в нем.Теперь я хотел бы иметь возможность смоделировать задержку в ответе, как я могу достичь этой цели?

Заранее спасибо

Обновление:

Это кодя использую для создания экземпляра NotifyingBlockingThreadPoolExecutor

public static NotifyingBlockingThreadPoolExecutor getThreadPoolExecutor() {
    if ( instance.threadPoolExecutor == null ) {
        int numThread = 0;
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        System.out.println( "CheckMultiTransaction - getThreadPoolExecutor - availableProcessors: " + availableProcessors );
        if ( WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_NUMTHREAD ) != null ) {
            numThread = Integer.parseInt( WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_NUMTHREAD ) );
            System.out.println( "CheckMultiTransaction - getThreadPoolExecutor - numThread indicati nella S_SYSTEM: " + numThread );
            numThread = numThread > availableProcessors ? availableProcessors : numThread;
        }
        else {
            numThread = availableProcessors;
        }

        System.out.println( "CheckMultiTransaction - getThreadPoolExecutor - numThread : " + numThread );
        int queueSize = numThread * 2; // recommended - twice the size of the poolSize
        int threadKeepAliveTime = 15;
        TimeUnit threadKeepAliveTimeUnit = TimeUnit.SECONDS;

        long maxBlockingTime = 10;
        TimeUnit maxBlockingTimeUnit = TimeUnit.MILLISECONDS;
        boolean useTimeoutQueue = false;
        if ( WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_MAXBLOCKINGTIME ) != null ) {
            maxBlockingTime = Long.parseLong( WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_MAXBLOCKINGTIME ) );
            useTimeoutQueue = true;
        }
        final boolean useTimeoutQueueThread = useTimeoutQueue;
        System.out.println( "THREAD_MULTITRN_MAXBLOCKINGTIME:" + WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_MAXBLOCKINGTIME ) );

        Callable<Boolean> blockingTimeoutCallback = new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                System.out.println( "blockingTimeoutCallback - useTimeoutQueue:" + useTimeoutQueueThread + " - Thread.currentThread().isInterrupted():" + Thread.currentThread().isInterrupted() );
                if ( useTimeoutQueueThread )
                    return false;
                else
                    return !Thread.currentThread().isInterrupted(); // keep waiting
            }
        };

        instance.threadPoolExecutor = new NotifyingBlockingThreadPoolExecutor( numThread, queueSize, threadKeepAliveTime, threadKeepAliveTimeUnit, maxBlockingTime, maxBlockingTimeUnit, blockingTimeoutCallback );
    }
    return instance.threadPoolExecutor;
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы обязательно можете вызвать Thread.sleep(5000) в mockWebService() методе, чтобы сделать 5-секундную задержку.Или просто поместите Thread.sleep(5000) в Runnable например

threadPoolExecutor.submit( new Runnable() {                       
        @Override
        public void run() {
            Thread.sleep(5000);
            //callToExternalServiceHere;
            response = mockWebService();
        }
    });

Но я бы скорее рекомендовал вам использовать некоторую библиотеку для пробного тестирования, например, Mockito, для создания макета объекта веб-сервиса.В этом случае вы сможете более гибко управлять поведением вашего фиктивного веб-сервиса.Например, чтобы заставить фиктивную веб-службу выполнить некоторую задержку, вы должны сделать что-то вроде:

Mockito.doAnswer(new Answer() {
   public Object answer(InvocationOnMock invocation) {
       Thread.sleep(<delay_timeout>);
       return "web_service_response_body_object";
   }})
 .when(webServiceMock).doWebServiceCall();

См. Документацию Mockito и метод Mockito.doAnswer документация для более подробной информации.

0 голосов
/ 26 сентября 2019

Проблема решена.Thread.sleep () не работал должным образом, потому что numThread был равен 1 в конфигурации:

numThread = Integer.parseInt( WSConfiguration.getProperty( WSConstants.THREAD_MULTITRN_NUMTHREAD ) );

Таким образом, threadPoolExecutor (созданный с использованием numThread в качестве параметра для poolSize) был ограничен однимпоток за раз, он вообще не работал параллельно.

instance.threadPoolExecutor = new NotifyingBlockingThreadPoolExecutor( numThread, queueSize, threadKeepAliveTime, threadKeepAliveTimeUnit, maxBlockingTime, maxBlockingTimeUnit, blockingTimeoutCallback );

Спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...