import akka.actor.DeadLetter;
import akka.actor.Props;
import akka.actor.UntypedActor;
-import akka.japi.Creator;
import akka.testkit.JavaTestKit;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import scala.concurrent.duration.FiniteDuration;
-
+import com.typesafe.config.ConfigFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import scala.concurrent.duration.FiniteDuration;
public class MeteredBoundedMailboxTest {
private static CommonConfig config;
private final ReentrantLock lock = new ReentrantLock();
- @Before
- public void setUp() throws Exception {
- config = new CommonConfig.Builder<>("testsystem").build();
+ @BeforeClass
+ public static void setUp() throws Exception {
+ config = new CommonConfig.Builder<>("testsystem").withConfigReader(() -> ConfigFactory.load()).build();
actorSystem = ActorSystem.create("testsystem", config.get());
}
- @After
- public void tearDown() throws Exception {
- if (actorSystem != null)
- actorSystem.shutdown();
+ @AfterClass
+ public static void tearDown() throws Exception {
+ if (actorSystem != null) {
+ actorSystem.terminate();
+ actorSystem = null;
+ }
}
@Test
final JavaTestKit mockReceiver = new JavaTestKit(actorSystem);
actorSystem.eventStream().subscribe(mockReceiver.getRef(), DeadLetter.class);
-
- final FiniteDuration TWENTY_SEC = new FiniteDuration(20, TimeUnit.SECONDS);
+ final FiniteDuration twentySeconds = new FiniteDuration(20, TimeUnit.SECONDS);
ActorRef pingPongActor = actorSystem.actorOf(PingPongActor.props(lock).withMailbox(config.getMailBoxName()),
"pingpongactor");
actorSystem.mailboxes().settings();
lock.lock();
- //queue capacity = 10
- //need to send 12 messages; 1 message is dequeued and actor waits on lock,
- //2nd to 11th messages are put on the queue
- //12th message is sent to dead letter.
- for (int i=0;i<12;i++){
- pingPongActor.tell("ping", mockReceiver.getRef());
- }
-
- mockReceiver.expectMsgClass(TWENTY_SEC, DeadLetter.class);
+ try {
+ //queue capacity = 10
+ //need to send 12 messages; 1 message is dequeued and actor waits on lock,
+ //2nd to 11th messages are put on the queue
+ //12th message is sent to dead letter.
+ for (int i = 0; i < 12; i++) {
+ pingPongActor.tell("ping", mockReceiver.getRef());
+ }
- lock.unlock();
+ mockReceiver.expectMsgClass(twentySeconds, DeadLetter.class);
+ } finally {
+ lock.unlock();
+ }
- Object[] eleven = mockReceiver.receiveN(11, TWENTY_SEC);
+ mockReceiver.receiveN(11, twentySeconds);
}
/**
- * For testing
+ * For testing.
*/
- public static class PingPongActor extends UntypedActor{
+ public static class PingPongActor extends UntypedActor {
ReentrantLock lock;
- private PingPongActor(ReentrantLock lock){
+ private PingPongActor(final ReentrantLock lock) {
this.lock = lock;
}
- public static Props props(final ReentrantLock lock){
- return Props.create(new Creator<PingPongActor>(){
- private static final long serialVersionUID = 1L;
- @Override
- public PingPongActor create() throws Exception {
- return new PingPongActor(lock);
- }
- });
+ public static Props props(final ReentrantLock lock) {
+ return Props.create(PingPongActor.class, lock);
}
@Override
- public void onReceive(Object message) throws Exception {
+ public void onReceive(final Object message) throws Exception {
lock.lock();
try {
- if ("ping".equals(message))
+ if ("ping".equals(message)) {
getSender().tell("pong", getSelf());
+ }
} finally {
lock.unlock();
}
}
}
-}
\ No newline at end of file
+}