2011-08-03 32 views
1

我有一個JMS監聽器的應用程序,類QueueReceive如下實施MessageListener.the主要功能:如何在特定時間退出Java程序

public static void main(String[] args) throws Exception { 

    InitialContext ic = getInitialContext(); 
    QueueReceive qr = new QueueReceive(); 
    qr.init(ic, QUEUE); 

    System.out.println("JMS Ready To Receive Messages (
     To quit, send a \"quit\" message).");  
    // Wait until a "quit" message has been received. 

    synchronized(qr) { 
     while (! qr.quit) { 
      try { 
       qr.wait(); 
      } catch (InterruptedException ie) {} 
      } 
     } 
     qr.close(); 
    } 

有什麼辦法退出應用程序在程序中的特定時間不通過jms消息?

回答

3

您可以使用TimerTask [Sample Code]來達到此目的。

實施例:

import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 

public class ExitOn { 
Timer timer = new Timer(); 
TimerTask exitApp = new TimerTask() { 
    @Override 
    public void run() { 
     System.exit(0); 
    } 
}; 
public ExitOn() { 
timer.schedule(exitApp, new Date(System.currentTimeMillis()+5*1000));//Exits after 5sec of starting the app 
while(true) 
    System.out.println("hello"); 
} 

public static void main(String[] args) { 
    new ExitOn(); 
} 
} 
+0

我嘗試代碼,在run()函數中運行一個jms客戶端。但是當一個新任務開始時,它只是運行一個新客戶端,舊客戶端仍然在那裏。 Weblogic jms控制檯上消費者客戶端的數量正在增加。其實我想在特定的時間退出Java應用程序。 – Pengyi

+0

@rocwing:您在run()中放入的代碼是什麼?我想你只需要給一個System.exit(0),你不需要在其中啓動一個新的jms客戶端。我會寫一個示例代碼和帖子。 – Emil

+0

謝謝!這是幾天後我想要 – Pengyi

1

如果我們談論JMS,然後實施MessageListener類將有一個方法onMessage,當任何消息進入隊列,這將被調用。您可以實現此方法,以便它可以檢查傳入消息並在特定條件下調用quit()方法。

我認爲,我們不需要while循環來經常檢查退出QueueReceive

+0

,jms客戶端將會死機,但應用程序沒有退出。所以有時它不能接收退出消息。我們希望應用程序在特定時間退出,並且將由另一個程序啓動。 – Pengyi

+0

嗯...所以你想要退出控制程序本身,但由其他喚醒...'Quartz'是提供特定的時間觸發器來執行的庫。如果你想要按時完成,可以用它來實現。但是,如果你需要基於事件的機制,比如'如果隊列是空的',那麼特別的... – Parth

1

使用java.util.Timer中(而不是一個javax.swing中!)

boolean daemon = true; 
    Calendar cal = Calendar.getInstance(); 
    //cal.set() to whatever time you want 
    Timer timer = new Timer(daemon); 
    timer.schedule(new TimerTask() { 
     public void run() { 
      // Your action here 
     } 
    }, cal.getTime()); 
0

您可以使用計時器任務作爲@Emil建議,這只是簡單的場景,如X分鐘,或退出後有用小時。

如果您需要更高級的調度,最好使用Quartz。使用Quartz,你可以提供一年的一個月的具體日期..基本上你可以想象的任何可能的時間組合都可以使用石英來配置。