ACLMessage 中发送参数
Send parameters in ACLMessage
我从一个代理人向另一个代理人发送消息
msg.setContent("price: 30, count: 1");
之后我需要手动解析它。有没有更方便的方式传递参数而不用转成字符串?例如,发送一些容器..
你最好使用ontology。这是更方便的方式。
例如。
创建容器:
public class ParameterConcept implements Predicate{
private Long price;
private Long count;
... getters and setters
}
创建你的 ontology:
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);
}
}
像这样注册你的 ontology (YourAgent.java):
private static final Codec codec = new SLCodec();
private static final Ontology ontology = YourOntology.getInstance();
protected void setup() {
getContentManager().registerLanguage(codec, FIPANames.ContentLanguage.FIPA_SL0);
getContentManager().registerOntology(ontology);
}
像这样创建消息:
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()
方法并使用 class 传递实现了 Serializable 接口的对象。
我从一个代理人向另一个代理人发送消息
msg.setContent("price: 30, count: 1");
之后我需要手动解析它。有没有更方便的方式传递参数而不用转成字符串?例如,发送一些容器..
你最好使用ontology。这是更方便的方式。 例如。
创建容器:
public class ParameterConcept implements Predicate{
private Long price;
private Long count;
... getters and setters
}
创建你的 ontology:
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);
}
}
像这样注册你的 ontology (YourAgent.java):
private static final Codec codec = new SLCodec();
private static final Ontology ontology = YourOntology.getInstance();
protected void setup() {
getContentManager().registerLanguage(codec, FIPANames.ContentLanguage.FIPA_SL0);
getContentManager().registerOntology(ontology);
}
像这样创建消息:
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()
方法并使用 class 传递实现了 Serializable 接口的对象。