Отправить параметры в ACLMessage

Я отправляю сообщение от одного агента другому

msg.setContent("price: 30, count: 1");

После этого мне нужно вручную разобрать его. Есть ли более удобный способ передачи параметров без преобразования в строку? Например, отправить какой-нибудь контейнер ..

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
493
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам лучше использовать онтологию. Это более удобный способ. Например.

Создайте свой контейнер:

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):

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.

На самом деле я не могу заполнить сообщение. IDEA сообщает, что не может разрешить метод fillContent (jade.lang.acl.ACLMessage, market.Offer). Если я пытаюсь преобразовать его в (ContentElement), возникает ошибка java.lang.RuntimeException: невозможно создать сообщение заполнения.

Артур Гудиев 21.05.2018 21:52

попробуйте ввести «открытый класс ParameterConcept реализует Predicate»

nikelyn 21.05.2018 22:16

Спасибо. Но у него все еще есть ошибка времени выполнения. ОШИБКА: Агент Consumer1 умер без надлежащего завершения работы !!! Состояние было 2 *** Неперехваченное исключение для агента Consumer1 *** java.lang.RuntimeException: невозможно создать сообщение заполнения.

Артур Гудиев 21.05.2018 23:13

Можете ли вы поставить точку останова на "throw new RuntimeException (" невозможно создать сообщение о заполнении. ");" и прикрепить stacktrace?

nikelyn 21.05.2018 23:16

Да, конечно. *** Неперехваченное исключение для агента Consumer1 *** java.lang.RuntimeException: невозможно создать сообщение о заполнении. в market.ConsumerAgent $ 1.action (ConsumerAgent.java:58) в jade.core.behaviours.Behaviour.actionWrapper (Behaviour.java:‌ 344) в jade.core.Agent $ ActiveLifeCycle.execute (Agent.java:1585) в jade.core.Agent.run (Agent.java:1524) в java.lang.Thread.run (Thread.java:748)

Артур Гудиев 21.05.2018 23:17

нет, я имею в виду это исключение "catch (Exception e) {". Установите точку останова, нажмите alt + f8, введите «e» и нажмите Enter.

nikelyn 21.05.2018 23:19

Позвольте нам продолжить обсуждение в чате.

nikelyn 21.05.2018 23:24

Простите. jade.content.abs.AbsConcept нельзя преобразовать в jade.content.abs.AbsContentElement jade.content.ContentManager.fillContent (ContentManager.java:‌ 205) market.ConsumerAgent $ 1.action (ConsumerAgent.java:59) jade.core .behaviours.Behaviour.actionWrapper (Behaviour.java:‌ 344) jade.core.Agent $ ActiveLifeCycle.execute (Agent.java:1585) jade.core.Agent.run (Agent.java:1524) java.lang.Thread .run (Thread.java:748)

Артур Гудиев 21.05.2018 23:31

ОК. Продолжим в чате

Артур Гудиев 21.05.2018 23:36

Вы можете просто использовать метод msg.setContentObject() и передать объект с классом, реализующим интерфейс Serializable.

Другие вопросы по теме