Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一定时间后重试函数请求_Java - Fatal编程技术网

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

Java 如何在一定时间后重试函数请求,java,Java,如果用户数据为空,如何使其重试发送尝试。最多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

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

首先要解决的是更多的体系结构问题。在单线程程序中,顺序通常为:

  • 做事
  • 调用sendTo()
  • 多做事
  • 你必须确定你想要的是:

  • 做事
  • 调用sendTo()
  • 如果(2)失败,请等待10秒,然后再次发送到()
  • 如果(3)失败,抛出一个错误
  • 多做事
  • 关键是这仍然是同步的。如果是这样,你需要一根线。您应该使用Java5执行器

    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;
    }
    
    这只是一个大概的工作原理。不过,它应该会让你对这些问题有所了解

    您想要这个还是想要:

  • 做事
  • 调用sendTo()
  • 如果(2)失败,将发送排队并继续
  • 多做事
  • 基本上这就是异步方法。如果你这样做,你必须回答以下问题:

    • 如果超过10秒(或任意时间间隔)后仍不工作,会发生什么情况
    • 哪些进程尝试sendTo()调用
    • 如果他们堵死了怎么办
    • 我需要多个发件人吗

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

    我建议使用AOP和Java注释。从以下位置尝试读取机制:


    您的确切场景,使用:


    它没有变得更简单。告诉你的朋友:)

    这很好,但程序不会自己编写。帮你自己一个大忙,买东西读
    @RetryOnFailure(attempts = 3)
    public void sendTo(String username, String message) {
      // try to do it
    }
    
    RetryPolicy retryPolicy = new RetryPolicy()
      .retryWhen(null)
      .withMaxRetries(2)
      .withDelay(10, TimeUnit.SECONDS);
    
    Userdata user = Failsafe.with(retryPolicy).get(() -> findUser(username));