Rxjava,发生错误时重复现有项
这是我的手术, 当出现错误时,我希望Rxjava,发生错误时重复现有项,java,spring-boot,rx-java,reactive-programming,Java,Spring Boot,Rx Java,Reactive Programming,这是我的手术, 当出现错误时,我希望retryWhen会重复当前项,但它会从一开始就重复整个过程,我尝试修改此项,但它不会重复并引发异常 return Observable.fromArray(getTodayShareHolding(dd,MM,yyyy,tmpTicker, item.getId())).retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS) ) ); 然
retryWhen
会重复当前项,但它会从一开始就重复整个过程,我尝试修改此项,但它不会重复并引发异常
return Observable.fromArray(getTodayShareHolding(dd,MM,yyyy,tmpTicker, item.getId())).retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS) ) );
然后我试着像这样修改代码
@GetMapping(path = "operaion")
public @ResponseBody void operation(@RequestParam(value = "startDate", required = true) String startDate, @RequestParam(value = "endDate", required = true) String endDate ) throws IOException, ParseException {
List <EntityList> plist = EntityListListRepository.findByPendingDayBetweenAndIsProcessedFalseAndIsUpdatedFalse(formatDate(startDate), formatDate(endDate) );
long startTime = System.currentTimeMillis();
Observable.fromIterable(plist).concatMap( item -> {
Calendar cal = Calendar.getInstance();
cal.setTime(item.getPendingDay());
Integer yyyy = cal.get(Calendar.YEAR);
Integer MM = cal.get(Calendar.MONTH)+1;
Integer dd = cal.get(Calendar.DAY_OF_MONTH);
String tmpId = item.getTmpId().toString();
Integer delayCheck = item.getTmpId();
Integer delayMiniSec = 0;
if(delayCheck >= 70000) {
delayMiniSec = 0;
}
Date currentTime = new Date();
System.out.println("Step1 ::{ : "+dd+"/"+MM+"/"+yyyy+"@"+tmpId+" id = ["+item.getId()+"] } startInsert time = "+currentTime);
return Observable.fromArray(fetchList(dd,MM,yyyy,tmpId, item.getId()))
}).retryWhen(errors -> errors.flatMap(error -> Observable.timer(5, TimeUnit.SECONDS) ) );
.subscribe(System.out::println);
@GetMapping(path=“operaion”)
public@ResponseBody void操作(@RequestParam(value=“startDate”,required=true)字符串startDate,@RequestParam(value=“endDate”,required=true)字符串endDate)引发IOException,ParseException{
List plist=EntityListListRepository.FindBypendingDayBeween和DisprocessedFalse和SupdatedFalse(formatDate(startDate),formatDate(endDate));
long startTime=System.currentTimeMillis();
可观测的.可观测的(plist).concatMap(项->{
Calendar cal=Calendar.getInstance();
cal.setTime(item.getPendingDay());
整数yyy=cal.get(日历年);
整数MM=cal.get(日历月)+1;
整数dd=cal.get(日历日,月日);
字符串tmpId=item.getTmpId().toString();
整数delayCheck=item.getTempId();
整数delayMiniSec=0;
如果(延迟检查>=70000){
delayminiec=0;
}
日期当前时间=新日期();
System.out.println(“步骤1::{:“+dd+”/“+MM+”/“+yyyy+”@“+tmpId+”id=[“+item.getId()+”]}开始插入时间=“+currentTime”);
返回Observable.fromArray(fetchList(dd、MM、yyyy、tmpId、item.getId())
}).retryWhen(errors->errors.flatMap(error->Observable.timer(5,TimeUnit.SECONDS));
.subscribe(System.out::println);
它会重复整个过程,当喷射发生时,
有什么建议吗
更新:
或者我试试下面这样的?
所以你想要的是
1->2->3->error->3->4->…
而不是1->2->3->error->1->2->3->…
,是吗?是的,当出现错误时,请指导我上游被破坏。重试重新订阅上游以恢复流。所以困难在于如何将上游恢复到指定的状态。我认为没有通用的方法。在您的情况下,它不需要rxjava。因此,您需要的是1->2->3->error->3->4->…
,而不是1->2->3->error->1->2->3->…
,是吗?是的,当出现错误时,请指导我上游断开。重试
重新订阅上游以恢复流。所以困难在于如何将上游恢复到指定的位置我认为没有通用的方法。在你的情况下,它不需要rxjava。