- 场景
- 工具RestTemplate
- 代码实现
多多线程同时访问接口,测试接口稳定性
工具RestTemplate使用springboot自带http调用
线程类实现Callable
一下是通过@Autowired注入的方式
public static void main(String[] arge){
Future p = pool.submit(new RunnableUtil(url, urlSuffixInsertNews, body1, tokenDto.getToken()));
JSONObject resJson = JSONObject.parseObject(p.get().toString());
}
线程类
package com.yx.util.runnable;
import com.alibaba.fastjson.JSONObject;
import com.yx.util.httpClient.ClientUtil;
import lombok.Data;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Data
public class RunnableUtil implements Callable {
@Autowired
private ClientUtil clientUtil;
private String url;
private Map json;
private String urlSuffix;
private String token;
public RunnableUtil(String url, String urlSuffix, Map json, String token){
super();
this.url = url;
this.urlSuffix = urlSuffix;
this.json = json;
this.token = token;
}
@Override
public Object call() throws Exception {
String res = clientUtil.doPost(url, urlSuffix, json, token);
return res;
}
}
请求方法
package com.yx.util.httpClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.DefaultUriBuilderFactory;
import java.util.Map;
@Component
public class ClientUtil {
@Autowired
private RestTemplate restTemplate;
public static String doPost(String url, String urlSuffix, Map body, String token){
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(url);
factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.TEMPLATE_AND_VALUES);
restTemplate.setUriTemplateHandler(factory);
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
HttpEntity
也就是线程@通过Autowired注入的方式调用会一直出现空指针异常
解决方案就是在晚上找一个获取bean的方法
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
if (applicationContext == null){
throw new RuntimeException("applicationContext注入失败");
}
return getApplicationContext().getBean(name);
}
public static T getBean(Class clazz) {
if (applicationContext == null){
throw new RuntimeException("applicationContext注入失败");
}
return getApplicationContext().getBean(clazz);
}
public static T getBean(String name, Class clazz) {
if (applicationContext == null){
throw new RuntimeException("applicationContext注入失败");
}
return getApplicationContext().getBean(name, clazz);
}
}
使用
RestTemplate restTemplate = SpringContextUtil.getBean(ClientUtil.class)



