Как отправить сообщение ACL в общедоступном методе в классе агента

Я новичок в Jade и многоагентных системах. Я пытаюсь создать систему с несколькими агентами, которым придется общаться, отправляя сообщения ACL. Я прочитал документацию о структуре создания класса агента.

Вот мой код:

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. Я думаю, что мой код правильный, потому что мой TickBehaviour работает нормально.

Итак, мой вопрос: как мне правильно отправить сообщение другому агенту из моего метода?

Спасибо за любой ответ :)


person Nicola    schedule 19.02.2015    source источник


Ответы (2)


Вы должны установить шаблон при отправке сообщения и сопоставить его с идентификатором разговора. Агент, получающий сообщение, должен проверить соответствие шаблону.

person Tafadzwa Chikudo    schedule 20.02.2015

Ваш метод LauchServiceAgent(...) никогда не возвращается, потому что вы всегда возвращаете false в методе done(). Это может быть причиной ваших проблем, так как ваш метод никогда не заканчивается, он застревает.

Один из вариантов исправить это — использовать OneShotBehaviour(), который автоматически выполняется один раз и завершается автоматически. Другой вариант - установить переменную в значение «истина» сразу после успешной отправки вашего сообщения [после «отправить (сообщение);»] и заставить done() вернуть эту переменную.

Совет: по возможности используйте предопределенные типы поведения, чтобы избежать головной боли [OneShotBehaviour, SimpleBehaviour и т. д.].

person shirowww    schedule 17.03.2015
comment
Присвоение переменной значения true после отправки сообщения — это именно то, что я сделал. Спасибо за ответ =) - person Nicola; 19.03.2015
comment
Если вы возвращаете эту «истинную» переменную в методе done(), это должно работать. - person shirowww; 16.04.2015