Java 需要永远运行的应用程序的编程语言

Java 需要永远运行的应用程序的编程语言,java,linux,Java,Linux,我正在升级一个应用程序,它可以记录员工到达和离开办公室的时间。我不想将此应用程序安装到我们当前的服务器中,这有点重要,因为我必须保留一个会话处于打开状态,并且我希望将事情分开。所以我只有便宜的,便宜的硬件。基本上是一个500MHz,64MB内存的Debian Lenny,只有应用程序,MySQL数据库来存储信息,哦,是的,我在一个 目前该应用程序是用Java编写的。只是一个控制台程序,上面有一个Dilbert的脸ascii艺术,要求输入员工的ID。实际的“等待”行是: id = cin.next

我正在升级一个应用程序,它可以记录员工到达和离开办公室的时间。我不想将此应用程序安装到我们当前的服务器中,这有点重要,因为我必须保留一个会话处于打开状态,并且我希望将事情分开。所以我只有便宜的,便宜的硬件。基本上是一个500MHz,64MB内存的Debian Lenny,只有应用程序,MySQL数据库来存储信息,哦,是的,我在一个

目前该应用程序是用Java编写的。只是一个控制台程序,上面有一个Dilbert的脸ascii艺术,要求输入员工的ID。实际的“等待”行是:

id = cin.nextInt();
当第一位员工周一早上到达并输入他的id时,应用程序崩溃。自从最后一位员工离开以来,他的id已经停止使用了大约40个小时。记不起实际引发的异常

所以我的问题是:有没有一种很好的方法可以永远循环Java应用程序?或者更好的问题是,哪种编程语言更适合此任务

我想一开始不在这么差的系统上使用大的OLJava似乎是显而易见的,但我只是说,我有点喜欢java


编辑:谢谢你的回复。然而,我在那里做了所有的尝试。我很抱歉,问题是应用程序无法恢复的错误,例如OutOfMemoryError

实际代码如下所示:

static boolean start() {
    Scanner cin = new Scanner(System.in);
    int id; 
    try{
        id = cin.nextInt();
        doStuff( id );
        return true;
    }catch (Exception e){
        //which would trap all recoverable exceptions
        System.out.println("Something is wrong. Try again.");
        return false;               
    }
}

public static void main(String ... args){
    boolean first = true;
    while(true) {
        if(first) showDilbert();
        first = start();
    }
}
很抱歉,我没有更多地关注实际的异常,但我认为从硬件描述来看,Java会更快地被丢弃

while(true)
{
}

应该无限循环并使应用程序继续运行。你必须添加一些代码来确保你的应用程序不会占用你运行的机器的资源


应该无限循环并使应用程序继续运行。您必须添加一些代码,以确保您的应用程序不会与您运行的机器的资源挂钩。

对于这项任务,Java本身没有什么问题-尽管您的机器规格非常有限,而且我预计内存消耗是您的主要问题-JVM本身可能会占用您的大部分资源可用内存

我将在Java中使用以下技术来保持运行:

while (true) {
  try {
    // do stuff here

    Thread.sleep(1); // sleep a bit just to be nice to other processes
  } catch (Throwable t) {
    t.printStackTrace();
  }
}
这样,任何异常都会被捕获,您将看到错误,但应用程序将继续运行


当然,这里有一个很大的警告-如果您在发生严重异常后继续运行,并通过使代码处于不稳定状态而丢弃数据,您只能怪自己:-)

Java在这项任务中没有本质上的错误-尽管您的机器规格非常有限,而且我认为内存消耗是您的主要问题-仅JVM可能就占用了大部分可用RAM

我将在Java中使用以下技术来保持运行:

while (true) {
  try {
    // do stuff here

    Thread.sleep(1); // sleep a bit just to be nice to other processes
  } catch (Throwable t) {
    t.printStackTrace();
  }
}
这样,任何异常都会被捕获,您将看到错误,但应用程序将继续运行


当然,这里有一个很大的警告-如果你在一个关键异常后继续运行,并通过使代码处于不稳定状态而丢弃数据,你只能怪你自己:-)

正如大家所说,没有理由你的应用不能永远运行。好吧,核浩劫会让它戛然而止,但迪尔伯特和他的领带在那一点上是你最不关心的


你考虑过使用嵌入式系统吗?您使用通用计算机和操作系统只做一件事。使用Arduino或甚至一些类似GP-DSP的模拟设备的Blackfin来实现这一点会更经济,也会是一次很好的体验。您仍然可以使用C/C++编程,甚至可以使用嵌入式操作系统,如ucLinux。便宜得多,而且坚如磐石。

正如大家所说,你的应用程序没有理由永远运行不起来。好吧,核浩劫会让它戛然而止,但迪尔伯特和他的领带在那一点上是你最不关心的


你考虑过使用嵌入式系统吗?您使用通用计算机和操作系统只做一件事。使用Arduino或甚至一些类似GP-DSP的模拟设备的Blackfin来实现这一点会更经济,也会是一次很好的体验。您仍然可以使用C/C++编程,甚至可以使用嵌入式操作系统,如ucLinux。要便宜得多,而且坚如磐石。

您是否认为您的程序的输入实际上不是整数,您得到的是一个
输入不匹配异常
或什么?也许在周末,有人按了一个不是数字的键,然后当第一个人在星期一输入他们的数字并按Enter键时,它就有了一些额外的痕迹。Bullmo,异常。

您是否认为您程序的输入实际上不是一个整数,并且您得到了一个
输入不匹配异常
或什么?也许在周末,有人按了一个不是数字的键,然后当第一个人在星期一输入他们的数字并按Enter键时,它就有了一些额外的痕迹。bummo,exception.

我所知道的为Java应用程序提供高可用性的最简单方法就是从循环中的bash脚本启动它。如果你的应用程序进入了无法启动的状态,那么它就不会每秒尝试一百万次。大概是这样的:

#!/bin/bash
while [ 1 ]
do
        java ... MyApp    
        sleep 5
done
不管JVM中发生了什么……内部错误、内存不足异常、JVM错误(它们会发生!)等等。5秒后,它仍然会重新启动


显然,这并不排除在应用程序中干净地处理事情的步骤。这是一种退路。

我所知道的让Java应用程序高可用性的最简单方法就是从循环中的bash脚本启动它。如果你的应用程序进入了无法启动的状态,那么它就不会每秒尝试一百万次。大概是这样的:

#!/bin/bash
while [ 1 ]
do
        java ... MyApp    
        sleep 5
done
不管JVM中发生了什么,我
static boolean start() {
    Scanner cin = new Scanner(System.in);
    int id; 
    try{
        id = cin.nextInt();
        doStuff( id );
        return true;
    }catch (Exception e){
        //which would trap all recoverable exceptions
        System.out.println("Something is wrong. Try again.");
        return false;               
    }catch(Throwable e){
        // Add this.
        System . err . println ( e ) ; // come back to SO with this
        e . printStackTrace ( ) ; // come back to SO with this
        System . exit ( 1 ) ;
    }
}

public static void main(String ... args){
    boolean first = true;
    while(true) {
        if(first) showDilbert();
        first = start();
    }
}