@Override
    public CompletableFuture<List<QueueTimeSpan>> queryConsumeTimeSpan(String address,
        QueryConsumeTimeSpanRequestHeader requestHeader, long timeoutMillis) {
        CompletableFuture<List<QueueTimeSpan>> future = new CompletableFuture<>();
        RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.QUERY_CONSUME_TIME_SPAN, requestHeader);
        remotingClient.invoke(address, request, timeoutMillis).thenAccept(response -> {
            if (response.getCode() == ResponseCode.SUCCESS) {
                QueryConsumeTimeSpanBody consumeTimeSpanBody = GroupList.decode(response.getBody(), QueryConsumeTimeSpanBody.class);
                future.complete(consumeTimeSpanBody.getConsumeTimeSpanSet());
            } else {
                log.warn("queryConsumerTimeSpan getResponseCommand failed, {} {}, header={}", response.getCode(), response.getRemark(), requestHeader);
                future.completeExceptionally(new MQClientException(response.getCode(), response.getRemark()));
            }
        });
        return future;
    }
@Test
    public void assertQueryConsumeTimeSpanWithSuccess() throws Exception {
        QueryConsumeTimeSpanBody responseBody = new QueryConsumeTimeSpanBody();
        setResponseSuccess(RemotingSerializable.encode(responseBody));
        QueryConsumeTimeSpanRequestHeader requestHeader = mock(QueryConsumeTimeSpanRequestHeader.class);
        CompletableFuture<List<QueueTimeSpan>> actual = mqClientAdminImpl.queryConsumeTimeSpan(defaultBrokerAddr, requestHeader, defaultTimeout);
        List<QueueTimeSpan> queueTimeSpans = actual.get();
        assertNotNull(queueTimeSpans);
        assertEquals(0, queueTimeSpans.size());
    }