Java 如何在代理类的公共方法中发送ACLmessage
我对Jade和multi-agent系统相当陌生。 我正在尝试构建一个包含多个代理的系统,这些代理必须通过发送ACL消息进行通信。我已经阅读了有关如何构建代理类的结构的文档 这是我的密码:Java 如何在代理类的公共方法中发送ACLmessage,java,agents-jade,Java,Agents Jade,我对Jade和multi-agent系统相当陌生。 我正在尝试构建一个包含多个代理的系统,这些代理必须通过发送ACL消息进行通信。我已经阅读了有关如何构建代理类的结构的文档 这是我的密码: public class ServerCommunicationAgent extends Agent { public static String serverAddress = "http://LO-LESTER-077:8080"; private static final long s
public class ServerCommunicationAgent extends Agent {
public static String serverAddress = "http://LO-LESTER-077:8080";
private static final long serialVersionUID = 1L;
protected void setup() {
System.out.println(getLocalName() + ": correctly started");
boolean state = true;
// A Class that has a socket with my server
CommunicationService.getInstance().ServerCommunicationAgent(state);
// Sends a tick every millisecond
addBehaviour(new TickerBehaviour(this, 10000) {
private static final long serialVersionUID = 1L;
@Override
protected void onTick() {
ACLMessage message = new ACLMessage(ACLMessage.INFORM);
message.setContent("OK");
message.setLanguage("English");
message.setOntology("Test Dialogue");
message.setConversationId("TestID");
message.addReceiver(new AID("SecurityAgent", AID.ISLOCALNAME));
send(message);
}
});
}
// This method is called from CommunicationService when i have a response
public void LaunchServiceAgent(final String Agent, final String Location){
System.out.println(": Agent received service request: " + Agent + " in " + Location + " and has to call " + Agent + Location);
addBehaviour(new Behaviour(this) {
private static final long serialVersionUID = 1L;
@Override
public void action() {
ACLMessage messages = new ACLMessage(ACLMessage.INFORM);
messages.setContent("Hello world");
messages.setLanguage("English");
messages.setOntology("Test Dialogue");
messages.setConversationId("TestID");
messages.addReceiver(new AID(Agent + Location, AID.ISLOCALNAME));
send(messages);
}
@Override
public boolean done() {
return false;
}
});
}
正如我在代码中解释的,当代理启动时,它会向我的服务器发送一条消息。它通过LaunchServiceAgent方法接收消息。我正确地收到了邮件,但无法使用ACLMessage将其发送给其他代理。我认为我的代码是正确的,因为我的行为很好
所以我的问题是,如何正确地从我的方法向另一个代理发送消息
感谢您的回复:)您必须在发送邮件时设置一个模板,并将其与会话id匹配。接收邮件的代理必须检查模板是否匹配。您的LauchServiceAgent(…)方法永远不会返回,因为您总是在done()方法中返回“false”。这可能会给您带来麻烦,因为您的方法永远不会结束,它会被卡住 解决这个问题的一个选项是使用OneShotBehavior(),它会自动执行一次并自动完成。另一个选项是在成功发送消息之后[在“发送(消息);”之后]立即将变量设置为“true”,并使done()返回此变量
建议:尽可能使用预定义的行为类型来避免一些麻烦[OneshotBehavior、SimpleBehaviour等]。在消息发送后将变量设置为true正是我所做的。感谢您的回复=)如果您在done()方法中返回'true'变量,那么应该可以。