Отключение системы Akka в Play 2.0 при наличии нескольких тестовых наборов

У меня есть два контроллера, оба из которых используют актеров AKKA в Play 2.0. Соответственно, есть два тестовых случая, которые проверяют эти два API. Однако при выполнении «игрового теста» только один из тестовых случаев будет успешным, а другой завершится ошибкой. Если я запускаю их отдельно, он работает успешно. Я подозреваю, что система акторов была отключена после первого теста. Однако я новичок в Play 2 и Akka, это только мое предположение. Есть ли обходной путь?

@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");
            ....
        }
    });
}

Ниже приведены два контроллера:

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>() {
                        ...
                        }
                ));
}

Мастер и рабочий AKKA PostA:

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) {
               // invoke worker to submit channel messaages
               workerRouter.tell(messageObj, getSender());
                } else if (messageObj instanceof ProductMessageResult) {
                    ......
                    getSender().tell("OK");
                }
            } catch (Exception e) {
                ......
            } 
    }

}


public class PostAActorWorker extends UntypedActor {
    public void onReceive(Object messageObj) throws Exception {
              if (messageObj instanceof ProductMessage) {
                     ProductMessage pMessage = (ProductMessage)messageObj;
                     ProductInfo pInfo = pMessage.getProductInfo();
                     log.info(pInfo.getProductId());
                     ProductMessageResult pr = new ProductMessageResult(pInfo);
                 PostA.masterActor.tell(pr, getSender());
              }
        }
}

Управляемый объект:

public class ProductInfo extends Model {
        @Id
        private String productId;
        ...
   }
6
задан angelokh 12 July 2012 в 21:03
поделиться