EQUIP4J
维基教科书用户认为此页面应该拆分为具有更窄子主题的较小页面。 您可以通过将此大页面拆分为较小的页面来提供帮助。请确保遵循命名策略。将书籍分成更小的部分可以提供更多重点,并允许每个部分都做好一件事,这对每个人都有益。 |
这是 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 支持的库。
元组“是一个有限的元素序列”或元素(类似于数据库中的行)。在 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 类还有两个其他字段:name
和 id
,元素存储在 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 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);
...
此接口必须由消费者实现,如果消费者希望收到有关事件的通知,例如,服务器中发布的新元组。必须实现 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 作为服务器的最简单方法如下
java -cp <equip-jar-path> equip.data.server equip://<ip-address>:<portnumber>
作为具体示例,在当前机器上运行 equip(equip4j.jar 必须放置在执行命令的目录中)
java -cp equip4j.jar equip.data.server equip://:9123
Browser2 类允许浏览数据空间(了解数据空间中发生了什么,并了解您的程序对数据空间的操作,例如事件、添加项目等是否正常工作)。调用浏览器的形式如下
java -cp <path to equip4j.jar> equip.data.Browser2 equip://<ip-address>:<portnumber>
- 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/
- 维基百科元组定义:元组