package com.github.shansun.sparrow.test;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import junit.framework.TestCase;
import org.junit.Test;
import com.github.shansun.sparrow.actor.util.Actors;
import com.github.shansun.sparrow.actor.api.Actor;
import com.github.shansun.sparrow.actor.api.Message;
import com.github.shansun.sparrow.actor.builder.ActorManagerBuilder;
import com.github.shansun.sparrow.actor.internal.SimpleMessage;
import com.github.shansun.sparrow.actor.spi.AbstractActor;
import com.github.shansun.sparrow.actor.spi.ActorManager;
/**
* @author: lanbo <br>
* @version: 1.0 <br>
* @date: 2012-7-21
*/
public class ActorTest extends TestCase {
final static AtomicLong sendCount = new AtomicLong(0);
final static AtomicLong processedCount = new AtomicLong(0);
static class Demo1Actor extends AbstractActor {
@Override
public String getName() {
return "demo-1-actor";
}
@Override
public String getCategory() {
return "default";
}
@Override
public boolean process(Message message) {
System.out.println("Demo1Actor received " + message);
processedCount.incrementAndGet();
return true;
}
}
static class Demo2Actor extends AbstractActor {
@Override
public String getName() {
return "demo-2-actor";
}
@Override
public String getCategory() {
return "default";
}
@Override
public boolean process(Message message) {
processedCount.incrementAndGet();
long sum = 0;
for(int i = 0; i < 100; i++) {
sum += i;
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Demo2Actor received " + message);
//actor2发送消息给actor3
Actors.send(message, this, "demo-3-actor");
sendCount.incrementAndGet();
System.out.println("Redirect message to demo-3-actor");
return sum > 0;
}
}
static class Demo3Actor extends AbstractActor {
@Override
public String getName() {
return "demo-3-actor";
}
@Override
public String getCategory() {
return "default";
}
@Override
public boolean process(Message message) {
processedCount.incrementAndGet();
System.out.println("Demo3Actor received " + message);
return true;
}
}
@Test
public void testActor() throws InterruptedException, IOException {
try {
ExecutorService service = Executors.newFixedThreadPool(20);
final ActorManager manager = ActorManagerBuilder.newBuilder().withThreadCount(10).build();
manager.initialize();
final Actor actor1 = manager.createAndStartActor(Demo1Actor.class);
manager.createAndStartActor(Demo2Actor.class);
manager.createAndStartActor(Demo3Actor.class);
for (int i = 0; i < 10; i++) {
service.submit(new Runnable() {
@Override
public void run() {
while (true) {
//actor1发送消息给acto2
manager.send(new SimpleMessage(System.currentTimeMillis()), actor1, "demo-2-actor");
sendCount.incrementAndGet();
}
}
});
}
while (true) {
Thread.sleep(1000);
long cnt = sendCount.get();
System.err.println(cnt);
sendCount.addAndGet(-cnt);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException, IOException {
new ActorTest().testActor();
}
}