跳转到内容

EQUIP4J

0% developed
来自维基教科书,开放世界中的开放书籍

这是 Equip4j 的教程。简而言之,equip4j 实现(不仅仅是)数据空间的概念。数据空间可以被解释为分布式计算的中间件解决方案。

Equip4j 是一个为 Equator 项目 (http://www.equator.ac.uk/) 开发的 Java 库。源代码可以在 http://sourceforge.net/projects/equip 中找到。

它是如何工作的?

[编辑 | 编辑源代码]

基本上,equip4j 提供了一个利用数据空间概念的 Java 库。查看 equip4j 工作方式的一种方法是通过软件组件的三个角色:服务器、消费者和生产者。消费者可以对任何类型的元组 (1) 进行订阅,生产者将元组(或对它们的更新)发布到服务器 (2),而服务器处理并通知消费者有关新元组的信息 (3,4)。任何软件组件都可以承担消费者或生产者的角色。

为了简化实现,Equip4j 提供了用于通过 JavaBean 框架处理、管理和分发元组的库。此处提供的文档大多涉及围绕 equip4j 中此特定 JavaBean 支持的库。

Tuple 类

[编辑 | 编辑源代码]

元组“是一个有限的元素序列”或元素(类似于数据库中的行)。在 equip4j 中,元组是一个用于在生产者和消费者之间交换信息的泛型类。在 equip 中,元组有两个子类:Tuple 和 TupleEvents。

equip 元组中的元素存储在一个数组中。创建元组的方式如下

Tuple message =new TupleImpl(new StringBoxImpl("Chat"),
                             new StringBoxImpl("Peter"),
                             new StringBoxImpl("Hello!"),
                             new StringBoxImpl("Jane"));

此元组可以表示 Peter 向 Jane 发送的聊天消息(Hello)。由于元组的元素在数组中,元素的顺序保持不变,并且可以有意义,即第二个元素是“消息发送者”。注意元组中的每个元素都是 ValueBase 类的子类,在示例中,StringBoxImpl 用于发送字符串。此外,Tuple 类还有两个其他字段:nameid,元素存储在 fields 字段中。

当前的构造函数允许一定数量的最大字段。如果您需要超过当前最大数量的字段(在 fields 中),可以按照以下步骤直接操作 fields 字段

   Tuple message =new TupleEventImpl();
   message.fields = new ValueBase[12];
   message.fields[0] = new StringBoxImpl("Chat");
   message.fields[1] = new StringBoxImpl("Peter");
   ...
   message.fields[10]= new StringBoxImpl("Hello!"),
   message.fields[11]= new StringBoxImpl("Jane");

关于字段中的空值,以下是一些可能性

  
   message.fields[0] = new StringBoxImpl("Chat");       /* Correct*/
  
   message.fields[1] = new StringBoxImpl(null);         /* Correct but DANGEROUS */
     	
   message.fields[9] = null;                            /* Correct and recommended*/

DataspaceBean 类

[编辑 | 编辑源代码]

DataspaceBean 类代表服务器,允许程序(消费者和生产者)与服务器(作为代理)通信。创建此类的实例的形式如下

...
DataspaceBean mydataspace = DataSpaceBean();
... 
mydataspace.setDataspaceUrl("equp://127.0.0.1:9123");
...

在示例中,假设有一个 equip 服务器在 IP 地址 127.0.0.1(本地机器)和端口 9123 上运行。

在服务器中发布新 Tuple 的形式如下

...
/* first create the tuple*/
Tuple message =new TupleImpl(new StringBoxImpl("Chat"),
                             new StringBoxImpl("Peter"),
                             new StringBoxImpl("Hello!"),
                             new StringBoxImpl("Jane"));
/* then, put name and id */
message.id=mydataspace.allocateId();
message.name="chat_message";
 
/* finally add the tuple to the dataspace */
... 
mydataspace.add(message);
...

如果要添加的元组是“事件”,则必须按照以下步骤添加到数据空间

...
mydataspace.addEvent(myeventTuple);
...

在您不想在添加事件时生成警告的情况下,初始化事件的元数据字段是一个好主意。初始化元数据(仅作为示例)的两种形式

...
this.localGUID=mydataspace.allocateId();
...
myeventTuple.initMetadata(localGUID,false,true);
  
//or
  
myeventTuple.initMetadata(null,true,false);
...

DataspaceEventListener 接口

[编辑 | 编辑源代码]

此接口必须由消费者实现,如果消费者希望收到有关事件的通知,例如,服务器中发布的新元组。必须实现 dataspaceEvent(DataspaceEvent event) 方法来处理事件。调用时,dataspaceEvent 会将 DataspaceEvent 类作为参数接收。DataspaceEvent 类允许检索生产者发布的元组。

实现侦听器的形式如下

...
class MyListener implements DataspaceEventListener (...)
...
 
public void dataspaceEvent( DataspaceEvent myevent)
...
/* process my event in case of AddEvent */
  if (myevent.getEvent() instance of AddEvent) {
     Tuple mytuple = (Tuple) event.getAddItem();
...

请注意,存在多种类型的事件。

最后,订阅“AddEvent”类型事件的形式如下。

MyListener mylistener(...); 
...
/* the mytupletemplate represents the kind of tuples mylistener wants to consume*/
/* nulls can be used as wildcards                                     */
Tuple mytupletemplate = new Tupleimpl (new StringBoxImpl("Chat"),new StringBoxImpl("Jane"), null, null); 
mytupletemplate.name="chat_message";
...
mydataspace.addDataspaceEventListener(mytupletemplate,false, mylistener)

上面的代码允许 mylistener 在生产者发布(添加)元组时接收通知(事件),其中前两个元素数组中的第一个元素包含“Chat”和“Jane”,name 等于“chat_message”,其他字段中的任何其他信息(同样,空值是一个通配符)。

使用 equip

[编辑 | 编辑源代码]

运行 equip 作为服务器

[编辑 | 编辑源代码]

运行 equip 作为服务器的最简单方法如下

java -cp <equip-jar-path> equip.data.server equip://<ip-address>:<portnumber>

作为具体示例,在当前机器上运行 equip(equip4j.jar 必须放置在执行命令的目录中)

java -cp equip4j.jar equip.data.server equip://:9123

浏览 equip 服务器

[编辑 | 编辑源代码]

Browser2 类允许浏览数据空间(了解数据空间中发生了什么,并了解您的程序对数据空间的操作,例如事件、添加项目等是否正常工作)。调用浏览器的形式如下

java -cp <path to equip4j.jar> equip.data.Browser2 equip://<ip-address>:<portnumber>

Equip 外部资源

[编辑 | 编辑源代码]

- equip4j Javadocs 链接 http://www.crg.cs.nott.ac.uk/~cmg/Equator/Downloads/docs/equip4j/javadoc/index.html(最重要的类位于包 equip.data 和 equip.data.beans 中)。
- 可以从 http://193.137.8.61/equip4jchatexample.zip 下载聊天程序示例
- EQUATOR 项目页面 http://www.equator.ac.uk/
- EQUIP 和 ECT 源代码 http://sourceforge.net/projects/equip
- Chris Greenhalgh 的 Equator 项目页面 http://www.crg.cs.nott.ac.uk/~cmg/Equator/

参考文献

[编辑 | 编辑源代码]

- 维基百科元组定义:元组

华夏公益教科书