Java и событийное Программирование

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

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

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

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

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

но я ищу, может ли Java eventing дать лучшее решение.

обновление 1:

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

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 eventing и я решить мою проблему, не могли бы вы сказать мне, как java eventing войдет в картину здесь? я хочу, чтобы пользователь инициировал событие.

2 ответов


Мне трудно понять, что именно вы пытаетесь сделать, но у меня есть опыт работы с 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-приложения, работающие в других JVMs на других компьютерах в сети. Возможно, ты захочешь взглянуть на Джеда. (http://code.google.com/p/jed-java-event-distribution), который делает именно это.

надеюсь, это поможет, Боб!--2-->


все, что делает eventing library, это отправка событий слушателям. Помимо этого вам нужно что-то, чтобы действительно создать события.

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

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

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

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