如何在一定时间后重新尝试函数请求

4

如果用户数据为空,我该如何使其重试发送尝试。最多重试2次,在10秒后重试1次?

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()函数中手动插入线程并使其休眠吗?

编辑:服务器使用的是java 1.4.2版本。

2个回答

5
你需要先解决一个架构问题。在单线程程序中,通常的顺序是:
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()函数?
  • 如果它们阻塞/死亡怎么办?
  • 我需要多个发送者吗?
  • 等等

基本上它变得更加复杂了。


很好,但程序不会自己写出来。 - cletus

0

我建议使用AOP和Java注解。尝试使用jcabi-aspects中的现成机制:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接