我需要使用 BDI 代理来完成一项工作,为此我将使用 JADEX 2.4,但遇到了一个大问题。文档有些贫乏,我无法在代理之间交换消息。
我阅读了这篇文章 http://www.activecomponents.org/bin/view/AC+Tutorial/05+Provided+Services
我试图在我的代码中做同样的事情,但没有成功。我需要知道如何做两件事来完成我的工作:从一个代理向另一个代理发送消息,以及从一个代理向所有代理发送消息。有人知道如何做吗?
我目前的代码如下:
ChatSystem.java
package agents;import java.text.DateFormat;import java.text.SimpleDateFormat;import ....@Servicepublic 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); } } }); }}
有人能帮我吗?
此致
回答:
在 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。
此致
Lars