I have two controllers that use AKKA actors in Play 2.0. Accordingly, there are two tests that test these two APIs. However, when a “game test” is performed, only one of the test cases will succeed, and the other will fail. If I run them separately, it succeeds. My guess is that the actor system was disabled by the first test. However, I am new to Play 2 and Akka, this is just my guess. Is there a workaround?
@Test public void callPostA() { running(testServer(2222, fakeApplication(inMemoryDatabase())), new Runnable() { @Override public void run() { HttpPost httpPost = new HttpPost("http://localhost:2222/controllera"); .... } }); } @Test public void callPostB() { running(testServer(2222, fakeApplication(inMemoryDatabase())), new Runnable() { @Override public void run() { HttpPost httpPost = new HttpPost("http://localhost:2222/controllerb"); .... } }); }
Two controllers:
public class PostA extends Controller { // master actor for workers public static ActorRef masterActorA = Akka.system().actorOf(new Props(new UntypedActorFactory() { public UntypedActor create() { return new PostAActorMaster(Config.NUMBER_OF_WORKER_ACTOR); } }), "PostAActorMaster"); public static Result postA() { Map<String, String[]> dict = body.asFormUrlEncoded(); String paramField1 = dict.get("paramField1"); String paramField2 = dict.get("paramField2"); ProductInfo pInfo = new ProductInfo(paramField1, paramField2); ProductMessage pMessage = new ProductMessage(pInfo); return async( Akka.asPromise(ask(masterActorA, pMessage, 15000)).map( new Function<Object, Result>() { ... } )); } public class PostB extends Controller { // master actor for workers public static ActorRef masterActorB = Akka.system().actorOf(new Props(new UntypedActorFactory() { public UntypedActor create() { return new PostBActorMaster(Config.NUMBER_OF_WORKER_ACTOR); } }), "PostBActorMaster"); public static Result postB() { Map<String, String[]> dict = body.asFormUrlEncoded(); String paramField3 = dict.get("paramField3"); String paramField4 = dict.get("paramField4"); BillInfo bInfo = new BillInfo(paramField3, paramField4); BillMessage pMessage = new BillMessage(bInfo); return async( Akka.asPromise(ask(masterActorB, pMessage, 15000)).map( new Function<Object, Result>() { ... } )); }
PostA AKKA Master and Worker:
public class PostAActorMaster extends UntypedActor { private final ActorRef workerRouter; public PostAActorMaster(final int nrOfWorkers) { workerRouter = this.getContext().actorOf(new Props(PostAActorMaster.class).withRouter(new RoundRobinRouter(nrOfWorkers))); } public void onReceive(Object messageObj) { try { if (messageObj instanceof ProductMessage) {
Managed Object:
public class ProductInfo extends Model { @Id private String productId; ... }
source share