Java и событийное Программирование
Я использую javaeventing для записи четной управляемой оболочки для доступа к базе данных. Итак, мой вариант использования:
- открыть консоль в командной строке.
- теперь оболочка подключается к базе данных и прослушивает входящую команду.
- , когда он получает команду, выполняет ее и возвращает требуемый результат.
Теперь, как я могу избежать 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, это отправка событий слушателям. Помимо этого вам нужно что-то, чтобы действительно создать события.
в этом случае вам понадобится код для чтения консоли и генерации событий, Вам понадобится что-то еще, чтобы "слушать" БД и генерировать события из этого (предполагая, что у вас есть асинхронные события БД, которые вы ищете, такие как изменения таблицы или строки).
этот код еще нужно написать.
и если эта структура предоставляет вам такие служебные классы, вам придется написать это самостоятельно, и эти классы, вероятно, будут такими, как вы описываете.
но все эти классы находятся на краю системы, управляя данными. Остальная часть вашего кода может быть полностью основана на событиях.