2014-02-07 3 views
0

Кажется, что одновременный вызов одной и той же конечной точки из того же сеанса вызывает некоторую проблему на стороне Play.Одновременный запрос к той же конечной точке из того же сеанса создает проблему в Play

Хотя запросы имеют разные параметры, эти параметры иногда копируются (кэшируются?) Из предыдущего запроса.

вот как настроить тест, чтобы воспроизвести это:

маршруты:

GET /api/test @com.standup75.TestController.test(test: String ?= null) 
GET /api/testPage  @com.standup75.TestController.testPage() 

TestController.java

.... 
public Result test(String test) { 
    return ok("test = " + test); 
} 
public Result testPage() { 
    return ok(views.test.render()); 
} 

test.html.scala

@() 

<h1>Test page</h1> 
<ul id="log"></ul> 

<script src="//code.jquery.com/jquery-1.10.1.min.js"></script> 
<script> 
    $(function(){ 
    var $ul = $("#log"); 
    for (var i = 0; i < 20; i++) { 
     (function(i){ 
     var url = "/api/test?test="+i; 
     $.ajax({ 
      url: url, 
      dataType: 'html', 
      success: function(res){ 
      $ul.append("<li>url: " + url + " - result: " + res + "</li>"); 
      } 
     }); 
     })(i) 
    } 
    }); 
</script> 

И вот сюрприз петь выход этого, когда я иду в/API/тестовую страницу:

Test page 

url: /api/test?test=3 - result: test = 4 
url: /api/test?test=5 - result: test = 2 
url: /api/test?test=0 - result: test = 2 
url: /api/test?test=1 - result: test = 4 
url: /api/test?test=4 - result: test = 4 
url: /api/test?test=2 - result: test = 3 
url: /api/test?test=7 - result: test = 6 
url: /api/test?test=8 - result: test = 8 
url: /api/test?test=6 - result: test = 6 
url: /api/test?test=9 - result: test = 10 
url: /api/test?test=10 - result: test = 10 
url: /api/test?test=11 - result: test = 11 
url: /api/test?test=13 - result: test = 13 
url: /api/test?test=14 - result: test = 14 
url: /api/test?test=12 - result: test = 12 
url: /api/test?test=17 - result: test = 16 
url: /api/test?test=15 - result: test = 16 
url: /api/test?test=16 - result: test = 16 
url: /api/test?test=18 - result: test = 19 
url: /api/test?test=19 - result: test = 19 

Испытание значения в результате не всегда такой же, как тест пары, который не имеет смысла для меня?

ответ

1

Я работаю с OP, мы в конце концов понял. Вопрос был похож на то, что упоминал frant.hartm.

Контроллер наследует базовый класс, который добавляет несколько действий воспроизведения в цепочку делегирования запроса для всех запросов с использованием @With. Некоторые типы действий также являются компонентами Spring и по умолчанию являются одиночными. Когда Play инициализирует цепочку делегирования для запроса, экземпляры этих действий могут получить общий доступ к нескольким одновременно поданным запросам, а последний запрос на создание его цепочки делегирования позволяет установить действие root. В принципе, условие гонки на «делегировать» участника совместного действия.

Проблема была решена путем добавления @Scope («prototype») к соответствующим действиям. Спасибо за фант за подсказку.

2

У меня была такая же проблема, когда использовались весенние бобы в качестве контроллеров.

Я вижу, что вы используете экземпляры контроллеров, а не статические методы (от @). Вы произвольно используете play.mvc.Security.AuthenticatedAction? Как вы создаете свой экземпляр? Он должен быть новым экземпляром для каждого запроса (область прототипа в случае с весенним фасолью), в противном случае игра будет смешивать запросы недетерминированным способом.

См https://groups.google.com/forum/#!topic/play-framework/EHl9mbafUlA

Смежные вопросы