Перевод документации к системе Bee-gent
(Оригинал http://www2.toshiba.co.jp/rdc/beegent/tutorial/tindex.htm)
Содержание
1. Инсталяция
2. Hачало работы
2.1.
Пример программы «Hello World!»
2.2.
Кодирование и выполнение “Hello
World” программы
2.3.
Кодирование агента-посредника
2.4.
Кодирование агента-упаковщика
3. Язык коммуникации агентов (ACL)
4. Учебник по системе Bee-gent
2. Hачало работы
2.1. Пример программы «Hello World!»
Пример
программы «Hello World»
состоит из двух частей: агента - упаковщика (программное средство создания
системной оболочки для стандартизации внешних обращений и изменения
функциональной ориентации действующей системы) AW1 и агента – посредника Beel.
Первое, AW1 создает Вееl на той же самой виртуальной машине Java. Второе, Beel
требует, чтобы AW1 показал сообщение "Hello World!".
2.2.
Кодирование и выполнение “Hello
World” программы
Следующие объяснения даются в предположении, что поставляемый пакет инсталлируется на С:\Вее. Создайте где-либо каталог Hello World, например С:\Вее\examples\Hello World.
В каталоге Hello World создайте xml директорию. Также в xml директории создайте .xml файл и .dtd файл для каждого перформатива, который будет использоваться. Обычно нужно только копировать файлы, используемые в примерах программ поставляемого пакета (например, директория C:\Bee\examples\contact_net\AgentWrapper\xml в C:\Bee\examples\HelloWorld полностью).
Создайте каталог conf в каталоге Hello World. Создайте также mime.types файлы, содержащие список mime типов, используемые упаковщиком и Name2Address.csv файлы, содержащие таблицу соответствия имен агентов-упаковщиков и URL. Обычно нужно только копировать файлы, используемые в примерах программ поставляемого пакета (например, директория C:\Bee\examples\contact_net\AgentWrapper\conf в C:\Bee\examples\HelloWorld полностью).
Редактировать файл Name2Address.csv в каталоге conf. Вы должны определить соответствие имен агентов – упаковщиков и URL. В этом примере, описание, следующее далее, такое, потому что агент-упаковщик, используемый в программе " HelloWorld", один и называется AW1.
AW1,http://localhost:9441/
Создайте исходные файлы агента-посредника и агента-упаковщика, соответственно Beel.java AW1.java (процесс кодирования будет описан позднее).
Проверьте значение CLASSPATH. Подробнее, следует проверить, содержит ли CLASSPATH Bee03s.jar и IPEditor03s.jar, которая присоединяет поставляемый пакет Bee-gent и каталог Hello World.
CLASSPATH=С:\Bee\Bee03s.jar;
C:\Bee\IPEditor03s.jar;%CLASSPATH%
CLASSPATH=С:\Вее\examples\Hello World;%CLASSPATH%
Компилируйте исходные файлы Beel.java и AW1.java.
>cd С:\Вее\examples\Hello World
>javac AW1.java Beel.java
Выполните агента-упаковщика AW1.
>java AW1
Talking with Beel …
Hello World!
>
Снова проверьте CLASSPATH, если ошибки, неотслеживаемые исключения случаются толькопо причине неправильной настройки CLASSPATH.
2.3.
Кодирование агента-посредника
Агент-посредник определяется телом класса и состояниями классов. Действия агента-посредника определяются на основе текущих состояний и правил перемены состояний. Первое, следует зарегистрировать все имена состояний, в которых агент-посредник может находиться. Далее, определить класс для каждого состояния. Затем специфицировать действия, которые д.б. выполнены в состоянии (включая собственные процессы агента- посредника и взаимодействия с агентами - упаковщиками). Также определить следующие состояния агента-посредника, в которые агент-посредник переходит в соответствии с результатами выполнения действий. Т. к. агент-посредник начинает свои действия из состояния "unit", необходимо определить класс unit. Агент- посредник заканчивает выполнение всех своих действий, когда входит в состояние "end". Поэтому нужно определить класс end
Приводится состояние класса “INIT” в программе "Hello World".
Определение класса
тела агента
Пример показывает основу определения тела агента-посредника. Строка 9 определяет имя, что имя агента-посредника Bee1. В системе Bee-gent следует определять состояния агента-посредника как классы и регистрировать их экземпляры методом addIPStates() (строка 13). Если есть более, чем одно состояние, метод addIPStates() должен быть вызван для каждого состояния.
1 import
java.io.*;
2
import java.net.*;
3
import java.util.*;
4
5
import com.toshiba.beegent.*;
6
import com.toshiba.beegent.util.*;
7
import com.toshiba.beegent.xml.*;
8
9
public class Bee1 extends Bee implements I_Bee{
10
11
public void init() throws InstantiationException{
12
13
addIPStates(new BeeIPStateINIT());
14
15
//addPublicIPStates();
16
17
}// init
18
19 }// Bee1
20
Определение класса
состояния INIT
Состояния определяются в виде классов. В следующем примере класс BeeIPStateINIT(), объявленный в строке 13 пред. примера, определяется начиная с 21 строки. В конструкторе определяются пред и пост условия. Предусловие - это условие, которое должно быть выполнено агентом в текущем состоянии для того, чтобы выполнить действия определенные классом состояния. Неодходимые предусловия должны быть определены в конструкторе. Предусловие в строке 24 означает, что текущее состояние – "INIT".
Агент-посредник начинает свою деятельность из состояния "INIT". Следовательно, необходим как минимум один класс, предусловие которого "INIT".
С другой стороны, постусловие определяет следующее за выполнением действия состояние. Может определяться в конструкторе и в действии. Постусловием определяется обычно в действии, если следующее состояние зависит от результата действия в текущем состоянии и определяется в конструкторе в других случаях. В нижеследующем примере постусловие определяется в определении действия.
Действие определяется после определения конструктора (строка 27).
21 class BeeIPStateINIT extends
BeeIPState implements I_BeeIPState{
22
23 BeeIPStateINIT(){
24
setPrecond("INIT");
25 }// constructor
26
27 public void action(){
28
Отправление XML/ACL сообщений
Агенты-посредники и агенты-упаковщики общаются используя язык коммуникации агентов (ACL). В Bee-gent агенты используют XML/ACL, в котором логическая структура языка коммуникации описывается на XML. Типичный пример XML/ACL сообщения показан на рисунке ниже. В строке 30 создается экземпляр XML/ACL сообщения. В строках 31-39 определяются теги XML/ACL сообщения. Смотрите файл .dtd каждого перформатива как типы тэгов отличаются в зависимости от перформативов. Смотрите также Руководство по ACL, для того чтобы научиться использовать перформативы. Метод sendXML() используется для того, чтобы отправить XML/ACL сообщение. Рекомендовано вызывать этот метод в условии оператора if для обработки ошибок неудачного отправления сообщений.
29 // Send XML/ACL
30 XmlAcl xs = new XmlAcl();
31
xs.setTag2Value("performative", "request");
32
xs.setTag2Value("sender"
, "Bee1");
33
xs.setTag2Value("receiver"
, "AW1");
34
xs.setTag2Value("action"
, "say");
35
xs.setTag2Value("actor"
, "AW1");
36
xs.setTag2Value("args"
, "Hello World!");
37
xs.setTag2Value("protocol"
, "");
38
xs.setTag2Value("reply-with"
, "");
39
xs.setTag2Value("ontology"
, "");
40 if(!sendXML(xs)){
41 setPostcond("END");
42 return;
43 }
44
Спецификация постусловий
Постусловия предопределяют состояние после выполнения действия. Постусловия определяются с помощью метода setPostcond(). В строке 46, определяется состояние “END”. Это состояние заканчивает все смены состояний. В общем, Это возможность перейти в другое состояние, в зависимости от результата выполнения действий.
45 // Post
46 setPostcond("END");
47
48 }// action
49
50 }// BeeIPStateINIT
2.4.
Кодирование агента-упаковщика
Агент-упаковщик также определяется содержимым класса, точно также как и агент-посредник. Для этого агента также необходимо определить класс состояния "INIT" и класс состояния "END" для завершения его деятельности.
В программе "Hello World" имеется только один класс состояния "INIT".
Определение класса
Следующий ниже пример показывает основу определения тела агента-упаковщика. Строка 9 определяет имя этого агента как AW1. В Bee-gent следует определить агента упаковщика как класс и объявлять его экземпляры методом addIPStates() (строка 14). Если есть более чем одно состояние, метод addIPStates() следует вызывать для каждого отдельного состояния.
1 import
java.io.*;
2
import java.net.*;
3
import java.util.*;
4
5
import com.toshiba.beegent.*;
6
import com.toshiba.beegent.util.*;
7
import com.toshiba.beegent.xml.*;
8
9
public class AW1 extends AgentWrapper{
10
11
public static void main(String[] argv) throws Exception{
12
13
AW1 aw1 = new AW1();
14
aw1.addIPStates(new AW1IPState1());
15
16 aw1.startIP();
17
18 }// main
19
20 }// AW1
21
Определение класса
состояния "INIT"
Состояния определяются в виде классов. В примере, следующем ниже, класс AW1IPState1 был объявлен в строке 22. В конструкторе, пред и пост условия определены аналогично тому, как для агента-посредника. Предусловие определяется как "INIT" и постусловие определяется как "END" в строках 25 и 26. После определения конструктора определяются действия.
22 class AW1IPState1 extends AwrIPState{
23
24 AW1IPState1(){
25 setPrecond("INIT");
26
setPostcond("END");
27
}
28
29
public void action(){
30
Создание
агента-посредника Bee1
Для создания агента посредника используется метод createBee(). Имя класса агента-посредника определяется в аргументах. Строка 35 определяет имя класса Bee1 агента-посредника, определенный в разделе 3. Когда вызывается createBee(), необходимо обрабатывать исключения с помощью try и catch.
31
System.out.println("Talking with Bee1...");
32
33 // Create Bee
34
try{
35
createBee("Bee1");
36
}catch(Exception e){
37
System.out.println("Failed to create Bee.");
38 return;
39 }
40
Получение XML/ACL
сообщений
Пример показывает обычное получение XML/ACL сообщения. Первое, агент-упаковщик ждетприбытия сообщения с помощью метода waitXML() в строке 42. Аргумент метода waitXML() означает время ожидания (значение 0 означает ждать постоянно). По прибытии сообщения упаковщик вызывает метод getXML() и забирает сообщение с вершины очереди сообщений (строка 43).
Чтобы получить содержимое тегов XML/ACL сообщения, используется метод get2Tag2Value(). Строки с 46 по 55 определяют процесс для случая, в котором перформативом является "request".
41
// Receive XML/ACL
42
while (waitXML(0)){
43
XmlAcl xa = getXML();
44
String perf = xa.getTag2Value("performative");
45
46
if (perf.equals("request")){
47
String action = xa.getTag2Value("action");
48
String args =
xa.getTag2Value("args");
49
50
if (action.equals("say")){
51 System.out.println(args);
52 break;
53
}
54
55
}
56
57
}
58
59
}// action
60
61
}// AW1IPState1