1

我必须与 BDI 代理合作,为此我将使用 JADEX 2.4,但我有一个大问题。文档有点差,我无法在代理之间交换消息。

我已经阅读了这篇文章http://www.activecomponents.org/bin/view/AC+Tutorial/05+Provided+Services

我正在尝试在我的代码上做同样的事情,但没有成功。我需要知道如何做两件事来完成我的工作:从一个代理向另一个代理发送消息,以及从一个代理向所有代理发送消息。有谁知道该怎么做?

我拥有的代码如下:

聊天系统.java

package agents;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import ....

@Service
public class ChatSystem implements IChatService{

    @ServiceComponent
    protected IInternalAccess agent;
    protected IClockService clock;
    protected DateFormat format;

    @ServiceStart
    public IFuture<IClockService> startService(){

        format = new SimpleDateFormat("hh:mm:ss");
        final Future<IClockService> ret = new Future<IClockService>();
        IFuture<IClockService> fut = agent.getServiceContainer().getRequiredService("clockservice");
        fut.addResultListener(new DelegationResultListener<IClockService>(ret)
        {
          public void customResultAvailable(IClockService result)
          {
            clock = result;
            super.customResultAvailable(null);
          }
        });
        return ret;
    }

    @Override
    public IFuture<Void> message(String nick, String text,
            boolean privatemessage) {
        // TODO Auto-generated method stub
        //System.out.println(" received at" + text);
        System.out.println(agent.getComponentIdentifier().getLocalName()+" received at "
                +" from: "+nick+" message: "+text);
        return null;
    }
}

HelperAgent.java

package agents;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import .....

@Agent
@Service
@RequiredServices({@RequiredService(name="clockservice", type=IClockService.class,binding=@Binding(scope=RequiredServiceInfo.SCOPE_PLATFORM)),@RequiredService(name="chatservices", type=IClockService.class,binding=@Binding(scope=RequiredServiceInfo.SCOPE_PLATFORM,dynamic=true),multiple=true)})
@ProvidedServices(@ProvidedService(type=IChatService.class, implementation=@Implementation(ChatSystem.class)))

public class HelperAgent {

    @Agent
    protected MicroAgent agent;
    @AgentBody
    public void AgentBody()
    {

        IFuture<IClockService> fut = agent.getServiceContainer().getRequiredService("clockservice");
        fut.addResultListener(new DefaultResultListener<IClockService>()
        {
          public void resultAvailable(IClockService cs)
          {
            System.out.println("Time for a chat, buddy: "+new Date(cs.getTime()));
          }
        });

        IFuture<Collection<IChatService>> chatservices = agent.getServiceContainer().getRequiredServices("chatservices");
        chatservices.addResultListener(new DefaultResultListener<Collection<IChatService>>()
        {
          public void resultAvailable(Collection<IChatService> result)
          {
            for(Iterator<IChatService> it=result.iterator(); it.hasNext(); )
            {
              IChatService cs = it.next();
              cs.message(agent.getComponentIdentifier().getName(), "test",false);
            }
          }
        });

    }
}

任何人都可以帮助我吗?

问候

4

1 回答 1

2

在 Jadex 中,您使用代表增强代理的活动组件,即除了发送和接收消息之外,您还可以使用服务。代理可以使用 Java 接口公开服务,而其他代理可以通过它们的类型简单地获取这些服务。使用服务通信无需知道代理身份即可完成。这有助于构建更多 SOA 驱动的解决方案动态服务提供商。

如果您想通过消息进行通信,API 取决于您使用的组件类型。如果是微代理(如您的代码片段所示),您只需准备一条 FIPA 消息并在代理 API 上调用 sendMessage ,如下所示:

Map msg = new HashMap();
msg.put(SFipa.CONTENT, content);
msg.put(SFipa.PERFORMATIVE, SFipa.QUERY_IF);
msg.put(SFipa.CONVERSATION_ID, "someuniqueid");
msg.put(SFipa.RECEIVERS, new IComponentIdentifier[]{receiver});
msg.put(SFipa.SENDER, getComponentIdentifier());
agent.sendMessage(msg, SFipa.FIPA_MESSAGE_TYPE);

'agent' 是注入的 MicroAgent。

亲切的问候拉斯

于 2014-01-14T14:12:00.837 回答