【问题标题】:How to quit a java program at a specific time如何在特定时间退出java程序
【发布时间】:2011-08-03 08:55:04
【问题描述】:

我有一个JMS监听应用,QueueReceive类实现了MessageListener。主要功能如下:

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 消息?

【问题讨论】:

    标签: java jms quit


    【解决方案1】:

    您可以为此使用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();
    }
    }
    

    【讨论】:

    • 我尝试了代码,在 run() 函数中我运行了一个 jms 客户端。但是当一个新任务开始时,它只是运行一个新客户端,旧客户端仍然存在。 Weblogic jms 控制台上的消费者客户端数量正在增加。实际上我希望 java 应用程序在特定时间退出。
    • @rocwing: 你在 run() 中的代码是什么?我想你只需要给一个 System.exit(0) ,你不需要在其中启动一个新的 jms 客户端。我将编写一个示例代码并发布。
    【解决方案2】:

    如果我们谈论JMS,那么实现MessageListener 的类将有一个方法onMessage,当任何消息进入队列时都会调用该方法。您可以实现此方法,使其可以检查传入的消息并在特定条件下调用quit() 方法。

    我认为,我们不需要这里的 while 循环来不断检查是否退出您的 QueueReceive

    【讨论】:

    • 几天后jms客户端死机了,但是app并没有退出,所以有时候收不到退出消息。我们希望应用在特定时间退出,然后由另一个程序启动。
    • hmm...所以你想要程序本身的退出控制,但被其他人唤醒...Quartz是提供特定时间触发器执行的库。如果您想准时出发,这可以用来实现。但同样,如果您需要基于事件的机制,例如 if the queue is empty,那么这很特别...
    【解决方案3】:

    使用 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());
    

    【讨论】:

      【解决方案4】:

      您可以按照@Emil 的建议使用 Timer Task,这仅适用于简单的场景,例如 x 分钟或几小时后退出。

      如果您需要更高级的调度,最好使用Quartz。使用 Quartz,您可以提供一年中某个月份的具体日期。基本上,您可以想象的任何可能的时间组合都可以使用 Quartz 进行配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2022-01-16
        • 2022-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        相关资源
        最近更新 更多