2009-10-22 3 views
2

Как заставить его повторить попытку отправки, если данные пользователя равны нулю. Макс 2 повторения, 1 повторить через 10 секунд?Как выполнить запрос функции повторного запроса через определенное время

public class UserHandler { 
    private List users = new ArrayList(); 

    public void addUser(username) {} //adds user 
    public Userdata findUser(username) {} //finds user 

    public void sendTo(String username, String message) { 
    Userdata user = findUser(username); 
    if(user != null) { 
     Out out = new Out(user.getClientSocket()); 
     out.println(message); 
    } 
    } 
} 

Нужно ли мне вручную вставлять нить и спать внутри sendTo()?

EDIT: сервер использует Java 1.4.2

ответ

4

Вы получили больше архитектурной проблемы решить в первую очередь. В однопоточной программе последовательность обычно:

  1. Сделайте вещи;
  2. Звонок sendTo();
  3. Сделайте больше вещей.

Вы должны работать, если то, что вы хотите:

  1. ли материал;
  2. Звонок sendTo();
  3. Если (2) терпит неудачу, подождите 10 секунд и снова sendTo();
  4. Если (3) не работает, выдайте ошибку;
  5. Сделайте больше вещей.

Суть в том, что это все еще синхронно. Если так, вам понадобится нить. Вы должны использовать 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; 
} 

Теперь это всего лишь приблизительный эскиз того, как он может работать. Однако это должно дать вам некоторую признательность за эти вопросы.

вы хотите это сделать, или вы хотите:

  1. ли материал;
  2. Звонок sendTo();
  3. Если (2) терпит неудачу, отправьте очередь в очередь и продолжайте движение;
  4. Сделайте больше вещей.

В основном это асинхронный подход. Если вы пойдете так, вы должны ответить на такие вопросы, как:

  • Что произойдет, если через 10+ секунд (или какой-то произвольный интервал) все еще не сработало?
  • Какие процессы пытаются вызвать вызовы sendTo()?
  • Что делать, если они блокируют/умирают?
  • Нужно ли мне несколько отправителей?
  • и т.д.

В основном это становится намного сложнее.

+0

Я просто хочу, чтобы это сработало – lemon

+0

Это хорошо, но программы не пишут сами. – cletus

+0

Да, вы правы, тогда я пойду исследователями. TY – lemon

0

Я бы рекомендовал использовать аннотации AOP и Java.Попробуйте механизм чтения сделаны из jcabi-aspects:

@RetryOnFailure(attempts = 3) 
public void sendTo(String username, String message) { 
    // try to do it 
} 
2

Ваш точный сценарий, используя Failsafe:

RetryPolicy retryPolicy = new RetryPolicy() 
    .retryWhen(null) 
    .withMaxRetries(2) 
    .withDelay(10, TimeUnit.SECONDS); 

Userdata user = Failsafe.with(retryPolicy).get(() -> findUser(username)); 

Это не становится проще. Расскажите своим друзьям :)

Смежные вопросы