2009-10-22 57 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)); 

它沒有得到任何簡單。告訴你的朋友:)

相關問題