我正在尝试用Java上的WebSockets实现一个简单的类RPC(或请求 - 响应)系统(前端会有JS,但我现在正在后端工作)。
我正在尝试应用Java CompletableFuture
模式来异步处理发送消息。但我一直坚持错误处理。
我有一个类(让我们称之为rpc类)负责通过WebSocket会话发送消息(在这里使用Spring WebSocket支持类),然后等待“回复”类型消息,并将它们与待处理请求并将内容返回给调用者。
流程是:
Executor
(线程池)异步发送消息,并为“发送消息”操作接收CompletableFuture<Void>
CompletableFuture<Map<String, Object>>
并将其与待处理的请求相关联,并将它们存储在地图中。它返回了可以完善的未来。所以涉及3个线程:调用者线程,发送消息的线程,以及接收消息并完成未来的线程。
现在,我应该如何处理发送消息时的错误(例如IO错误),以使返回的CompletableFuture
也失败(或者实现重试策略,以及超时... )?
以下是发送消息的rpc类方法的代码:
completableFuture
答案 0 :(得分:0)
最简单的方法是使用thencompose()
简单地链接期货:
// completeable future for the result. It does nothing, will be completed when reply is received which happen in a different thread, see completeInvocation
CompletableFuture<Map<String, Object>> invocationFuture = new CompletableFuture<>();
CompletableFuture<Void> senderFuture = sender.sendMessage(session, invocationMessage);
// store the pending invocation in the registry
registry.addPendingInvocation(new PendingInvocation(invocationMessage, session, invocationFuture));
// return the future so the caller can have access to the result once it is ready
return senderFuture.thenCompose(__ -> invocationFuture);
如果senderFuture
特殊完成,返回的未来也会异常完成,CompletionException
将异常作为原因(参见CompletionStage
api)。
请注意,您可能还需要解决其他问题:
addPendingInvocation
之前到达,会发生什么?在致电sendMessage
以避免问题之前,您是否应该打电话给它?invocationFuture
做任何事情,在addPenidngInvocation
内创建它不是更好吗?