首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自同一会话的对同一端点的同时请求在运行中创建问题

来自同一会话的对同一端点的同时请求在运行中创建问题
EN

Stack Overflow用户
提问于 2014-02-07 16:53:12
回答 2查看 116关注 0票数 0

似乎来自同一会话的对同一端点的同时调用会在播放端触发一些问题。

虽然请求有不同的参数,但这些参数有时会被复制(缓存?)之前的请求。

下面是我如何设置测试来再现这个测试:

路线:

代码语言:javascript
复制
GET /api/test   @com.standup75.TestController.test(test: String ?= null)
GET /api/testPage       @com.standup75.TestController.testPage()

TestController.java

代码语言:javascript
复制
....
public Result test(String test) {
    return ok("test = " + test);
}
public Result testPage() {
    return ok(views.test.render());
}

test.html.scala

代码语言:javascript
复制
@()

<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时,这里有一个令人惊讶的输出:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-07 22:26:28

我和行动组一起工作,我们终于搞清楚了。这个问题与frant.hartm提到的类似。

控制器继承一个基类,该基类使用@With在请求委托链中为所有请求添加多个播放操作。一些Action类型也是Spring组件,默认为单例。当Play初始化请求的委托链时,这些操作的实例最终可能被多个同时服务的请求共享,而设置其委托链的最后一个请求将设置根操作。基本上,共享操作的“委托”成员的竞赛条件。

通过在相关操作中添加@Scope("prototype")解决了问题。感谢弗兰特的暗示。

票数 1
EN

Stack Overflow用户

发布于 2014-02-07 18:05:00

不久前,当我使用Spring作为控制器时,我也遇到了同样的问题。

我看到您使用的是控制器实例,而不是静态方法(from @)。你有机会使用play.mvc.Security.AuthenticatedAction吗?如何创建它的实例?它需要是每个请求的新实例( Spring案例中的原型范围),否则play将以一种不确定的方式混合这些请求。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21633443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档