Java и событийно-ориентированное программирование - PullRequest
8 голосов
/ 08 февраля 2011

Я использую javaeventing , чтобы написать даже управляемую оболочку для доступа к базе данных. Итак, мой вариант использования:

  1. открыть оболочку в командной строке.
  2. Теперь оболочка подключается к базе данных и прослушивает поступающую команду.
  3. когда он получает команду, он выполняет ее и возвращает требуемый результат.

Теперь, как мне избежать петли while(!exit){ //do stuff } здесь? Как правильно использовать события Java?

Прямой путь может быть:

while(!exit)
{
   exit = myClass.execute("command"); //when command is exit, return true.
}

Но я смотрю, может ли Java-событие дать лучшее решение.

Update1:

Вот что я пытаюсь реализовать:

1 Мое приложение представляет собой оболочку (например, оболочку mongodb) для опробования базы данных значений ключей.
2 Простой код:

init(); //Initialize the connection with database
while(!exit)
{  
    //exit = myClass.execute("put(5)"); //This returns false  
    exit = myClass.execute("exit"); //returns true, i.e. the user wants to exit the shell
}

Теперь я не вижу использования java-событий, и я решил свою проблему. Скажите, пожалуйста, КАК здесь будут отображаться события java? Я хочу, чтобы пользователь вызвал событие .

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Мне трудно понять, что именно вы пытаетесь сделать, но у меня есть опыт работы с javaEventing, и я постараюсь помочь вам как можно лучше.Уилл Хартунг прав, вам нужно где-то создавать свои события.Поэтому, если я вас правильно понимаю, вы хотите запустить ваше java-приложение из командной строки, затем вы хотите подключиться к базе данных и посмотреть, какая команда будет вставлена, а при вставке вы захотите создать событие.Это правильно?

В этом случае вам, вероятно, потребуется выполнить некоторый опрос базы данных, поскольку обычные базы данных не могут уведомлять ваше приложение, когда выполняется какое-либо условие.Это означает, что вам, вероятно, понадобится условие while {}, в котором вы выполняете запросы к базе данных, ожидая результирующий набор, содержащий искомую команду.Когда найдено, вы можете создать событие, подобное этому:

Class ReceivedCommandEvent extends EventManager.EventObject {}   // define your event   

while (command==null) {
  command = pollDataBaseForCommand();  //poll your databae for commands
  waitForSomePeriod(); 
}

EventManager.triggerEvent(this, new ReceivedCommandEvent(command));     //trigger your event, with the command as payload

Теперь любые другие потоки, прослушивающие ваше событие (ReceivedCommandEvent), получат событие и смогут извлечь команду из полезной нагрузки события.

Теперь возникает вопрос: почему вы все равно хотите использовать базу данных для передачи команд?Вы просто используете его для связи между приложениями?Если ваше другое приложение также написано на Java, вы можете рассмотреть возможность использования распределенных событий, позволяющих одному java-приложению отправлять события java-приложениям, работающим в других JVM, на других машинах в сети.Возможно, вы захотите взглянуть на JED (http://code.google.com/p/jed-java-event-distribution),, который делает именно это.

Надеюсь, это поможет, Боб

2 голосов
/ 08 февраля 2011

Все, что делает библиотека событий, это отправляет события слушателям.Кроме того, вам нужно что-то, чтобы фактически СОЗДАТЬ события.

В этом случае вам потребуется код для чтения консоли и генерации событий, вам может понадобиться что-то еще, чтобы «прослушивать» БД и генерировать события изчто (при условии, что у вас есть асинхронные события БД, которые вы ищете, такие как изменения таблиц или строк).

Этот код еще нужно написать.

И если эта структура не предоставляет вам такиеслужебные классы, вам придется написать это самостоятельно, и эти классы, скорее всего, будут такими же, как вы описываете.

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

...