gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:49 28 4
gpt4 key购买 nike

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

我真的必须手动插入一个线程并将其 hibernate 在 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()?
  • 如果他们挡住了/死了怎么办?
  • 我需要多个发件人吗?
  • 等等

基本上它变得更加复杂。

关于java - 如何在一定时间后重试功能请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1604763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com