package jadex.micro.examples.remoteservice; import jadex.bridge.IComponentIdentifier; import jadex.bridge.IComponentManagementService; import jadex.bridge.IRemoteServiceManagementService; import jadex.commons.Future; import jadex.commons.IFuture; import jadex.commons.concurrent.CounterResultListener; import jadex.commons.concurrent.DelegationResultListener; import jadex.commons.concurrent.IResultListener; import jadex.commons.service.SServiceProvider; import jadex.micro.MicroAgent; /** * Agent that invokes methods on a remote service. */ public class UserAgent extends MicroAgent { /** * Execute the functional body of the agent. * Is only called once. */ public void executeBody() { final CounterResultListener lis = new CounterResultListener(2, new IResultListener() { public void resultAvailable(Object source, Object result) { killAgent(); } public void exceptionOccurred(Object source, Exception exception) { killAgent(); } }); // get remote management service SServiceProvider.getServiceUpwards(getServiceProvider(), IComponentManagementService.class) .addResultListener(createResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { final IComponentManagementService cms = (IComponentManagementService)result; // get remote management service and fetch service via rms.getProxy() SServiceProvider.getService(getServiceProvider(), IRemoteServiceManagementService.class) .addResultListener(createResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { IRemoteServiceManagementService rms = (IRemoteServiceManagementService)result; IComponentIdentifier platid = cms.createComponentIdentifier("remote", false, new String[]{"tcp-mtp://127.0.0.1:11000", "nio-mtp://127.0.0.1:11001"}); // Search for remote service rms.getServiceProxy(platid, IMathService.class).addResultListener(createResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { IMathService service = (IMathService)result; invokeAddService("IMathService searched via rms.", service) .addResultListener(createResultListener(lis)); } public void exceptionOccurred(Object source, Exception exception) { lis.resultAvailable(null, null); } })); } public void exceptionOccurred(Object source, Exception exception) { lis.resultAvailable(null, null); } })); } public void exceptionOccurred(Object source, Exception exception) { lis.resultAvailable(null, null); } })); // search on local platform and find service via ProxyAgent to other platform SServiceProvider.getService(getServiceProvider(), IMathService.class, true, true) .addResultListener(createResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { IMathService service = (IMathService)result; invokeAddService("IMathService searched via platform proxy.", service) .addResultListener(createResultListener(lis)); } public void exceptionOccurred(Object source, Exception exception) { lis.resultAvailable(null, null); } })); } /** * Invoke some add methods for testing. */ protected IFuture invokeAddService(String info, IMathService service) { final Future ret = new Future(); if(service==null) { System.out.println("No remote add service found: "+info); ret.setResult(null); } else { final CounterResultListener lis = new CounterResultListener(2, new DelegationResultListener(ret)); System.out.println("Found service: "+info); // Execute non-blocking method call with future result // System.out.println("Calling non-blocking addNB method."); service.addNB(1, 2).addResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { System.out.println("Invoked addNB: "+result); lis.resultAvailable(null, null); } public void exceptionOccurred(Object source, Exception exception) { lis.resultAvailable(null, null); } }); // Execute blocking method call with normal result // System.out.println("Calling blocking addB method."); int res = service.addB(1, 2); System.out.println("Invoked addB: "+res); // Execute constant method call, which does not block but returns a cached value. System.out.println("Calling constant (non-blocking) getPi method."); double pi = service.getPi(); System.out.println("Invoked getPi: "+pi); System.out.println("Calling void (non-blocking) printMessage method."); service.printMessage("math service"); System.out.println("Invoked printMessage"); System.out.println("Calling (non-blocking) exception throwing divZero method."); service.divZero().addResultListener(new IResultListener() { public void resultAvailable(Object source, Object result) { System.out.println("Invoked divZero without exception"); lis.resultAvailable(null, null); } public void exceptionOccurred(Object source, Exception exception) { System.out.println("Invoked divZero, expected exception occurred: "+exception); lis.resultAvailable(null, null); // exception.printStackTrace(); } }); } return ret; } }