in protonj2-client/src/main/java/org/apache/qpid/protonj2/client/impl/ClientNextReceiverSelector.java [55:99]
public void nextReceiver(ClientFuture<Receiver> request, NextReceiverPolicy policy, long timeout) {
Objects.requireNonNull(policy, "The next receiver selection policy cannot be null");
ClientReceiver result = null;
switch (policy) {
case ROUND_ROBIN:
result = selectNextAvailable();
break;
case FIRST_AVAILABLE:
result = selectFirstAvailable();
break;
case LARGEST_BACKLOG:
result = selectLargestBacklog();
break;
case SMALLEST_BACKLOG:
result = selectSmallestBacklog();
break;
case RANDOM:
result = selectRandomReceiver();
break;
default:
request.failed(new ClientException("Next receiver called with invalid or unknown policy:" + policy));
break;
}
if (result == null) {
pending.add(request); // Wait for the next incoming delivery
if (timeout > 0) {
session.getScheduler().schedule(() -> {
if (!request.isDone()) {
pending.remove(request);
request.complete(null);
}
}, timeout, TimeUnit.MILLISECONDS);
}
} else {
// Track last returned to update state for Round Robin next receiver dispatch
// this effectively ties all policies together in updating the next result from
// a call that requests the round robin fairness policy.
result.protonLink().getSession().getAttachments().set(LAST_RETURNED_STATE_KEY, result);
request.complete(result);
}
}