停止JADE系统(Java代理)

11
我在Java程序中运行嵌入式JADE,即不使用java jade.Boot ...。 现在我想停止JADE系统,但是我没有找到好的方法来做到这一点。 我可以使用System.exit()退出整个程序,但这不是我想要的。
我尝试了几种不同的方法,并成功停止了代理行为, 但是还有一些线程继续运行:AMS、DF、Web服务器、JADE定时调度程序、几个Deliverer线程等。
这是我当前关闭方法的样子:
  @Override
  public void shutdown() {
    // TODO This does not work yet..
    try {
      for (WeakReference<AgentController> acr : agents) {
        AgentController ac = acr.get(); // jade.wrapper.AgentController 
        if ( ac != null ) ac.kill();
      }
      container.kill(); // jade.wrapper.AgentContainer
      Runtime.instance().shutDown(); // jade.core.Runtime
    } catch ( StaleProxyException e ) {
      e.printStackTrace();
    }
  }

我想这样做的原因是我有一些用于我的代理系统的JUnit测试。

有什么想法可以实现吗?

2个回答

8
您可以请求AMS以以下方式停止平台:
Codec codec = new SLCodec();    
Ontology jmo = JADEManagementOntology.getInstance();
getContentManager().registerLanguage(codec);
getContentManager().registerOntology(jmo);
ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
msg.addReceiver(getAMS());
msg.setLanguage(codec.getName());
msg.setOntology(jmo.getName());
try {
    getContentManager().fillContent(msg, new Action(getAID(), new ShutdownPlatform()));
    send(msg);
}
catch (Exception e) {}

我仍然有几个Deliverer实例在运行(jade.core.messaging.MessageManager$Deliverer)。这些实例的问题在于,我无法杀死它们正在运行的线程,因为它们忽略了InterruptedException... - daniel kullmann

0

您可以使用以下命令关闭整个JADE平台:

try {
    this.getContainerController().getPlatformController().kill(); 
}
catch (final ControllerException e) {
    System.out.println("Failed to end simulation.");
}

"this" 指的是一个代理类对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接