ИМХО, стандартный Java API уже обеспечивает простой способ сделать это, не прибегая к внешним библиотекам и даже не требуя реализации собственного итератора. Просто используйте Deque, где вы тянете первый сервер, используете или отбрасываете его, а затем добавляете обратно в конец Deque. Вот пример кода:
// Initialize the Deque. This might be at your class constructor.
Deque<Host> dq = new ArrayDeque<Host>();
dq.addAll(Arrays.asList(hosts));
void sendJob(Job myJob) {
boolean jobInProcess = false;
do {
Host host = dq.removeFirst(); // Remove the host from the top
if(!host.isBusy()) {
host.sendJob(myJob);
jobInProcess = true;
}
dq.addLast(host); // Put the host back at the end
}
while(!jobInProcess); // Might add another condition to prevent an infinite loop...
}
Это просто пример, в котором вы всегда пингуете хосты в циклическом порядке в цикле, который заканчивается только тогда, когда один из них доступен и выполняет задание. Вы можете легко повозиться с ним, чтобы обойти очередь только один раз (использовать счетчик с максимальным значением, равным размеру очереди), или несколько раз, прежде чем выдавать исключение, или спать в перерывах между раундами, чтобы избежать стука по хостам, когда все заняты ,