private boolean isExplicitReceiver(ACLMessage msg, AID receiver) { Iterator it = msg.getAllIntendedReceiver(); while (it.hasNext()) { if (receiver.equals(it.next())) { return true; } } return false; }
/** * Dispatch a message to an agent in the FrontEnd. If this method is called by a thread that is * serving a message sent by an agent in the FrontEnd too, nothing is done as the dispatch has * already taken place in the FrontEnd (see messageOut()). */ public boolean postMessageToLocalAgent(ACLMessage msg, AID receiverID) { // Try first in the LADT boolean found = super.postMessageToLocalAgent(msg, receiverID); if (found) { return found; } else { // The receiver must be in the FrontEnd AgentImage image = (AgentImage) agentImages.get(receiverID); if (image != null) { if (agentImages.containsKey(msg.getSender()) && isExplicitReceiver(msg, receiverID)) { // The message was sent by an agent living in the FrontEnd. The // receiverID (living in the FrontEnd too) has already received // the message. // The second part of the condition ensures that, if the // message was not directly sent to the receiver (e.g. it was sent to a topic // or an alias), message delivery occurs normally. // FIXME: This does not take into account that an agent not living // in the FrontEnd may send a message on behalf of an agent living // in the FrontEnd. return true; } try { // Forward the message to the FrontEnd int size; if (msg.hasByteSequenceContent()) { size = msg.getByteSequenceContent().length; } else { size = msg.getContent() != null ? msg.getContent().length() : 0; } myLogger.log( Logger.INFO, getID() + " - Delivering IN message " + ACLMessage.getPerformative(msg.getPerformative()) + ", size=" + size); myFrontEnd.messageIn(msg, receiverID.getLocalName()); handlePosted(receiverID, msg); return true; } catch (NotFoundException nfe) { System.out.println("WARNING: Missing agent in FrontEnd"); return false; } catch (IMTPException imtpe) { System.out.println("WARNING: Can't deliver message to FrontEnd"); return false; } } else { // Agent not found System.out.println("WARNING: Agent " + receiverID + " not found on BackEnd container"); return false; } } }
/** An agent has just died on the FrontEnd. Remove its image and notify the Main */ public void deadAgent(String name) throws IMTPException { AID id = new AID(name, AID.ISLOCALNAME); myLogger.log(Logger.INFO, getID() + " - Handling termination of agent " + id.getLocalName()); handleEnd(id); }
public boolean connect() { try { // Initialize the BackEndManager if required if (myProfile.getBooleanProperty(USE_BACKEND_MANAGER, false)) { theBEManager = initBEManager(); } Vector agentSpecs = Specifier.parseSpecifierList(myProfile.getParameter(Profile.AGENTS, null)); myProfile.setParameter(Profile.AGENTS, null); myFrontEnd = myConnectionManager.getFrontEnd(this, null); myLogger.log( Logger.FINE, "BackEnd container " + myProfile.getParameter(Profile.CONTAINER_NAME, null) + " joining the platform ... (FrontEnd version: " + myProfile.getParameter(JICPProtocol.VERSION_KEY, "not available") + ")"); Runtime.instance().beginContainer(); boolean connected = joinPlatform(); if (connected) { myLogger.log(Logger.FINE, "Join platform OK"); AID amsAID = getAMS(); myProfile.setParameter(Profile.PLATFORM_ID, amsAID.getHap()); String[] addresses = amsAID.getAddressesArray(); if (addresses != null) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < addresses.length; i++) { sb.append(addresses[i]); if (i < addresses.length - 1) { sb.append(';'); } } myProfile.setParameter(MicroRuntime.PLATFORM_ADDRESSES_KEY, sb.toString()); } if ("true".equals(myProfile.getParameter(RESYNCH, "false"))) { myLogger.log( Logger.INFO, "BackEnd container " + myProfile.getParameter(Profile.CONTAINER_NAME, null) + " activating re-synch ..."); resynch(); } else { // Notify the main container about bootstrap agents on the FE. for (int i = 0; i < agentSpecs.size(); i++) { Specifier sp = (Specifier) agentSpecs.elementAt(i); try { String name = bornAgent(sp.getName()); sp.setClassName(name); sp.setArgs(null); } catch (Exception e) { myLogger.log(Logger.SEVERE, "Error creating agent " + sp.getName(), e); sp.setClassName(e.getClass().getName()); sp.setArgs(new Object[] {e.getMessage()}); } } myProfile.setParameter(Profile.AGENTS, Specifier.encodeSpecifierList(agentSpecs)); } } return connected; } catch (Exception e) { // Should never happen e.printStackTrace(); return false; } }