package jadex.micro.benchmarks; import jadex.base.fipa.SFipa; import jadex.bridge.IComponentIdentifier; import jadex.bridge.IArgument; import jadex.bridge.IComponentStep; import jadex.bridge.IInternalAccess; import jadex.bridge.MessageType; import jadex.commons.concurrent.DefaultResultListener; import jadex.micro.MicroAgent; import jadex.micro.MicroAgentMetaInfo; import java.util.HashMap; import java.util.Map; /** * Test message performance. */ public class MessagePerformanceAgent extends MicroAgent { //-------- attributes -------- /** The received messages. */ protected int received; /** The start time. */ protected long starttime; /** The current message number sent. */ protected int current; //-------- methods -------- /** * Execute an agent step. */ public void executeBody() { getTime().addResultListener(createResultListener(new DefaultResultListener() { public void resultAvailable(Object source, Object result) { current = 1; starttime = ((Long)result).longValue(); final int msgcnt = ((Integer)getArgument("max")).intValue(); final IComponentIdentifier receiver = getComponentIdentifier(); final boolean usecodec = ((Boolean)getArgument("codec")).booleanValue(); IComponentStep send = new IComponentStep() { public Object execute(IInternalAccess ia) { if(current==1) { System.out.println("Now sending " + msgcnt + " messages to " + receiver); System.out.println("Codec is: "+usecodec); } // Send messages. int i = current; for(; i<=msgcnt; i++) { Map request = new HashMap(); request.put(SFipa.PERFORMATIVE, SFipa.INFORM); request.put(SFipa.RECEIVERS, new IComponentIdentifier[]{receiver}); request.put(SFipa.REPLY_WITH, "some reply id"); if(!usecodec) { request.put(SFipa.CONTENT, "message: "+i); } else { request.put(SFipa.LANGUAGE, SFipa.JADEX_XML); request.put(SFipa.CONTENT, new Message("message: "+i, true)); } sendMessage(request, SFipa.FIPA_MESSAGE_TYPE); if(i>0 && i%10 == 0) { System.out.print('.'); if(i%1000==0) { System.out.println(); break; } } } current = i+1; if(current<=msgcnt) { waitFor(0, this); } return null; } }; send.execute(MessagePerformanceAgent.this); } })); } /** * Called on message arrival. */ public void messageArrived(Map msg, MessageType mt) { received++; final int msgcnt = ((Integer)getArgument("max")).intValue(); if(received==msgcnt) { getTime().addResultListener(createResultListener(new DefaultResultListener() { public void resultAvailable(Object source, Object result) { long dur = ((Long)result).longValue() - starttime; System.out.println("Sending/receiving " + msgcnt + " messages took: " + dur + " milliseconds."); killAgent(); } })); } } /** * Get the meta information about the agent. */ public static Object getMetaInfo() { return new MicroAgentMetaInfo("This agents benchmarks agent message sending.", new String[0], new IArgument[] { new IArgument() { public Object getDefaultValue(String configname) { return new Integer(1000); } public String getDescription() { return "Maximum number of messages to send."; } public String getName() { return "max"; } public String getTypename() { return "Integer"; } public boolean validate(String input) { boolean ret = true; try { Integer.parseInt(input); } catch(Exception e) { ret = false; } return ret; } }, new IArgument() { public Object getDefaultValue(String configname) { return Boolean.FALSE; } public String getDescription() { return "Use content codec for message content."; } public String getName() { return "codec"; } public String getTypename() { return "boolean"; } public boolean validate(String input) { boolean ret = true; try { Boolean.valueOf(input); } catch(Exception e) { ret = false; } return ret; } } }, null, null, null ); } }