Перевод документации к системе 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