使用AsyncRestTemplate进行异步调用

背景:

    最近项目中需要并发调用c++服务的http接口,问题是同时调用两个接口时,会发生严重阻塞,导致页面响应慢,还经常遇到接收数据超时,导致RestTemplate报出ReadTimeout错误,一味地增加ReadTimeout时间解决不了根本问题。

原使用的方案:

    前一个版本中使用的是Feign,虽然响应速度方面还可以,但是唯一不足是,返回的数据只能以String接收,在每一个方法中进行String转换成java对象的方法。

    我是一个比较懒的程序员,不想写很多无用的重复代码。所以在这次版本中决定使用RestTemplate,封装一个RestClient工具类,所有调用第三方接口都通过该工具类提供的方法调用,返回的ResponseEntity通过指定的Class类型进行转换并返回。

解决方案:

    使用AsyncRestTemplate异步调用接口,无阻塞进行请求。下面直接贴代码。

一、AsyncRestTemplate注册为Bean,使Spring容器对其进行管理。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.AsyncRestTemplate;

@Configuration
public class RestTemplateConfiguration {
	@Bean
	public AsyncRestTemplate asyncRestTemplate() {
		return new AsyncRestTemplate();
	}
}

此次采用的是AsyncRestTemplate默认的构造方法。会默认使用SimpleAsyncTaskExecutor。

二、编写测试Controller类

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.util.concurrent.ListenableFutureCallback;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.AsyncRestTemplate;

@RestController
public class WebController {
	@Autowired
	private AsyncRestTemplate asyncRestTemplate;

	@RequestMapping("/demo")
	public String demo() {
		try {
			Thread.sleep(30000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return new Date()+"--->>>30秒。。。。";
	}
	
	@RequestMapping("/async")
	public String async() {
		String url = "http://127.0.0.1:8080/demo";
        ListenableFuture> forEntity = asyncRestTemplate.getForEntity(url, String.class);
        //异步调用后的回调函数
        forEntity.addCallback(new ListenableFutureCallback>() {
            //调用失败
            @Override
            public void onFailure(Throwable ex) {
            	System.err.println("-----调用接口失败-------");
            }
            //调用成功
            @Override
            public void onSuccess(ResponseEntity result) {
            	System.out.println("--->异步调用成功, result = "+result.getBody());
            }
        });
        return new Date()+"--->>>异步调用结束";
	}
}

三、调用async接口

使用AsyncRestTemplate进行异步调用_第1张图片

16:15:20先返回异步调用结束

而调用的方法时16:15:50,即休眠30秒后返回的。

 

仅供参考,后期对AsyncRestTemplate有更深入的了解继续更新。。。

 

 

 

你可能感兴趣的:(RestTemplate)