Ticker Behavior не удаляет контейнер в JADE

Я написал код для того, чтобы 2 агента со стороны сервера общались с 2 агентами со стороны клиента. Первоначально клиентский агент 1 отправляет сообщение стартеру агента сервера, который затем запускает 2 агента на стороне сервера. Теперь я добавил поведение тикера в стартер сервера, чтобы проверить, активен ли клиентский агент 1 или нет. Я завершил работу терминала агентов клиента, чтобы проверить, правильно ли работает тикер. Фактически поведение тикера должно идентифицировать, что клиентские агенты убиты, и поэтому он должен также убивать серверные агенты. Но это не работает. Стартовый код сервера:

    package com.poc.delete;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import javax.swing.JOptionPane;

import jade.core.AID;
import jade.core.Agent;
import jade.core.Profile;
import jade.core.ProfileImpl;
import jade.core.Runtime;
import jade.core.behaviours.Behaviour;
import jade.core.behaviours.TickerBehaviour;
import jade.lang.acl.ACLMessage;
import jade.mtp.MTPException;
import jade.wrapper.AgentController;
import jade.wrapper.ContainerController;
import jade.wrapper.ControllerException;

public class ServerCreator extends Agent{
    String a[];
     protected void setup() {
                 addBehaviour(new Behaviour() {
                    @Override
                    public void action() {
                        ACLMessage msg1 = receive();
                        if(msg1!=null && (msg1.getSender().getLocalName()!="ams")) {
                            System.out.println("Got it");
                            System.out.println("msg from: "+msg1.getSender());
                            String s = msg1.getContent().toString();
                            a=s.split(",");
                            String s1 = a[0];
                            System.out.println(a.length);
                            String s2 = a[1];
                            System.out.println("This is "+a[4]+"\n");
                            JOptionPane.showMessageDialog(null, msg1.getContent());
                            ServerInit si = new ServerInit();
                            MapList m = new MapList(a[0],a[1],a[2],a[3],a[4]);
                            m.Add(m);
                            si.createServer(a[0],a[1],a[2],a[3],a[4]);
                            System.out.println("it is dead with "+MapList.mp.get(0));


                            System.out.println("size : "+MapList.mp.size());

                        }
                    }



                    @Override
                    public boolean done() {
                        //System.out.println("it is done");
                        return false;
                    }
                });
                 addBehaviour(new TickerBehaviour(this, 20000) {
                      @Override
                      protected void onTick() {
                         ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
                            msg.setContent("Are You There?");
                            System.out.println("the size is : "+MapList.mp.size());

                                Iterator l = MapList.mp.iterator();
                                String port = a[1];
                                //while(l.hasNext()){
                                    try{
                                        if(getContainerController()!=null){
                                            AID dest = new AID(a[2],AID.ISGUID);
                                    dest.addAddresses(a[4]);
                                    msg.addReceiver(dest);

                                    send(msg);
                                        }
                                        else{
                                            String s = "SA1"+a[1]+"@"+a[0]+"1099/JADE";
                                            try {
                                                getContainerController().getAgent(s).kill();
                                                MapList.mp.pollLast();
                                            } catch (Exception e1) {
                                                // TODO Auto-generated catch block
                                                e1.printStackTrace();
                                            }
                                            System.out.println("killed!");

                                        }
                                    }
                                    catch(Exception e){
                                        String s = "SA1"+a[1]+"@"+a[0]+"1099/JADE";
                                        try {
                                            getContainerController().getAgent(s).kill();
                                        } catch (Exception e1) {
                                            // TODO Auto-generated catch block
                                            e1.printStackTrace();
                                        }
                                        System.out.println("killed!");

                                    }
                                //}
                      }
                    });
            }

    public static void main(String[] args) {
        Runtime rt = Runtime.instance(); 
        Profile p = new ProfileImpl();
        ContainerController cc = rt.createMainContainer(p);
        AgentController dummy;
        try {
            dummy = cc.createNewAgent("ServerStarter", "com.poc.delete.ServerCreator", null);
            dummy.start();

            //dummy.kill();
            //cc.kill();
            //System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    
}

Создатель клиентских агентов:

    package com.poc.delete;

import jade.core.Profile;
import jade.core.ProfileImpl;
import jade.core.Runtime;
import jade.wrapper.AgentController;
import jade.wrapper.ContainerController;

public class ServerCaller {


        public static void main(String[] args) {
            Runtime rt = Runtime.instance();
            Profile p = new ProfileImpl();
//          Profile p1 = new ProfileImpl();
            p.setParameter(Profile.MAIN_HOST, "192.168.100.5");
            p.setParameter(Profile.MAIN_PORT, "12344");
            String MTP_Port = "7779";
            String MTP_hostIP = "192.168.100.5"; 
            p.setParameter(Profile.MTPS, "jade.mtp.http.MessageTransportProtocol(http://"+MTP_hostIP+":"+MTP_Port+"/acc)");
            ContainerController cc = rt.createMainContainer(p);
            AgentController c1,c2;
            try {
                c1 = cc.createNewAgent("CA1", "com.poc.delete.ClientAgent1", null);
                c1.start();
                c2 = cc.createNewAgent("CA2", "com.poc.delete.ClientAgent2", null);
                c2.start();

                //dummy.kill();
                //cc.kill();
                //System.exit(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

Теперь сначала я запускаю Северный стартер, а затем запускаю клиентский стартер. Так что обе программы создают агентов на стороне сервера и на стороне клиента. Ошибка, которую я получаю в поведении тикера:

    the size is : 1
Feb 01, 2018 9:49:43 PM jade.mtp.http.KeepAlive$KAConnection close
WARNING: Exception while closing KA connection: java.net.SocketException: Socket closed
Feb 01, 2018 9:49:44 PM jade.core.messaging.MessagingService deliverNow
WARNING: Cannot deliver message to address: http://192.168.100.5:7779/acc [jade.mtp.MTPException: Connection refused: connect - Caused by:  Connection refused: connect]. Trying the next one...
Got itFeb 01, 2018 9:49:44 PM jade.core.messaging.MessageManager$Deliverer run
WARNING: Deliverer Thread Deliverer-04 - Delivery-time over threshold (1120). Receiver = CA1, message size = 394. Delivery details: {}
***  Uncaught Exception for agent ServerStarter  ***

msg from: ( agent-identifier :name ams@192.168.100.5:1099/JADE  :addresses (sequence http://192.168.100.5:7778/acc ))
1
java.lang.ArrayIndexOutOfBoundsException: 1
    at com.poc.delete.ServerCreator$1.action(ServerCreator.java:38)
    at jade.core.behaviours.Behaviour.actionWrapper(Behaviour.java:344)
    at jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1585)
    at jade.core.Agent.run(Agent.java:1524)
    at java.lang.Thread.run(Unknown Source)
ERROR: Agent ServerStarter died without being properly terminated !!!
State was 2

Это получается, когда тикер работает во второй раз (я убил терминал на стороне клиента). Он должен выяснить, что клиент мертв. Но я получаю вышеуказанную ошибку. Пожалуйста, помогите мне.

0 ответов

Другие вопросы по тегам