java - 从同一 session 同时请求同一端点会在 Play 中产生问题

标签 java concurrency playframework playframework-2.0

似乎从同一 session 同时调用同一端点会在 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());
}

测试.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/testPage 时,这是令人惊讶的输出:

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

结果中的测试值并不总是与测试参数相同,这对我来说没有意义?

最佳答案

不久前我在使用 Spring bean 作为 Controller 时遇到了同样的问题。

我看到您正在使用 Controller 实例,而不是静态方法(来自@)。您是否有机会使用 play.mvc.Security.AuthenticatedAction ?如何创建它的实例?它需要是每个请求的新实例(Spring bean 情况下的原型(prototype)范围),否则 play 将以不确定的方式混合请求。

参见https://groups.google.com/forum/#!topic/play-framework/EHl9mbafUlA

关于java - 从同一 session 同时请求同一端点会在 Play 中产生问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21633443/

相关文章:

java - 为什么使用 Java 的流 API 收集器进行管道分组需要更多时间?

concurrency - 通过同时运行多个实例来加速 rsync?

scala - 如何拦截 Play 2 + Scala 中的所有 Controller 请求?

Java:根据参数值选择性同步方法

java - RadioGroupFieldEditor setPropertyChangeListener

java - javax.swing.plaf.nimbus.ImageCache 中 ReentrantReadWriteLock 的用法

java - 试图删除 Entitymanager,但没有设置

java - Play Framework 控制台不使用自定义配置

JavaBean DataSource 未传递到子子报告

scala - 是否有可能以及如何让 Scala par 消耗线程池中的线程?