我正在尝试在特定时间调用API。但有时api调用可能会失败,所以我制定了一个逻辑来检查api调用何时失败。
确认api调用失败后,我想将@Schedulercron表达式从当前cron表达式更改为15分钟后。
如何动态更改cron表达式??
下面是我的API调用代码。
@Scheduled(cron="0 9 19 * * *", zone = "Asia/Seoul")
public void callAPi() throws InterruptedException {
swrList = new ArrayList<>();
List<GeoInfo> giList = gs.getGeoXY();
for(GeoInfo gi : giList) {
ShortWeatherReq swr = new ShortWeatherReq(APK.getApiKey(),"1",gi.getX(),gi.getY());
swr.setBaseDate(); //현재 날짜로 baseDate를 설정하는 메소드를 호출
swr.setNx(gi.getX()); //x좌표값 저장
swr.setNy(gi.getY()); //y좌표값 저장
swrList.add(swr); //list에 swr 추가
}
for(GeoInfo gi : giList) {
ShortWeatherReq swr = new ShortWeatherReq(APK.getApiKey(),"2",gi.getX(),gi.getY());
swr.setBaseDate(); //현재 날짜로 baseDate를 설정하는 메소드를 호출
swr.setNx(gi.getX()); //x좌표값 저장
swr.setNy(gi.getY()); //y좌표값 저장
swrList.add(swr); //list에 swr 추가
}
//위 객체를 가지고 이제 API를 호출할수 있게 Service에게 전해줘야 함
sws.setSwrList(swrList);
temperList = sws.callSW(); // API 통신 Service 호출
//Confirming API call failure
if(temperList.isEmpty()) { //온도 리스트가 비어있다면 진입
logger.warn("TemperList is empty");
//이제 여기서 메일을 보내주는 서비스를 만들어서 메일 전송을 해줘야 함
ms.sendErrorMail();
logger.info("-------------------");
logger.info("API Connection Fail");
}else {
logger.info("-------------------");
logger.info("API ConnectionSuccess");
logger.info("-------------------");
//List에 담긴 온도 DB에 저장
for(int i = 0;i<temperList.size();i++) {
Temperature temp = temperList.get(i);
ts.saveTemp(temp);
}
logger.info("DB Store Success");
}
}
首先,您应该在应用程序
类中激活Spring Retry
。
@SpringBootApplication
@EnableScheduling
@EnableRetry
public class App {
// something
}
然后,您需要将@Retryable
添加到您作为@计划的
使用的方法中。
@Scheduled(cron="0 9 19 * * *", zone = "Asia/Seoul")
// Add this line
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000), value={ApiCallException.class})
public void callAPi() throws InterruptedException {
swrList = new ArrayList<>();
List<GeoInfo> giList = gs.getGeoXY();
for(GeoInfo gi : giList) {
ShortWeatherReq swr = new ShortWeatherReq(APK.getApiKey(),"1",gi.getX(),gi.getY());
swr.setBaseDate(); //현재 날짜로 baseDate를 설정하는 메소드를 호출
swr.setNx(gi.getX()); //x좌표값 저장
swr.setNy(gi.getY()); //y좌표값 저장
swrList.add(swr); //list에 swr 추가
}
for(GeoInfo gi : giList) {
ShortWeatherReq swr = new ShortWeatherReq(APK.getApiKey(),"2",gi.getX(),gi.getY());
swr.setBaseDate(); //현재 날짜로 baseDate를 설정하는 메소드를 호출
swr.setNx(gi.getX()); //x좌표값 저장
swr.setNy(gi.getY()); //y좌표값 저장
swrList.add(swr); //list에 swr 추가
}
//위 객체를 가지고 이제 API를 호출할수 있게 Service에게 전해줘야 함
sws.setSwrList(swrList);
temperList = sws.callSW(); // API 통신 Service 호출
//Confirming API call failure
if(temperList.isEmpty()) { //온도 리스트가 비어있다면 진입
// Add this line
throw new ApiCallException("API Connection Fail")
}else {
logger.info("-------------------");
logger.info("API ConnectionSuccess");
logger.info("-------------------");
//List에 담긴 온도 DB에 저장
for(int i = 0;i<temperList.size();i++) {
Temperature temp = temperList.get(i);
ts.saveTemp(temp);
}
logger.info("DB Store Success");
}
}
这里是使用@Retryable
注释设置backoff
参数,以设置您想要的下一个运行时。在与BackOffPolicies相关的Spring Retry留档中,定义如下。
在短暂失败后重试时,在重试之前等待一段时间通常会有所帮助,因为通常失败是由某些问题引起的,而这些问题只能通过等待来解决。如果RetryCallback失败,RetryTemplate可以根据BackoffPolicy暂停执行。
您可以在此处找到有关Spring重试的详细信息。
虽然我的答案没有提供动态更改cron语句,但我希望它能解决你的问题。
问题内容: 我能够在applicationContext.xml中创建taskScheduler,并且根据该属性定期触发我的工作。 我想在调度程序启动后更改此表达式(触发时间),这意味着JavaEE应用程序正在运行。 使用Spring 3.XX 问题答案: 其实我也遇到过同样的问题 我假设您需要从用户那里获取date(1-31),时间,星期几,调度程序的类型(每日,每月,每周)。 首先,您需要根据
我有一些时间 现在的条件是,当JVM启动时,它将首先检查当前时间和给定时隙的持续时间。下面是检查时长的方法:- 例如,如果JVM在今天17PM开始,那么它将首先检查时隙,它将得到13PM到19PM之间的时隙,并且根据方法findNextSlotDuration将是2小时,因此调度器将在2小时后开始,即在19PM。另一种情况是,如果JVM今天在19小时00分29秒启动,那么它将得不到插槽,那么持续时
注意:用户界面已经在 Dreamweaver CC 和更高版本中做了简化。因此,您可能在 Dreamweaver CC 和更高版本中找不到本文中描述的一些选项。有关详细信息,请参阅此文章。 关于动态内容 通过对提供内容的服务器行为进行编辑,可以更改页面上的动态内容。例如,您可以编辑记录集服务器行为,以便向页面提供更多的记录。 在“服务器行为”面板中列出了页面上的动态内容。例如,如果向页面中添加了某
问题内容: 现在,我有一个背景图像URL硬编码到CSS中。我想使用AngularJS中的逻辑动态选择背景图片。这是我目前拥有的: HTML CSS 如您所见,CSS中的背景图像引用了特定的文件位置。我希望能够以编程方式确定图像URL的位置。我真的不知道从哪里开始。我不知道JQuery。谢谢。 问题答案: 您可以使用ng-style使用AngularJS动态更改CSS类属性。 希望这个ng样式的示例
问题内容: 我想构建一个表格,该表格可以根据其他组件的状态动态更改可见的组件。 例如,…有一些文本框和一些复选框,并且如果用户激活了某个复选框,则应该出现一堆其他输入元素。 我可以使用JSF 2.0 + Tomahawk来做到这一点吗,还是必须让另一个库来做到这一点?我该怎么办呢?没有AJAX,这将无法工作,对吗? 提前致谢! 问题答案: Ajax是实现此目的的便捷方法,而JSF 2.0捆绑了aj
我如何在android studio中动态设置src属性(第7行),我尝试更改backgroundResource,但结果不一样 XML文件 Java代码