加入pom依赖
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.0.RELEASE</version> </dependency>
配置bean 用spring 进行管理
@EnableAsync
@Configuration
@EnableScheduling
@SpringBootApplication
@MapperScan("cn.witsky.resweather.dao")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(20000);
factory.setConnectTimeout(3000);
RestTemplate restTemplate = new RestTemplate(factory);
// 找出并修改默认的StringHttpMessageConverter
// 关闭Accept-Charset的输出(防止输出超长的编码列表)
// 设置默认编码为UTF-8
boolean stringConverterFound = false;
for (HttpMessageConverter httpMessageConverter : restTemplate.getMessageConverters()) {
if (httpMessageConverter instanceof StringHttpMessageConverter) {
StringHttpMessageConverter stringHttpMessageConverter = (StringHttpMessageConverter)httpMessageConverter;
stringHttpMessageConverter.setWriteAcceptCharset(false);
stringHttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8"));
stringConverterFound = true;
break;
}
}
if (!stringConverterFound) {
// 如果不存在StringHttpMessageC onverter,则创建一个
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
stringHttpMessageConverter.setWriteAcceptCharset(false);
restTemplate.getMessageConverters().add(stringHttpMessageConverter);
}
return restTemplate;
}
// 创建用于重试的retryTemplate
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.setBackOffPolicy(new ExponentialBackOffPolicy());
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3);//配置的重试次数
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
}
使用方法:
public void doWeather(final String areaName,final String areaCode){
try {
ResponseEntity<String> responseEntity = retryTemplate.execute(new RetryCallback<ResponseEntity<String>, RuntimeException>() {
@Override
public ResponseEntity<String> doWithRetry(RetryContext retryContext) throws RuntimeException {
String url=config.getWeatherurl();
String appCode=config.getAppCode();
return restTemplate.exchange(url, HttpMethod.GET, null, String.class,areaName,appCode);
}
}, new RecoveryCallback<ResponseEntity<String>>() {
@Override
public ResponseEntity<String> recover(RetryContext retryContext) throws Exception {
logger.error("retry.failed,retryContext={}", retryContext);
return null;
}
});
logger.info("doWeather.areaName={},responseEntity={}",areaName, responseEntity);
if (responseEntity != null) {
HttpStatus httpStatus = responseEntity.getStatusCode();
if (httpStatus != null && httpStatus == HttpStatus.OK) {
WeatherResponse weatherResponse = JSON.parseObject(responseEntity.getBody(), WeatherResponse.class);
if(null!=weatherResponse&&weatherResponse.getCode()==0){
WeatherData weatherData=weatherResponse.getData();
String dateTime=weatherData.getDateTime();
Date time=DateTimeUtil.strToDate(dateTime,"yyyy-MM-dd HH:mm:ss");
Weather w=new Weather();
w.setDateTime(time);
w.setAreaName(areaName);
w.setAreaCode(areaCode);
List<Weather> weatherList=weatherData.getList();
if(null!=weatherList&&weatherList.size()>0){
for (Weather weather:weatherList){
weather.setAreaName(areaName);
weather.setAreaCode(areaCode);
}
//操作数据库
weatherMapper.deleteWeatherByDateTime(w);
weatherMapper.insertBatch(weatherList);
}
}
}
}
}catch (Exception e){
logger.error(e.getMessage(),e);
}
}