我有一堂课,计算每小时的货币兑换。
public class CurrencyUtilities {
public static String getCurrencyExchangeJsonData(String urlToRead) throws Exception {
StringBuilder result = new StringBuilder();
URL url = new URL(urlToRead);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
result.append(line);
}
rd.close();
return result.toString();
}
public static Map<String, Double> getConvertionRates() {
/*
* https://openexchangerates.org/api/latest.json?app_id=50ef786fa73e4f0fb83e451a8e5b860a
* */
String s = "https://openexchangerates.org/api/latest.json?app_id=" + "50ef786fa73e4f0fb83e451a8e5b860a";
String response = null;
try {
response = getCurrencyExchangeJsonData(s);
} catch (Exception e) {
}
final JSONObject obj = new JSONObject(response.trim());
String rates = obj.get("rates").toString();
JSONObject jsonObj = new JSONObject(rates);
Iterator<String> keys = jsonObj.keys();
Map<String, Double> map = new HashMap<>();
double USD_TO_EUR = Double.parseDouble(jsonObj.get("EUR").toString());
map.put("USD", (1.0 / USD_TO_EUR));
while (keys.hasNext()) {
String key = keys.next();
double v = Double.parseDouble(jsonObj.get(key).toString());
map.put(key, (double) (v / USD_TO_EUR));
}
// for (Map.Entry<String, Double> entry : map.entrySet()) {
// System.out.println(entry.getKey() + " " + entry.getValue());
// }
return map;
}
}
在API内,我调用提供的值
@RestController
@RequestMapping("/api/v1/users")
public class UserAPI {
static Map<String, Double> currencyMap = CurrencyUtilities.getConvertionRates();
// .....................................
// .....................................
}
我需要将每小时currencyMap
的值与openexchangerates.org
进行同步。最好的方法是什么?
谢谢。
PS
我的意思是每小时调用此方法CurrencyUtilities.getConvertionRates()
的最佳方法是什么?
答案 0 :(得分:1)
您可以使用Class User
{
@Autowired
private MyOtherBean;
@PostConstruct
public void init(){
for(MyObject value : myOtherBean.getValues()){
}
}
}
Class MyOtherBean
{
@Autowired
private MyOtherBean1;
@PostConstruct
public void init(){
MyOtherBean1.populateValues();
}
public Collection<MyObject> getValues(){
}
}
注释该方法,并在两次调用之间提供一定的固定时间。 Here您可以找到用法示例。还记得用@Scheduled
注释一些配置类。您可以使用cron:
@EnableScheduling
答案 1 :(得分:1)
执行所需操作的最佳方法是使用@Scheduled
。例如,请参见THIS链接(在Spring中)。
长话短说-您可以使用@Scheduled注释方法,它将根据提供的规则执行。您应该将结果放入数据库中,而在REST服务中仅获得最后结果,或者如果需要历史数据则更多。