2010-07-29 141 views
1

我正在升級註冊員工到達和離開辦公室的時間的應用程序。我不希望將這個應用程序安裝到我們當前的服務器之一,這是有點重要,因爲我將不得不離開會議打開,我想保持分開。所以我擁有的便宜,便宜的硬件。基本上是一個500MHz,64MB RAM的Debian Lenny,只有應用程序,還有MySQL數據庫來存儲信息,哦,是的,我在stove裏面。需要永久運行的應用程序的編程語言

目前該應用程序是用Java編寫的。只是一個控制檯程序與迪爾伯特的面子ascii藝術上要求僱員的ID。實際的線,那確實該「等待」是:

id = cin.nextInt(); 

當第一個到達的員工週一早上,他的ID,自去年員工約40小時不使用左,應用程序崩潰的類型。無法記住拋出的實際異常。

所以我的問題是:有永久循環Java應用程序的好方法嗎?或者更好的問題是,哪種編程語言更適合這項任務?

我想這似乎很明顯,首先不要在這樣糟糕的系統上使用大'ol 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的會比較從硬件描述快被丟棄。

+5

我不認爲選擇一個特定的編程語言是問題。 *任何*編程語言都可以很容易地解決這個問題。 – 2010-07-29 14:12:50

+0

好吧,你讓我在那裏。那麼計算機程序能夠運行的最接近永久性的是什麼?至少30天以上... – alanboy 2010-07-29 14:14:41

+2

永遠是最接近永遠的程序可以運行。沒有這樣的限制。 – 2010-07-29 14:17:18

回答

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恢復並運行時,每次獲得一個新的Connection都會解決這個問題。

而且,不,每次獲得新連接都不是「慢」,除非您碰巧正在處理每秒100位或1000位員工。

+0

Jupp。我的猜測是,由於不活動,服務器在週一關閉了與MySQL的連接。 +1 – Henning 2010-07-29 14:44:32

+0

使用'getUserId()'作爲一個阻塞函數,直到它接收到輸入爲止,對吧? – Brian 2010-07-29 17:12:38

+0

是的,我假設getUserId()卡在某個顯示器上的閃爍塊光標處。 – 2010-07-29 18:06:30

3
while(true) 
{ 
} 

for(;;) 
{ 
} 

都應該無限循環,並導致應用程序繼續運行。您必須添加某種代碼才能確保您的應用程序不會綁定正在運行的計算機的資源。

+0

我實際上使用while(true)現在,但我怎麼去「添加某種代碼來確保你的應用程序不會釘住您運行的計算機的資源「部分。任何想法 ? – alanboy 2010-07-29 14:16:45

+0

如果你想這樣做,你應該使用Thread.sleep。但是這個答案似乎不是解決問題的辦法。 – 2010-07-29 14:19:15

+1

@Erick Robertson - 被問到的問題是「有永久循環Java應用程序的好方法嗎?」。我會提出如何解決他的異常,但沒有例外detials的建議...我無法知道如何解決它。 – 2010-07-29 14:21:07

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(); 
    } 
} 

這樣任何異常被抓住,你會看到錯誤,但應用程序將繼續運行。

當然這裏有一個很大的買者自負 - 如果你保持一個關鍵的異常後運行,並通過在一個不穩定的狀態代碼垃圾數據,你只有自己責備:-)

+0

如果你得到一個OutOfMemoryError並且無法做任何事情,最好讓這個進程死掉並從頭開始,至少你有資源可以運行。這隻會在未能獲得資源時真正努力工作。 – 2010-07-29 14:23:21

+1

因此,警告? – Pete 2010-07-29 14:34:30

+0

說這是一個很好的答案,因爲它還列出了一個警告,就好像說,建議從500英尺高的懸崖上跳下來冷卻下來是件好事,同時也注意到它會殺死你。考慮到警告使這個答案完全無用。從來沒有,永遠,**沒有看到錯誤拋出拋磚引玉,做一些有用的迴應。 – 2010-07-29 14:51:32

0

衆說已經說過,你的應用沒有理由不能永遠運行。那麼,核浩劫會讓它陷入一片戛然而止,但是迪爾伯特和他的領帶將是你當時最擔心的問題。

您是否考慮過使用嵌入式系統?您正在使用通用計算機和操作系統來執行一件事。使用Arduino甚至像ADI公司的Blackfin這樣的GP-DSP來實現這一點會更加經濟實惠。您仍然可以使用C/C++進行編程,甚至可以使用嵌入式操作系統,例如ucLinux。價格便宜多了,堅如磐石。

2

您是否認爲程序的輸入實際上並不是一個整數,並且您得到了一個InputMismatchedException或其他東西?也許週末有人碰到一個不是數字的鑰匙,然後當週一的第一個人輸入他們的號碼並按下輸入時,它在它之前有一些額外的東西。 Blammo,例外。

3

我知道給Java應用程序高可用性的最簡單方法就是從循環中的bash腳本啓動它。也許在那裏睡一覺,這樣如果你的應用進入無法啓動的狀態,它不會每秒嘗試一百萬次。事情是這樣的:

#!/bin/bash 
while [ 1 ] 
do 
     java ... MyApp  
     sleep 5 
done 

不要緊,在你的JVM會發生那麼......內部錯誤,出內存異常,JVM錯誤(他們發生!)什麼的。它仍然會在5秒鐘後重新啓動。

很明顯,這並不排除你的應用程序在內乾淨地處​​理事情的步驟。這是後備。

1

您是否在嘗試自己編寫時間報關亭?

這個問題很好解決,我相信你可以找到一個負擔得起的商業解決方案。

-1

我建議你用C而不是Java編寫應用程序。

+0

你能評論一下你爲什麼這麼想嗎? Java有比C更多的從程序員錯誤中恢復的機制。它還可以防止編譯時導致類似C程序崩潰的許多程序員錯誤。 – 2010-07-29 14:58:52

+0

C比Java更接近硬件。如果您希望可靠性和正常運行時間更接近硬件,並儘可能多地刪除代碼層。 – fpmurphy1 2010-07-31 16:29:49

0

以及如何將您的應用程序遷移到基於Web的服務,一個簡單的HTML頁面將做接口。在它後面運行一個apache服務器,它將處理你的腳本(當然是用perl編寫的;))以及與bdd的連接。

這是很輕的,可靠的,並會只要你願意

+0

我假設在alanboy的應用程序中有一些編程錯誤。遷移應用程序也會遷移編程錯誤。 基於Web的服務也有缺點。如果應用程序被遷移到基於網絡的服務,那麼(1)alanboy的懶惰員工每天凌晨4點55分起牀,上午5點準時上班,並在早上5點5分回到牀上。 (2)應用程序將取決於可靠的網絡連接。 – emory 2010-07-29 22:38:36

+0

我並沒有真正解決這個問題,懶惰的人醒來等等...一個基於Web的應用程序不需要從萬維網上訪問......本地服務器可以運行......好吧。 ..locally ...所以從辦公室訪問... – benzebuth 2010-07-30 07:37:24

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(); 
    } 
} 
+0

我從來沒有聽說過30天的測試作業,所以我會冒險「不」。 – Amadan 2010-07-30 02:40:41

0

爲需要的應用程序編程語言來運行永遠

答:Java中,你就必須要小心的代碼。

備選答案:任何語言都行,你就必須要小心代碼