跳轉到內容

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/

參考文獻

[編輯 | 編輯原始碼]

- 維基百科元組定義:元組

華夏公益教科書