2016-10-13 3 views
2

Я использую Spring4 AsyncRestTemplate для совершения звонков в службу внешнего REST API.Использование Spring4 AsyncRestTemplate в методе, который использует аннотацию @Async

Метод ниже от весны @Service класс. AsyncRestTemplate автору от пружины @Bean.

В методе я регистрирую обратные вызовы в ответе ListenableFuture от вызова API REST.

Я не использую возвращенный ListenableFuture за исключением модульных испытаний. Обратные вызовы будут обрабатывать фактические действия, которые я хочу предпринять в зависимости от успеха запроса или отказа.

ExternalServiceImpl.class

public ListenableFuture<ResponseEntity<ResponseBody>> makeExternalCall(RequestBody requestBody) { 

      HttpEntity<RequestBody> request = new HttpEntity<>(RequestBody, getDefaultHeaders()); 

      ListenableFuture<ResponseEntity<ResponseBody>> responseEntity = asyncRestTemplate.exchange(serviceUri.toUriString(), HttpMethod.POST, request, ResponseBody.class); 

      responseEntity.addCallback(
        (onSuccess) -> System.out.println("Success"), 
        (onFailure) -> onFailure.printStackTrace() 
      ); 

      return responseEntity; 
    } 

Я планирую использовать аннотацию @EnableAsync и создание ThreadPoolTaskExecutor, а также добавление @async аннотации к методу в манере, сходной с процедурой, описанной здесь: Spring Asynchronous Methods

Вопросы

  • Это избыточно? Есть ли дополнительное преимущество для масштабирования, когда делает метод асинхронным, хотя я использую AsyncRestTemplate?

  • Есть ли что-нибудь, что считается лучшей практикой, которую мне не хватает в
    Осуществление этого шаблона?

  • Есть ли что-нибудь, на что можно обратить внимание?

ответ

0

@Async не делает ничего, пока вы не добавите @EnableAsync аннотации к приложению. Когда это произойдет, любой код, вызывающий ваш метод makeExternalCall, немедленно вернется, и весна будет искать bean-компонент TaskExecutor, чтобы запустить весь метод асинхронно (а не только ваш сервис asyncRestTemplate, являющийся единственной частью асинхронного кода вашего кода в настоящее время).

Более подробную информацию о весеннем сайте: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

+0

Спасибо, но это не ответ на мой вопрос. Связанная статья показывает, как настроить приложение, включая аннотацию @EnableAsync и настройку ThreadPoolTaskExecutor. – anataliocs

+0

Хорошо, я просто указывал на разницу между использованием @Async и просто AsyncRestTemplate, поскольку я думал, что это то, о чем вы просили. Основываясь на моем дальнейшем чтении, вызовы AsyncRestTemplate будут переданы SpringAsyncTaskExecutor Spring. Учитывая этот подход, не повторное использование потоков, использование пула потоков TaskExecutor может дать вам лучшую производительность, следовательно, лучшее масштабирование :) И я не понимаю, почему вам когда-либо понадобилось синхронизировать его, если вы запускаете его внутри весенний управляемый контейнер. – Pete

+0

Спасибо. Да, я подозревал, что вы заявляете правду, я просто искал более подробный ответ. Fyi, AsyncRestTemplate использует SimpleAsyncTaskExecutor, если вы используете конструктор без параметров. – anataliocs