8

我正在使用javaeventing编写一个偶数驱动的 shell 来访问数据库。所以,我的用例是:

  1. 在命令行中打开 shell。
  2. 现在,shell 连接到数据库并监听传入的命令。
  3. 当它收到一个命令时,它会执行它并返回所需的输出。

现在,我怎样才能避免while(!exit){ //do stuff }这种循环呢?如何正确使用 Java 事件?

直接的方法可以是:

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

但是,我正在寻找 java eventing 是否可以提供更好的解决方案。

更新1:

这是我想要实现的:

1我的应用程序是一个 shell(如 mongodb shell)来尝试一个键值数据库。
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 将如何出现在这里?我希望用户触发事件。

4

2 回答 2

2

事件库所做的只是将事件分派给侦听器。除此之外,您还需要一些东西来实际创建事件。

在这种情况下,您需要代码来读取控制台并生成事件,您可能需要其他东西来“侦听”数据库并从中生成事件(假设您有要查找的异步数据库事件,例如表或行更改)。

该代码仍然需要编写。

除非该框架为您提供此类实用程序类,否则您必须自己编写,并且这些类可能就像您描述的那样。

但是这些类都在系统的边缘,驱动着数据。您的其余代码都可以完全基于事件。

于 2011-02-08T02:33:08.467 回答
2

我发现很难理解你到底想做什么,但我有 javaEventing 的经验,我会尽我所能帮助你。Will Hartung 是正确的,你需要在某个地方创建你的事件。因此,如果我理解正确,您希望从命令行启动您的 java-app,然后您希望连接到数据库并观察要插入的某些命令,并且在插入时,您希望创建一个事件。它是否正确?

在这种情况下,您可能需要对数据库进行一些轮询,因为普通数据库无法在某些条件为真时通知您的应用程序。这意味着您可能需要 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 应用程序向网络中其他机器上的其他 JVM 中运行的 Java 应用程序发送事件。您可能想查看 JED ( http://code.google.com/p/jed-java-event-distribution ),它就是这样做的。

我希望这会有所帮助,鲍勃

于 2011-02-08T16:16:51.227 回答