2010-06-30 62 views
4

我正在開發一個簡單的Java測試框架,它需要通過響應JMS調用來模擬weblogic部署。其中一個測試配置選項是模擬延遲的延遲。我想知道如果有人有什麼好的想法如何做到這一點。我只是想創建一個TimerTask來處理它,有沒有更好的方法?謝謝。模擬Java中的延遲

回答

3

您可以創建一個ScheduledExecutorService來執行延遲後的操作。

private final ScheduleExecutorService executor = 
    Executors.newSingleThreadScheduledExecutor(); 


// is main loop, waits between 10 - 30 ms. 
executor.schedule(new Runnable() { public void run() { 
    // my delayed task 
}}, 10 + new Random().nextInt(20), TimeUnit.MILLI_SECOND); 

編輯:您可以使用Concurrency Backport爲JDK 1.4。它適用於JDK 1.2到JDK 6

+0

這可能是我的首選,但不幸的是我使用的是Java 1.4。 – Igman 2010-07-01 00:34:30

+0

@Igman,見我的編輯 – 2010-07-02 07:13:49

2

如何只

Thread.sleep(10 + new Random().nextInt(20)); // waits between 10 - 30 ms. 

即在響應JMS叫你只是用它來模擬一個隨機的等待時間延遲的代碼。

+0

這是我原來的想法,問題在於,這與主線程相關,這不是我們系統的精確模擬。我希望應用程序在返回延遲響應之前能夠在必要時響應下一條消息。 – Igman 2010-06-30 21:23:57

+0

@Igman嗯,在這種情況下,我理解你的問題,但這在架構上看起來很古怪。您是不是產卵了一個新線程或使用線程池來處理傳入的JMS請求? – mikera 2010-06-30 22:20:55

0

您可以使用Quartz安排工作,這是否解決了目的?

+0

石英看起來像它可能有點大到我的目的,主要是因爲我看到一個有幾秒鐘的延遲。石英似乎更適合定期安排的任務。 – Igman 2010-06-30 21:16:36

3

創建一個嘲笑服務器的對象。當它「接收」你的輸入時,讓它產生一個新線程來「處理連接」,就像真正的服務器一樣。該產生的線程可以將Thread.sleep()放入其心臟的內容中,以模擬發送和接收延遲,並允許您模擬一些在測試期間可能有用的服務器狀態屬性。