如果用户数据为空,如何使其重试发送尝试。最多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
使用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)
它没有变得更简单。告诉你的朋友 :)
您首先要解决的架构问题更多。在单线程程序中,顺序通常为:
如果您想要的是,您必须解决:
关键是这仍然是同步的。如果是这样,您将需要一个线程。您应该使用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)
现在,这只是其工作方式的粗略概图。但是,它应该使您对这些问题有所了解。
您想要这个还是想要:
基本上,这是异步方法。如果您采用这种方式,则必须回答以下问题:
基本上,它变得更加复杂。
| 归档时间: |
|
| 查看次数: |
3587 次 |
| 最近记录: |