|
A bag is an unordered collection of objects of the same type (or some subtype of the same type). Table 1 shows an entry that can be used the describe a bag of items.
import net.jini.core.entry.*;
/* ---------------------------------------------- */
/* */
/* BAG ELEMENT CLASS */
/* */
/* ---------------------------------------------- */
public class BagEntry implements Entry {
// Fields
public String name;
// Constructors
public BagEntry() {
}
public BagEntry(String name) {
this.name = name;
}
}
|
Table 1: BagEntry entry class
A common method of working is to have a task bag containing tasks to be done and a seconf bag, the results bag containing completed tasks. Two appropriate entries are shown in Tables 2 and 3.
import net.jini.core.entry.*;
/* ------------------------------------------- */
/* */
/* TASK BAG CLASS */
/* */
/* ------------------------------------------- */
public class TaskBag extends BagEntry {
public TaskBag() {
}
public TaskBag(String name) {
super(name);
}
}
|
Table 2: TaskBag entry class
import net.jini.core.entry.*;
/* --------------------------------------------- */
/* */
/* RESULT BAG CLASS */
/* */
/* --------------------------------------------- */
public class ResultBag extends BagEntry {
public String colour;
public ResultBag() {
}
public ResultBag(String name, String colour) {
super(name);
this.colour = colour;
}
}
|
Table 3: ResultBag entry class
Table 4 shows an example application class that places items into a bag be assigned a colour. Table 5 shows another application that selects an item from the bag, assigns a colour and returns it int the space.
/* ----------------------------------------- */
/* */
/* TASK BAG CLIENT */
/* */
/* ----------------------------------------- */
// JavaSpacesUtil package
import JavaSpacesUtils.SpaceAccessor;
// Jini core packages
import net.jini.core.lease.*;
import net.jini.core.entry.*;
import net.jini.core.transaction.*;
// RMI packages
import java.rmi.*;
// Jini extension package
import net.jini.space.JavaSpace;
public class TaskBagClient {
/* ------ FIELDS ------ */
public static JavaSpace space;
/* ------ METHODS ------ */
/* MAIN */
public static void main(String[] args) {
String name;
// Get JavaSpace
SpaceAccessor newSpaceAccessor = new
SpaceAccessor("/home/staff5/ra/frans/JavaProgs/" +
"JavaSpaces/JavaSpacesUtils/frans_space.prop");
space = newSpaceAccessor.getSpace();
// Loop
for(int index=0;index<10;index++) {
// Create entry
name = "bagItem" + index;
// try block
try {
// Create bag item
TaskBag taskBagItem = new TaskBag(name);
// Send bag item into space
space.write(taskBagItem,null,Lease.FOREVER);
System.out.println(taskBagItem.name + " written to taskBag");
// Delay 3 second
Thread.sleep(3000);
}
// Catch block
catch(Exception e) {
e.printStackTrace();
}
}
// End
System.exit(0);
}
}
|
Table 4: TaskBagClient class
/* ------------------------------------------- */
/* */
/* RESULT BAG CLIENT */
/* */
/* ------------------------------------------- */
// JavaSpacesUtil package
import JavaSpacesUtils.SpaceAccessor;
// Jini core packages
import net.jini.core.lease.*;
import net.jini.core.entry.*;
import net.jini.core.transaction.*;
// RMI packages
import java.rmi.*;
// Jini extension package
import net.jini.space.JavaSpace;
public class ResultBagClient {
/* ------ FIELDS ------ */
public static JavaSpace space;
/* ------ METHODS ------ */
/* MAIN */
public static void main(String[] args) throws InterruptedException {
String name;
// Get JavaSpace
SpaceAccessor newSpaceAccessor = new
SpaceAccessor("/home/staff5/ra/frans/JavaProgs/" +
"JavaSpaces/JavaSpacesUtils/frans_space.prop");
space = newSpaceAccessor.getSpace();
// Task loop
for (int index=0;index<10;index++) {
name = getBagItem();
assignToResultBag(name,index);
// Delay 1 second
Thread.sleep(1000);
}
// End
System.exit(0);
}
/* GET BAG ITEM FROM TASK BAG */
public static String getBagItem() {
// try block
try {
// Create a template
TaskBag template = new TaskBag();
// Get task bag item
TaskBag taskBagItem = (TaskBag) space.take(template,null,Long.MAX_VALUE);
// Return
System.out.println(taskBagItem.name + " taken from task bag");
return(taskBagItem.name);
}
// Catch block
catch(Exception e) {
e.printStackTrace();
}
// End
return(null);
}
/* ASSIGN TO RESULT BAG */
public static void assignToResultBag(String name, int num) {
ResultBag resultBagItem;
// try block
try {
switch(num) {
case 0:
// Create blue result bag item
resultBagItem = new ResultBag(name,"blue");
break;
case 1:
// Create red result bag item
resultBagItem = new ResultBag(name,"red");
break;
default:
// Create yellow result bag item
resultBagItem = new ResultBag(name,"yellow");
}
// Send Message entry into space
space.write(resultBagItem,null,Lease.FOREVER);
System.out.println(resultBagItem.name + " (" + resultBagItem.colour +
" written to result bag");
}
// Catch block
catch(Exception e) {
e.printStackTrace();
}
}
}
|
Table 5: ResultBagClient class
This illustrates a common paradigm where where an application "looking for a service" (having a colour assigned to it) places an entry into a task bag; while an application "looking to provide the service" (assign a colour) removes entries from the task bag, performs the service and then returns the entries to a result bag.
Replicated worker computing (or master worker computing) is an approach to parallelising processes where the same process in carried out repeatedly in a loop. In RWC a master process divides the "work" into a number of tasks placed in a task bag. Other worker processes take the tasks, work on them, and place them into a result bag.