file: ItemProducing.java
public joinpointtype ItemProducing {
}
file: ConsumerCreation.java
public joinpointtype ConsumerCreation {
Consumer consumer;
}
file: Item.java
public class Item {
public int value = 0;
}
file: Producer.java
import java.util.Random;
public class Producer implements Runnable exhibits ItemProducing {
pointcut ItemProducing : execution(Item produceItem());
private int numberOfItems = 0;
private Random random = new Random();
public Producer(int numberOfItems) {
this.numberOfItems = numberOfItems;
}
public void run() {
System.out.println("[producer]\tstart producing "+numberOfItems+" items");
for(int i = 0; i < numberOfItems; i++) {
Item it = produceItem();
System.out.println("[producer] item "+i+" : "+it.value);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.err.println(e);
}
}
System.out.println("[producer] stop producing");
}
private Item produceItem() {
int i = random.nextInt(10);
Item it = new Item();
it.value = i;
return it;
}
}
file: Consumer.java
import java.util.Random;
public class Consumer exhibits ConsumerCreation {
pointcut ConsumerCreation : execution(new(..)) && this(consumer);
private Random random = new Random();
private boolean working = false;
private String name;
public Consumer(String n) {
name = n;
}
public String getName() {return name;}
public void consume(Item it) {
working = true;
System.out.println("["+name+"] consuming "+it.value);
Runnable r = new Runnable() {
public void run() {
int sleep = random.nextInt(2000) + 750;
System.out.println("["+name+"] sleeping for "+sleep);
try {
Thread.sleep(sleep);
} catch(InterruptedException e) {
System.err.println(e);
}
working = false;
System.out.println("["+name+"] ready for new Items");
}
};
Thread th = new Thread(r);
th.start();
}
public boolean isWorking() {return working;}
}
file: Dispatcher.java
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public aspect Dispatcher advises ItemProducing, ConsumerCreation {
List consumer = new ArrayList();
after(ConsumerCreation creation) returning {
System.out.println("[dispatcher] add new consumer: "+creation.consumer.getName());
consumer.add(creation.consumer);
}
after(ItemProducing producing) returning(Item it) {
System.out.println("[dispatch] recieve item : "+it.value);
boolean check = check(it);
if(check) {
dispatch(it);
} else {
System.out.println("[checking] invalid value "+it.value+"! item rejected");
}
}
private boolean check(Item it) {
return it.value != 0;
}
private void dispatch(final Item it) {
Runnable r = new Runnable() {
public void run() {
System.out.println("[dispatch] search for idle consumer");
boolean searching = true;
int tries = 0;
while(searching) {
if(tries > 0) {
System.out.println("[dispacth] no consumer idle, try again");
}
for(Iterator i = consumer.iterator(); i.hasNext();) {
Consumer c = (Consumer) i.next();
if(!c.isWorking()) {
System.out.println("[dispatch] "+c.getName()+" is idle ...");
c.consume(it);
searching = false;
break;
}
System.out.println("[dispatch] "+c.getName()+" is busy");
}
tries++;
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.err.println(e);
}
}
}
};
Thread th = new Thread(r);
th.start();
}
}
Back to main page