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

lem*_*mon 4 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 message) {
    Userdata user = findUser(username);
    if(user != null) {
        Out out = new Out(user.getClientSocket());
        out.println(message);
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

我真的需要手动插入线程并将其在sendTo()中休眠吗?

编辑:服务器使用Java 1.4.2

Jon*_*han 7

使用Failsafe的确切情况:

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

Userdata user = Failsafe.with(retryPolicy).get(() -> findUser(username));
Run Code Online (Sandbox Code Playgroud)

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


cle*_*tus 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;
}
Run Code Online (Sandbox Code Playgroud)

现在,这只是其工作方式的粗略概图。但是,它应该使您对这些问题有所了解。

您想要这个还是想要:

  1. 做东西;
  2. 调用sendTo();
  3. 如果(2)失败,则将发送排队并继续进行;
  4. 做更多的事情。

基本上,这是异步方法。如果您采用这种方式,则必须回答以下问题:

  • 如果在10秒钟以上(或任意间隔)仍不起作用,会发生什么?
  • 哪些进程尝试sendTo()调用?
  • 如果他们阻止/死亡怎么办?
  • 我需要多个发件人吗?
  • 等等

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