如何在一定时间后重试功能请求

2024-02-11

如果用户数据为空,如何让它重试发送尝试。最多重试 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


您首先需要解决更多架构问题。在单线程程序中,顺序通常是:

  1. 做东西;
  2. 调用sendTo();
  3. 多做点事吧

你必须弄清楚你想要的是:

  1. 做东西;
  2. 调用sendTo();
  3. 如果(2)失败,等待10秒并再次sendTo();
  4. 如果(3)失败,则抛出错误;
  5. 多做点事吧

重点是这仍然是同步的。如果是这样,您将需要一个线程。您应该使用 Java 5 执行器。

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()?
  • 如果他们阻塞/死亡怎么办?
  • 我需要多个发件人吗?
  • etc

基本上它变得更加复杂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在一定时间后重试功能请求 的相关文章

随机推荐