feat: ask with timeout

This commit is contained in:
godotg
2024-10-13 11:41:44 +08:00
parent a26547586f
commit 37a30d9fda
2 changed files with 8 additions and 1 deletions
@@ -58,4 +58,6 @@ public interface IRouter {
<T> AsyncAnswer<T> asyncAsk(Session session, Object packet, @Nullable Class<T> answerClass, @Nullable Object argument);
<T> AsyncAnswer<T> asyncAsk(Session session, Object packet, @Nullable Class<T> answerClass, @Nullable Object argument, long timeoutMillis);
}
@@ -264,6 +264,11 @@ public class Router implements IRouter {
*/
@Override
public <T> AsyncAnswer<T> asyncAsk(Session session, Object packet, @Nullable Class<T> answerClass, @Nullable Object argument) {
return asyncAsk(session, packet, answerClass, argument, DEFAULT_TIMEOUT);
}
@Override
public <T> AsyncAnswer<T> asyncAsk(Session session, Object packet, Class<T> answerClass, Object argument, long timeoutMillis) {
var clientSignalAttachment = new SignalAttachment();
if (argument == null) {
@@ -281,7 +286,7 @@ public class Router implements IRouter {
asyncAnswer.setSignalAttachment(clientSignalAttachment);
clientSignalAttachment.getResponseFuture()
.completeOnTimeout(null, DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS) // 因此超时的情况,返回的是null
.completeOnTimeout(null, timeoutMillis, TimeUnit.MILLISECONDS) // 因此超时的情况,返回的是null
.thenApply(answer -> {
if (answer == null) {
throw new NetTimeOutException("async ask [{}] timeout exception", packet.getClass().getSimpleName());