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