11

我运行嵌入在 Java 程序中的 JADE,即不使用 java jade.Boot .... 现在我想停止 JADE 系统,但我没有找到好的方法来做到这一点。我可以使用 System.exit() 退出整个程序,但这不是我想要做的。

我尝试了几种不同的方法,并成功停止了我的代理行为,但有几个线程继续运行:AMS、DF、Web 服务器、JADE Timer 调度程序、几个 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 测试。

任何想法如何做到这一点?

4

2 回答 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) {}
于 2011-08-11T13:45:50.720 回答
0

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

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

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

于 2021-12-17T15:54:00.233 回答