package com.weather.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.weather.service.WeatherDataService;
import com.weather.vo.WeatherResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class WeatherDataServiceImpl implements WeatherDataService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
private static final long TIME_OUT = 1800L; //redis超时时间为30分钟
private static final String WEATHER_URI = "http://wthrcdn.etouch.cn/weather_mini?";
@Override
public WeatherResponse getDataByCityId(final String cityId) {
String uri = WEATHER_URI + "citykey=" + cityId;
return this.doGetWeather(uri);
}
@Override
public WeatherResponse getDataByCityName(final String cityName) {
String uri = WEATHER_URI + "city=" + cityName;
return this.doGetWeather(uri);
}
private WeatherResponse doGetWeather(String uri) {
ObjectMapper mapper = new ObjectMapper();
WeatherResponse resp = null;
String strBody = null;
// 先从缓存中查询数据
if (redisTemplate.hasKey(uri)) {
strBody = redisTemplate.opsForValue().get(uri);
} else {
// 缓存中没有就调用接口查询天气数据
ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);
if (respString.getStatusCodeValue() == 200) {
strBody = respString.getBody();
}
// 把查询出来的数据写入缓存中
redisTemplate.opsForValue().set(uri,strBody,TIME_OUT,TimeUnit.SECONDS);
}
try {
resp = mapper.readValue(strBody, WeatherResponse.class);
} catch (IOException e) {
//e.printStackTrace();
log.error("Error!",e);
}
return resp;
}
/**
* 根据城市id来同步天气数据
*/
@Override
public void syncDataByCityId(String cityId) {
String uri = WEATHER_URI + "citykey=" + cityId;
this.saveWeatherDate(uri);
}
/**
* 把天气数据放入缓存中
*/
private void saveWeatherDate(String uri) {
String strBody = null;
ResponseEntity<String> respString = restTemplate.getForEntity(uri, String.class);
if (respString.getStatusCodeValue() == 200) {
strBody = respString.getBody();
}
// 把查询出来的数据写入缓存中
redisTemplate.opsForValue().set(uri,strBody,TIME_OUT,TimeUnit.SECONDS);
}
}
c++服务器开发
- 粉丝: 3181
- 资源: 4461
最新资源
- nuScenes-map-expansion-v1.3.zip
- 基于web的二手闲置交易系统源码(java毕业设计完整源码).zip
- 计算机专业学习-教程和学习方法
- 基于javaweb的淘狗管理系统.doc
- Sgmediation命令安装Stata命令中介效应Sobel检验附图文安装教程
- 基于web的助农商超网站的设计与实现源码(java毕业设计完整源码).zip
- 基于web的图书馆联盟信息采集系统.doc
- stm32数控buck同步整流电路 效率可达95%以上 电压电流采样 反馈电路采用软件增量式pi闭环控制,可以实现恒压闭环 驱动电路采用ir2104芯片驱动半桥 输出采样电路通过lm385进行放大反馈
- 基于web的医疗设备管理系统源码(java毕业设计完整源码).zip
- 基于web的图书馆预约管理系统.doc
- sqlyog 13.1.9 Trail (ultimate) pj版本
- python exe pyinstaller 适配 win7 onnx
- 打架图像分类数据集4类别:打、踢、推、拳击(28000张图片).rar
- 物流规划自动化立体仓库的规划与评估
- 基于Java技术的图书馆占座系统的设计与实现
- 基于Web的医院挂号预约管理系统的设计与实现源码(java毕业设计完整源码).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈