我正在升级一个应用程序,用于记录员工到达和离开办公室的时间。我不想将这个应用程序安装到我们当前的服务器之一,这有点重要,因为我不得不让会话打开,我想保持分离。所以我所拥有的只是便宜,廉价的硬件。基本上是一个500MHz,64MB RAM的Debian Lenny,只有应用程序和MySQL数据库来存储信息,哦,是的,我在stove内。
目前该应用程序是用Java编写的。只是一个控制台程序,Dilbert面对ascii艺术,询问员工的身份证。 “等待”的实际行是:
id = cin.nextInt();
当第一名员工在星期一早上到达并输入他的身份证时,自上次员工离职后大约40小时无用,该应用程序崩溃了。不记得抛出的实际异常。
所以我的问题是:有一种很好的方法可以永久地循环Java应用程序吗?或者更好的问题是,哪种编程语言更适合这项任务?
我想首先不要在这样糟糕的系统上使用大型的java,但我只想说,我就像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。
答案 0 :(得分:4)
您的程序绝对没有理由需要维护与数据库的开放连接。您只需打开连接,完成工作,并在每次用户输入ID时关闭它。
事实是,你所获得的例外对于它崩溃的原因至关重要。
您的计划应该只是:
public class Go {
public static void main(String args[]) {
while(true) {
try {
String userID = getUserId();
Connection con = getConnection();
processUserId(connection, userId);
con.close();
catch(Exception e) {
logException(e);
}
}
}
}
如果您遇到异常,则需要寻找并防止这些异常。保存MySQL出去吃午餐,没有理由你应该在这个程序中得到任何例外。如果MySQL进入午餐,一旦MySQL恢复运行,每次解决该问题时都会获得一个新的连接。
而且,不,每次获取新连接都不会“慢”,除非您恰好每秒处理100或1000名员工。
答案 1 :(得分:3)
while(true)
{
}
或
for(;;)
{
}
两者都应无限循环并导致应用程序继续运行。您必须添加某种代码,以确保您的应用不会占用您正在运行的计算机的资源。
答案 2 :(得分:3)
我知道为Java应用程序提供高可用性的最简单方法是在循环中从bash脚本启动它。也许在那里睡觉,这样如果你的应用程序进入无法启动的状态,它不会每秒尝试一百万次。像这样:
#!/bin/bash
while [ 1 ]
do
java ... MyApp
sleep 5
done
无关紧要在你的JVM中发生了什么......内部错误,内存不足异常,JVM错误(它们发生!)无论如何。它仍然会在5秒后立即启动。
显然,这并不排除在应用程序中干净地处理事情的步骤。这是后备。
答案 3 :(得分:2)
你认为你的程序输入实际上可能不是一个整数,而你得到的是InputMismatchedException
或者什么?也许在周末有人打了一个不是数字的钥匙,然后当周一的第一个人输入他们的数字并按下Enter 时,它就会有一些额外的瑕疵。 Blammo,例外。
答案 4 :(得分:1)
您是否正在尝试自己写一个时间报道?
这个问题已经很好地解决了,我相信你能找到一个经济实惠的商业解决方案。
答案 5 :(得分:0)
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();
}
}
这样任何异常都会被捕获,您将看到错误,但应用程序将继续运行。
当然这里有一个很大的警告 - 如果你在一个关键异常后继续运行并通过让代码处于不稳定状态而丢弃数据,你只能责怪自己: - )
答案 6 :(得分:0)
正如大家所说,没有理由你的应用无法永远运行。好吧,核浩劫会让它戛然而止,但迪尔伯特和他的领带在这一点上是你最不关心的问题。
您是否考虑过使用嵌入式系统?您使用通用计算机和操作系统只做一件事。使用Arduino甚至某些GP-DSP(如ADI公司的Blackfin)实现这一目标会更经济实惠。您仍然可以使用C / C ++编程,甚至可以使用ucLinux等嵌入式操作系统。便宜得多,坚如磐石。
答案 7 :(得分:0)
如何将您的应用程序迁移到基于Web的服务,一个简单的html页面将执行该界面。在它后面运行一个apache服务器,它将处理你的脚本(当然是用perl写的;)),以及与bdd的连接。
这是非常轻,可靠,并且只要你愿意就会运行
答案 8 :(得分:0)
我建议您按如下方式编辑代码。这不会使程序运行更长时间,但你会知道它崩溃的原因。只有这样才能解决问题。
这是家庭作业吗?
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();
}
}
答案 9 :(得分:0)
需要永久运行的应用程序的编程语言
答案:Java,你只需要小心代码。
替代答案:任何语言都可以,你只需要注意代码
答案 10 :(得分:-1)
我建议你用C语言而不是Java编写应用程序。