2016-06-27 2 views
0

Я пытаюсь использовать ExecutorService Java для отправки параллельных запросов REST, которые делают различные журналы системной информации (поступающие с контроллера), однако запутываются в ошибку. Около половины моих запросов успешно добираются до цели, но другая половина выглядит так, как будто они отправлены, но не найдены на сервере, на который они были отправлены. Я думаю, что у меня может быть недостаток в логике создания моей Исполнительной службы. Функция log(), показанная ниже, может быть вызвана из вызова REST контроллеру и предположительно для создания нового потока, который отправляет отдельный HTTP-запрос и продолжит основной поток, чтобы не дожидаться сети I/O. После долгих поисков, я считаю, что я отключил ExecutorService, ожидая завершения потока. Может ли кто-нибудь увидеть некоторую ошибку в логике создания моего потока, поскольку могут появляться многочисленные запросы от контроллера?Ошибка вызова Java ExecutorService REST

//Controller 
//code 
@RequestMapping(value="/log", method= RequestMethod.GET) 
public String log() 
{ 
    genomicsLogger.log(Severity.err, Category.LOG, "This is a log from the reporting manager!"); 
    return "Hopefully logged"; 
} 


//ClassB 
public String log(String trns , String user, Severity severity, Category category, String msg) { 
       trnsField = trns; 
       userField = user; 
       ... 
       ... 
       ... 
       ExecutorService executor = Executors.newFixedThreadPool(1); 
       Runnable task =() -> { 



         try { 
          System.out.println("Started thread: " + Thread.currentThread().getName()); 
          restService.consumeRest(true, instance.getUri().toString(), LOG_URI, list, log, HttpMethod.POST, new HttpHeaders(), String.class); 
          System.out.println("SENT REST REQUEST"); 
         } catch (URISyntaxException e) { 
          e.printStackTrace(); 
         } catch (KeyStoreException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } catch (CertificateException e) { 
          e.printStackTrace(); 
         } catch (NoSuchAlgorithmException e) { 
          e.printStackTrace(); 
         } catch (UnrecoverableKeyException e) { 
          e.printStackTrace(); 
         } catch (KeyManagementException e) { 
          e.printStackTrace(); 
         } 

        } 
       }; 
        executor.submit(task); 
       try { 
        System.out.println("attempt to shutdown executor"); 
        executor.shutdown(); 
        executor.awaitTermination(5, TimeUnit.SECONDS); 
       } 
       catch (InterruptedException e) { 
        System.err.println("tasks interrupted"); 
       } 
       finally { 
        if (!executor.isTerminated()) { 
         System.err.println("cancel non-finished tasks"); 
        } 
        executor.shutdownNow(); 
        System.out.println("shutdown finished"); 
       } 

       return ""; 
      } 
+0

Непонятно, почему вы хотите создать ExecutorService для одного потока при каждом вызове 'log()'. Общая схема заключается в создании (глобального) ExecutorService с рациональным размером ('Executors.newFixedThreadPool (100)') и выключения при выходе из программы. – PeterMmm

ответ

0

Вы создаете службу исполнителей с каждым журналом и убиваете его.

Это не способ его использования, он предназначен для повторного использования, делает его, например. поле этого класса и установить некоторое количество потоков, которые вы готовы использовать для него (вероятно, выше 1). И не делайте остановки на нем, пока не убедитесь, что он не будет использоваться (например, во время отключения приложения).

Смежные вопросы