JINI
Mobile computing > continually changing topology Edge networking > no administrator access Utility computing > dynamic system re/provisioning Dynamic clustering > changing cluster configuration Large-scale distribution > constant partial failure Dynamic integration > unpredictable service availability Ad-hoc networking > spontaneous assembly Workflow/Msg switching > loose, asynchronous coupling Compute Grid > dynamic scalability RPC Systems require : > The client to know who it is calling > The client to know where the server is > The client and server to be active at the same time > The client and server to agree in detail on what form the call will take > The client and server to agree in detail on how the call will be made Where to Use Spaces Flow of objects > Workflow > Dataflow Coordinating loosely coupled collections of processes > Allows components to come and go > Allows components to change Don't use where you need > A file system > A database (object or relational) Security Valuation: Spaces Style Valuate set of fixed income securities > Break work into small chunks > Write an entry for each chunk into the space > Wait for results to come back Server process loops > Taking valuation requests > Executing each request, writing back results public class Task implements Entry public String clientID; public Task() {} public Entry execute() { throw new UnsupportedOperationException(); } public long resultLeaseTime() {...} } public class ValuationTask extends Task { // public String clientID; public InitialConditions data; public ValuationTask() {} public Entry execute() { ValuationResult result = new ValuationResult(); result.clientID = clientID; result.value = data.valuate(); return result; } public long resultLeaseTime() {...} } Server ValuationTask tmpl = new ValuationTask(); while (true) { ValuationTask task = (ValuationTask) space.take(tmpl, null, Long.MAX_VALUE); Entry result = task.execute(); if (result != null) space.write(result, null, task.resultLeaseTime()); //if (result != null) space.write(result, null, task.leaseTime()); } Client int count = 0; while (i.hasNext()) { ValuationTask task = new ValuationTask(); task.clientID = "jmcclain"; task.data = (InitialConditions)i.next(); Lease l = space.write(task, null, 3600000) lrm.renewFor(l, Lease.FOREVER, null); count++; } ValuationResult tmpl = new ValuationResult(); tmpl.clientID = "jmcclain"; for (int i=0; iAuthentication > Integrity > Confidentiality > Quality of service Use constraints (with Java policy) to specify > What a Subject can do > What a Subject can't do > What a Subject must do The Secure Remote Call Model Obtain a proxy from somewhere Perform 'proxy preparation' > Verify that the proxy can be trusted > Attach constraints to the proxy > Grant necessary permissions to the proxy Make remote calls through the proxy Jini Extensible Remote Invocation > RMI/JRMP ('1.0') > RMI/IIOP ('1.0B') > Jini ERI ('2.0') > Kerberos (Java GSS) > JXTA (jini.org project) > UDP (experimental) public interface JavaSpace { Lease write(Entry entry, Transaction txn, long lease) throws TransactionException, RemoteException; Entry read(Entry tmpl, Transaction txn, long timeout) throws UnusableEntryException, TransactionException, InterruptedException, RemoteException; Entry take(Entry tmpl, Transaction txn, long timeout) throws UnusableEntryException, TransactionException, InterruptedException, RemoteException; EventRegistration notify(Entry tmpl, Transaction txn, RemoteEventListener listener, long lease, MarshalledObject handback) throws TransactionException, RemoteException; Entry readIfExists(Entry tmpl, Transaction txn, long timeout) throws UnusableEntryException, TransactionException, InterruptedException, RemoteException; Entry takeIfExists(Entry tmpl, Transaction txn, long timeout) throws UnusableEntryException, TransactionException, InterruptedException, RemoteException; long NO_WAIT = 0; Entry snapshot(Entry e) throws RemoteException } Exporter Configuration example.sunw.service { .............. private endpt = SSlServerEndpoint.getInstance(0); private constraints = new BasicMethodConstraints (new InvocationConstraints (new InvocationConstraint[]{Integrity.YES}, null) ); private ilFactory = new ProxyTrustILFactory (constraints, ServicePermission.class); serverExporter = new BasicJeriExporter (endpt, ilFactory); .............. }//end example.sunw.service Proxy Preparer Configuration example.sunw.client { .............. private verifyTrust = true; private constraints = new BasicMethodConstraints(...); private dynamicPermissions = new Permission[] {...}; servicePreparer = new BasicProxyPreparer(verifyTrust, constraints, dynamicPermissions); .............. }//end example.sunw.client Refinements Wrap operations in transactions Priorities Create a FIFO > Push data structure logic into the space also Audit trails Status Dependent tasks Fixed function server nodes Future Community currently working on extension to spaces > Batch write and take > Exhaustive read > Also fills roll of batch read > New event > New queries support multiple templates Should make space better at multicasting Batch/multi-template take should help various compute server scenarios GigaSpaces http://www.gigaspaces.com IntaMission http://www.intamission.com Blitz - http://www.dancres.org/blitz