Сначала нужно решить еще одну архитектурную проблему. В однопоточной программе последовательность обычно:
- Делай вещи;
- Call sendTo ();
- Делай больше вещей.
Вы должны потренироваться, если хотите:
- Делать вещи;
- Call sendTo ();
- Если (2) не удается, подождите 10 секунд и снова отправьте ();
- Если (3) не удается, выведите ошибку;
- Делай больше вещей.
Дело в том, что это все еще синхронно. Если так, вам понадобится нить. Вы должны использовать Java 5 Executors.
public void sendTo(final String username, final String message) {
if (!internalSendTo(username, message)) {
// attempt resend
ExecutorService exec = Executors.newSingleThreadExecutor();
final AtomicBoolean result = new AtomicBoolean(false);
exec.submit(new Runnable() {
boolean b = internalSendto(username, message);
result.set(b);
});
try {
exec.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// still didn't work
} finally {
exec.shutdownNow();
}
}
}
private boolean internalSendTo(String username, String message) {
Userdata user = findUser(username);
boolean success = false;
if (user != null) {
Out out = new Out(user.getClientSocket());
// do the communication here
success = true;
}
return success;
}
Теперь это просто набросок того, как это может работать. Это должно дать вам некоторую признательность за проблемы, однако.
Вы хотите этого или хотите:
- Делай вещи;
- Call sendTo ();
- Если (2) не удается, поставьте в очередь отправку и продолжайте;
- Делай больше вещей.
По сути, это асинхронный подход. Если вы пойдете этим путем, то вам придется отвечать на такие вопросы, как:
- Что произойдет, если через 10 с лишним секунд (или через некоторый произвольный интервал) он все еще не сработает?
- Какие процессы пытаются выполнить вызовы sendTo ()?
- Что если они заблокируют / умрут?
- Нужно ли несколько отправителей?
- и т.д.
В основном все становится намного сложнее.