Язык программирования для приложения, которое должно работать вечно - PullRequest
1 голос
/ 29 июля 2010

Я обновляю приложение, которое регистрирует время, когда сотрудники приходят и покидают офис.Я не хотел бы устанавливать это приложение на одном из наших текущих серверов, что несколько важно, потому что мне пришлось бы оставить сеанс открытым, и я хотел бы держать вещи отдельно.Так что все, что у меня есть, это дешевое, дешевое оборудование.В основном, 500 МГц, 64 МБ ОЗУ Debian Lenny без приложения, и база данных MySQL для хранения информации, о да, и я в печи .

В настоящее время приложение написанона Яве.Просто консольная программа с изображением лица Дилберта, запрашивающая удостоверение личности сотрудника.Фактическая строка, которая выполняет «ожидание», выглядит следующим образом:

id = cin.nextInt();

Когда первый сотрудник приходит в понедельник утром и вводит свой идентификатор, около 40 часов не используется с момента последнего сотрудника, приложение вылетает.Не могу вспомнить фактическое исключение.

Итак, мой вопрос: есть ли хороший способ зациклить приложение Java навсегда?Или, может быть, лучше спросить, какой язык программирования лучше для этой задачи?

Я думаю, что на первый взгляд кажется очевидным не использовать big '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 будет отброшен довольно быстро из описания оборудования.,

Ответы [ 11 ]

4 голосов
/ 29 июля 2010

Нет абсолютно никаких причин, по которым вашей программе необходимо поддерживать открытое соединение с базой данных.Вы можете получить это, просто открыв соединение, выполняя свою работу и закрывая его каждый раз, когда пользователь вводит свой идентификатор.

По правде говоря, исключение, которое вы получаете, жизненно важно для причины его сбоя.

Ваша программа должна быть немного больше, чем:

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 сотрудников в секунду.

3 голосов
/ 29 июля 2010

Самый простой из известных мне способов обеспечения высокой доступности вашего Java-приложения - просто запустить его из скрипта bash в цикле.Возможно, включите режим сна, чтобы, если ваше приложение переходит в состояние, в котором оно не может быть запущено, оно не пытается миллион раз в секунду.Примерно так:

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

Не имеет значения, ЧТО происходит в вашей JVM, тогда ... внутренняя ошибка, исключение памяти, ошибка JVM (они случаются!), Что угодно.Он по-прежнему будет загружаться снова через 5 секунд.

Очевидно, что это не исключает шагов для чистой обработки в вашего приложения.Это запасной вариант.

3 голосов
/ 29 июля 2010
while(true)
{
}

или

for(;;)
{
}

Должны ли оба цикла выполняться бесконечно и вызывать продолжение работы приложения.Вам придется добавить какой-то код, чтобы убедиться, что ваше приложение не привязывает ресурсы компьютера, на котором вы работаете.

2 голосов
/ 29 июля 2010

Считаете ли вы, что входные данные для вашей программы на самом деле не являются целыми числами, и вы получаете InputMismatchedException или что-то еще? Возможно, на выходных кто-то нажал клавишу, которая не была цифрой, а затем, когда первый человек в понедельник набирает свой номер и нажимает Enter , перед ним появляется какая-то лишняя буква. Бламмо, исключение.

1 голос
/ 29 июля 2010

Вы пытаетесь написать киоск ввода времени самостоятельно?

Эта проблема хорошо решена, я уверен, что вы можете найти доступное коммерческое решение.

0 голосов
/ 30 июля 2010

Язык программирования для приложения, которое должно работать вечно

Ответ: Java, вы просто должны быть осторожны с кодом.

Альтернативный ответ: подойдет любой язык, нужно просто быть осторожным с кодом

0 голосов
/ 30 июля 2010

Я бы посоветовал вам отредактировать ваш код, как показано ниже. Это не заставит программу работать дольше, но вы будете знать, почему она падает. Только тогда вы сможете решить проблему.

Это домашнее задание?

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 голосов
/ 29 июля 2010

и как насчет миграции вашего приложения в веб-службу, простая страница html сделает интерфейс. Запустите за ним сервер apache, который будет обрабатывать ваши скрипты (написанные, конечно, на perl;)) и соединение с bdd.

это очень легкий, надежный и будет работать столько, сколько вы хотите

0 голосов
/ 29 июля 2010

Я бы посоветовал вам написать приложение на языке C, а не на Java.

0 голосов
/ 29 июля 2010

Как уже говорили, нет причин, по которым ваше приложение не может работать вечно.Ну, ядерный холокост привел бы его к полной остановке, но Дилберт и его галстук были бы наименьшим из ваших беспокойств в этот момент.

Рассматривали ли вы использование встроенной системы?Вы используете компьютер общего назначения и ОС, чтобы делать только одно.Это было бы более экономичным и большим опытом для реализации этого с использованием Arduino или даже некоторого GP-DSP, такого как Blackfin от Analog Devices.Вы все еще можете программировать на C / C ++ и даже иметь встроенную ОС, такую ​​как ucLinux.Гораздо дешевле и прочнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...