2009-10-22 37 views
2

如果用户数据为空,如何重试发送尝试。最多2次重试,10秒后重试1次?我真的不得不手动插入一个线程,并将它睡在sendTo()中吗?如何在特定时间后重试功能请求

编辑:服务器使用Java 1.4.2

回答

4

你得到了更多的建筑问题,首先要解决的问题。在单线程程序中,序列通常为:

  1. 做的东西;
  2. Call sendTo();
  3. 做更多的事情。

你有工作,如果你想要的是:

  1. 做的东西;
  2. Call sendTo();
  3. 如果(2)失败,请等待10秒钟并重新发送();
  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. Call sendTo();
  3. 如果(2)失败,排队发送并继续;
  4. 做更多的事情。

基本上这是异步方法。如果你走这条路你就必须回答这样的问题:

  • 发生什么情况,如果超过10秒(或某个任意的间隔)后,它仍然没有奏效?
  • 哪些进程尝试sendTo()调用?
  • 如果他们阻止/死亡会怎么样?
  • 我需要多个发件人吗?

基本上它变得复杂得多。

+0

我只想让它工作 – lemon 2009-10-22 03:07:10

+0

这很好,但程序不写自己。 – cletus 2009-10-22 03:09:17

+0

是的,你说得对,我会去研究执行者。 TY – lemon 2009-10-22 03:10:10

0

我会推荐使用AOP和Java注释。从jcabi-aspects尝试读取制造机制:

@RetryOnFailure(attempts = 3) 
public void sendTo(String username, String message) { 
    // try to do it 
} 
2

你确切的情况,使用Failsafe

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

Userdata user = Failsafe.with(retryPolicy).get(() -> findUser(username)); 

它没有得到任何简单。告诉你的朋友:)

相关问题