2011-08-03 33 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,你可以提供一年的一个月的具体日期..基本上你可以想象的任何可能的时间组合都可以使用石英来配置。