Java 在ACLMessage中发送参数

Java 在ACLMessage中发送参数,java,agents-jade,Java,Agents Jade,我从一个代理向另一个代理发送消息 msg.setContent(“价格:30,计数:1”) 之后,我需要手动解析它。有没有更方便的方法在不转换为字符串的情况下传输参数?例如,发送一些容器。您最好使用本体。这是一种更方便的方式。 比如说 创建您的容器: public class ParameterConcept implements Predicate{ private Long price; private Long count; ... getters and sett

我从一个代理向另一个代理发送消息

msg.setContent(“价格:30,计数:1”)


之后,我需要手动解析它。有没有更方便的方法在不转换为字符串的情况下传输参数?例如,发送一些容器。

您最好使用本体。这是一种更方便的方式。 比如说

创建您的容器:

public class ParameterConcept implements Predicate{
    private Long price;
    private Long count;
    ... getters and setters
}
创建您的本体:

public class YourOntology extends Ontology {
    public static final String NAME = "YourOntology";
    private static Ontology instance = new YourOntology();
    public static Ontology getInstance() {
        return instance;
    }

    private YourOntology() {
        super(NAME, BasicOntology.getInstance());

        add(new PredicateSchema("ParameterConcept"), ParameterConcept.class);
        PredicateSchema parameterConcept = (PredicateSchema) getSchema("ParameterConcept");
        parameterConcept.add("price",         (PrimitiveSchema) getSchema(BasicOntology.INTEGER), ObjectSchema.MANDATORY);
        parameterConcept.add("count",         (PrimitiveSchema) getSchema(BasicOntology.INTEGER), ObjectSchema.MANDATORY);
    }
}
按如下方式注册您的本体(YourAgent.java):

创建如下消息:

ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
...
msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
msg.setOntology(YourOntology.NAME);
...
try {
    agent.getContentManager().fillContent(msg, parameterConcept);
} catch (Exception e) {
     throw new RuntimeException("cannot fill message.", e);
}
ContentManager cm = myAgent.getContentManager();
ContentElement contentElement = cm.extractContent(aclMessage);
ParameterConcept pc = (ParameterConcept) contentElement;
现在您可以像这样解析消息(另一个代理的代码):

ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
...
msg.setLanguage(FIPANames.ContentLanguage.FIPA_SL0);
msg.setOntology(YourOntology.NAME);
...
try {
    agent.getContentManager().fillContent(msg, parameterConcept);
} catch (Exception e) {
     throw new RuntimeException("cannot fill message.", e);
}
ContentManager cm = myAgent.getContentManager();
ContentElement contentElement = cm.extractContent(aclMessage);
ParameterConcept pc = (ParameterConcept) contentElement;

或者您可以将json与第三个json库一起使用。

您可以使用
msg.setContentObject()
方法,并使用实现可序列化接口的类传递对象。

实际上,我无法填充消息。IDEA表示它无法解析方法的fillContent(jade.lang.acl.ACLMessage,market.Offer)。如果我尝试将其强制转换为(ContentElement),则会发生错误java.lang.RuntimeException:无法创建填充消息。请尝试键入“public class ParameterConcept implements Predicate”,谢谢。但它仍然有一个运行时错误。错误:代理使用者1未正确终止而死亡!!!代理使用者的状态为2***未捕获异常***java.lang.RuntimeException:无法创建填充消息。能否在“抛出新RuntimeException(“无法创建填充消息”);”上设置断点并附加stacktrace?是的,确定。***代理使用者的未捕获异常***java.lang.RuntimeException:无法创建填充消息。jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1585)中的jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1585)中的jade.core.Agent.run(Agent.java:1524)中的jade.core.behaviors.behavior.actionWrapper(behavior.java:344)