我必须与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 ....
@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);
}
}
});
}
}
任何人都可以帮助我?
问候
答案 0 :(得分: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。
亲切的问候 拉斯