Post

Spring 4 AsyncRestTemplate

1. AsyncRestTemplate

AsyncRestTemplate은 URL에 액세스하고 출력을 비동기적으로 반환한다. 출력은 결과를 가져오는 get() 메소드가 있는 ListenableFuture 형식이다. AsyncRestTemplate의 두 가지 메서드 exchange()Execution()에 대한 예이다. Spring 4는 요청 객체를 준비하기 위해 AsyncRequestCallback 클래스를 제공한다.

2. org.springframework.web.client.AsyncRestTemplate

AsyncRestTemplate은 클라이언트 측 HTTP 액세스를 위한 기본 클래스이다. 액세스는 비동기식이다. ListenableFuture 객체를 반환하는 프로그램 내에서 URL을 비동기적으로 호출할 수 있다.

3. org.springframework.util.concurrent.ListenableFuture

ListenableFuture는 java.util.concurrent.Future 클래스에서 파생되었다. ListenableFuture<T>는 AsyncRestTemplate 메서드의 결과를 제공한다. 결과를 기다린다. ListenableFuture.get()을 사용하여 출력을 가져온다.

4. AsyncRestTemplate.exchange() 예제

AsyncRestTemplate.exchange() 메서드의 예제이다. HTTP 메소드를 사용하여 주어진 URI를 실행하고 org.springframework.http.ResponseEntity의 ListenableFuture로 응답을 반환한다.

  • ExchangeMethodExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.web.client.AsyncRestTemplate;

import java.util.concurrent.ExecutionException;

public class ExchangeMethodExample {
    public static void main(String[] args) {
        AsyncRestTemplate asycTemp = new AsyncRestTemplate();
        String url = "http://google.com";
        HttpMethod method = HttpMethod.GET;
        Class<String> responseType = String.class;
        //create request entity using HttpHeaders
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_PLAIN);
        HttpEntity<String> requestEntity = new HttpEntity<String>("params", headers);
        ListenableFuture<ResponseEntity<String>> future = asycTemp.exchange(url, method, requestEntity, responseType);
        try {
            //waits for the result
            ResponseEntity<String> entity = future.get();
            //prints body source code for the given URL
            System.out.println(entity.getBody());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

5. org.springframework.web.client.AsyncRequestCallback

AsyncRequestCallback은 doWithRequest() 메서드가 있는 인터페이스이다. 이 메소드는 AsyncRequestCallback 클래스를 사용하면서 정의해야 한다. 아래 예제는 사용이다.

6. AsyncRestTemplate.execute() 예제

AsyncRestTemplate.execute()는 HTTP 메서드를 비동기적으로 실행한다. 그리고 요청은 AsyncRequestCallback에 의해 구동되고 응답은 org.springframework.web.client.ResponseExtractor에 의해 구동된다.

  • ExecuteMethodExample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.client.AsyncClientHttpRequest;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.web.client.AsyncRequestCallback;
import org.springframework.web.client.AsyncRestTemplate;
import org.springframework.web.client.ResponseExtractor;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class ExecuteMethodExample {
    public static void main(String[] args) {
        AsyncRestTemplate asycTemp = new AsyncRestTemplate();
        String url = "http://google.com";
        HttpMethod method = HttpMethod.GET;
        //create request entity using HttpHeaders
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_PLAIN);
        AsyncRequestCallback requestCallback = new AsyncRequestCallback() {
            @Override
            public void doWithRequest(AsyncClientHttpRequest arg0)
                    throws IOException {
                System.out.println(arg0.getURI());
            }
        };

        ResponseExtractor<String> responseExtractor = new ResponseExtractor<String>() {
            @Override
            public String extractData(ClientHttpResponse arg0)
                    throws IOException {
                return arg0.getStatusText();
            }
        };
        Map<String, String> urlVariable = new HashMap<>();
        urlVariable.put("q", "Concretepage");
        ListenableFuture<String> future = asycTemp.execute(url, method, requestCallback, responseExtractor, urlVariable);
        try {
            //waits for the result
            String result = future.get();
            System.out.println(result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.