- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Observable,其中每个项目都以可能导致异常的方式进行转换,但可以重试。我不希望失败破坏流,因为每个项目都代表一个独立的事务。我能想到的最佳解决方案是:
final AtomicLong errCount = new AtomicLong();
Observable.from(ImmutableList.of(1L, 2L, 3L)).flatMap(new Func1<Long, Observable<Long>>() {
@Override
public Observable<Long> call(Long aLong) {
return Observable.from(ImmutableList.of(aLong)).map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
if (aLong == 2 && errCount.getAndIncrement() < 1) {
throw new RuntimeException("retryable error");
}
return aLong * 100;
}
}).retry(2);
}
}).forEach(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println(aLong);
}
});
// Desired output: 100, 200, 300 (not 100, 100, 200, 300)
问题:
最佳答案
The retry logic is really verbose.
您可以避免使用ImmutableList
完全通过切换到 Observable.just(t1, t2, t3)
构造函数。这本质上是做同样的事情,但更简洁。
我看到你正在使用 flatMapping 来将每个值转换为 Observable。这将防止在映射单个值时遇到 onError 取消订阅整个链。因此,当运算符抛出异常时,它将仅取消订阅该值的内部可观察链。否则,错误将导致从主要外部可观察对象取消订阅并重新订阅。
如果您想保持这种行为但减少样板(除了明显切换到 Java8 lambda 之外),我可以想到两种选择。
首先,在重试后重新订阅并删除重复数据您的数据。如果你有一个很好的值hashcode
和equals
实现中,您可以使用过滤器附加到有状态集,并且仅当该集尚未包含该值时才使用 onNext。
Observable.<Long> just(1L, 2L, 3L)
.map(new Func1<Long, Long>() {
@Override
public Long call(Long aLong) {
if (aLong == 2 && errCount.getAndIncrement() < 1) {
throw new RuntimeException("retryable error");
}
return aLong * 100;
}})
.retry(2)
.filter(new Func1<Long, Boolean>() {
Set<Long> state = null;
@Override
public Boolean call(Long a) {
if (state == null)
state = new HashSet<Long>();
if (!state.contains(a)) {
state.add(a);
return true;
}
return false;
}})
.forEach(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println(aLong);
}});
其次,您可以将您的可观察对象重新订阅时从上次停止的位置恢复。请注意,当使用缓冲运算符(observeOn、merge、flatMap)时,可能会出现数据丢失的问题。这是因为他们将继续以与下游消费者脱钩的方式从生产者那里消费。因此,您需要确保在重试之前不进行缓冲。如果您正在实现支持背压的可观察源,还需要考虑其他因素。
// Should resume right where it left off
resumableObservable.map(...).retry(2).observeOn()
// Don't do this. ObserveOn will buffer values and resume will lose data.
resumableObservable.map(...).observeOn().retry(2)
// Also bad if running async observables. Merging buffers so this could have data loss.
Observable.merge(resumableObservable.map(...)).retry(2)
If any item fails after 2 retries, the stream is broken (no more items are processed). I'd like a clean way to return both exceptions and results like Finagle's Try, so I can process all the exceptions.
您可以从 Long -> Long
更改不可靠的 map 到 Long -> Tuple<Long, List<Exception>>
。由于这是一大堆泛型并且很快就会变得很麻烦,我建议使用重试运算符的不同变体,即 retryWhen(Func1<Observable<Throwable>, Observable<?>>)
。以下是如何在代码中使用它的示例。
}).retryWhen(new Func1<Observable<? extends Throwable>, Observable<?>>(){
@Override
public Observable<?> call(Observable<? extends Throwable> o) {
final AtomicInteger count = new AtomicInteger();
return o.filter(new Func1<Throwable, Boolean>() {
@Override
public Boolean call(Throwable t) {
return t instanceof RuntimeException || count.getAndIncrement() < 5;
}}).delay(1, TimeUnit.SECONDS, Schedulers.immediate());
}})
使用 retryWhen 的好处是,您可以轻松地以非阻塞方式在一段时间后实现延迟重试。
关于java - RxJava : retrying map actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30533082/
我使用此代码调用azure api: http://pythonfiddle.com/sjj/ 但是错误消息是: Client-Request-ID=b68d2b74-5e54-11e8-9b
我是 Angular 4.3 的新手。我有一个 map 应用程序,它通过下载一系列小图像(“图 block ”)来呈现“ map 层”。在启动时, map 层可能需要 0.1 - 5.0 秒的时间来下
我正在尝试测试使用自定义重试策略的重试模板。为此,我使用以下示例: https://github.com/spring-projects/spring-retry/blob/master/src/te
我正在尝试做 pip install --upgrade pip并保持 收到此错误: WARNING: Retrying (Retry(total=4, connect=None, read=None
我正在使用微软的标准示例将新实体插入到表中。有没有办法跟踪是否执行了重试? 代码: CloudTableClient tableClient = storageAccount.CreateCloudT
我正在使用 Spring-retry-1.2.0 ,重试工作正常,但在我的方法中,我想知道重试是否是最后一次重试,是否有任何方法可以在 spring-retry 中获取 retrialCount 或最
我正在尝试全新安装 virtualbox、vagrant、homestead 和最终的 laravel。刚开始使用新笔记本电脑。我之前已经用 homestead 设置了 vagrant 并且没有问题。
目录 循环加判断 retrying 总结 我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请
我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来说一下Python中的重试方法。
spring-retry 的@CircuitBreaker 和spring-cloud-starter-netflix-hystrix 的@HystrixCommand 有什么区别? 它们似乎都实现了
我在 Spring Boot 项目中使用 Resilience4J 来调用 REST 客户端,如下所示: @Retry(name = "customerService") public Custome
我有一个有两台服务器的网站——一台专门用于面向客户端的 Web 服务,另一台是更强大的数据处理服务器。 我目前有一个过程,其中 Web 服务器与数据服务器联系以获取通常如下所示的多个请求: paylo
我遇到了@CircuitBreaker 没有重试的问题。 我有一个服务类(例如 UserService 类和方法名称 getUser),此方法调用另一个 Spring bean(例如 AppClien
请问是否可以使用弹性 4j 在客户端记录重试尝试? 也许通过某种配置或设置。 目前,我正在使用带有 Spring boot Webflux 基于注释的resilience4j。 效果很好,这个项目很棒
我在使用 python3 中 tenacity 库中的“重试”工具时遇到问题。当我使用生成器时,“重试”装饰器似乎不起作用。 我有一个代码示例来说明我的情况: from tenacity import
所以我这里有一个 Azure 机器学习管道,它由许多 PythonScriptStep 任务组成 - 确实非常基本。 由于网络问题或其他问题,其中一些脚本步骤会间歇性失败 - 确实没有什么意外。这里的
如果我为多个上游反向代理设置了 nginx 负载平衡,其中一个出现故障,我的用户会收到 502 错误消息,还是 nginx 会负责重新路由到已启动的上游? 最佳答案 来自 documentation
我正在创建一个应用程序,它可以恢复并显示在线存储在 mysql 主机上的 html 文本。如果快照没有任何数据,它应该重试查询并重建 View ,直到它获得数据。 这就是我使用数据库中的数据创建小部件
我想在 Spring Boot 2.2.1.RELEASE 项目中使用 resilience4j-spring-boot2 来重试针对第三方服务的失败请求。但是,由于某种原因,我无法注册fallbac
我正在使用resilience4j.retry与 resilience4j.circuitbreaker 。 Service1 正在调用另一个服务 Service2,该服务可能会引发异常。即使出现异常
我是一名优秀的程序员,十分优秀!