【发布时间】:2016-10-30 02:20:56
【问题描述】:
我正在使用 Play! 2.5 (Java) 和 Akka。这是我的问题:我正在尝试使用 WSClient 调用外部服务,并希望它位于 Akka 断路器后面。我在下面显示的代码似乎没有按预期工作。
我希望当外部服务无法访问时断路器会打开,但事实并非如此。我猜问题在于将返回 completableFuture 的 java 8 lambda 表达式包装在 akaa.dispatch.Future.future 中。
我的代码看起来正确吗?如果有问题怎么解决?
@Inject
public ServiceActor(WSClient ws) {
this.ws = ws;
circuitBreaker = new CircuitBreaker(getContext().dispatcher(),
getContext().system().scheduler(),
MAX_FAILURES,
CALL_TIMEOUT,
RESET_TIMEOUT
)
.onOpen(this::onOpen)
.onClose(this::onClose)
.onHalfOpen(this::onHalfOpen);
receive(ReceiveBuilder
.match(String.class, x -> {
circuitBreaker.callWithCircuitBreaker(() -> future(() -> callService(),getContext().dispatcher()));
})
.matchAny(o -> log.info("Unknown message"))
.build()
);
}
private CompletableFuture<JsonNode> callService() {
return ws.url(SOME_URL).get()
.thenApply(WSResponse::asJson)
.toCompletableFuture();
}
如果我只是在 callService 中抛出一个运行时表达式而不做任何类似的事情:
private CompletableFuture<JsonNode> callService() {
throw new RuntimeException()
}
现在,断路器打开。
【问题讨论】:
标签: java playframework akka akka-http playframework-2.5