【问题标题】:Requests timeout when sent from webservices after upgrade to play 2.3.8升级到播放 2.3.8 后从 web 服务发送请求超时
【发布时间】:2015-05-04 14:45:32
【问题描述】:

故事就是这样,我有一个使用 org.apache.cxf 插件提供 SOAP 服务的播放框架应用程序。在我的路线文件中,我有以下内容:

GET     /soap/*path                 org.apache.cxf.transport.play.CxfController.handle(path)
POST    /soap/*path                 org.apache.cxf.transport.play.CxfController.handle(path)

这路由到我自己的一个函数,该函数将路径转换为另一个请求,该请求将访问我常用的控制器。我们通过建立一个WSRequestHolder 对象来做到这一点。我们设置标题、查询参数等。

这曾经在 play 2.2 中运行良好,但升级到 2.3.8 后,似乎出现了问题。我已经追踪到这一行:

Promise<WSResponse> responsePromise =  request.get();    
WSResponse response = responsePromise.get(2000);

当我们发出请求时(调用 response.Promise.get 时),无论超时设置如何,调用都会超时。我正在使用一个基本的登录请求进行测试,它曾经在不到 200 毫秒的时间内做出响应。我已经使用邮递员复制了请求参数,并且该请求似乎可以正常工作,但是当它从我的网络服务中被触发时,它会超时。

我可能在升级到 2.2 时遗漏了一些东西,但我什至不确定要调试什么。它显然没有击中控制器,并且在 DEBUG 级别打开播放日志甚至看不到请求。

任何帮助将不胜感激。

更新:

我已经在 dev 和 prod 模式下对其进行了测试。两者似乎都在同一个地方失败。

【问题讨论】:

  • 这是在开发模式下吗? Play 在开发模式下串行处理请求,所以如果你对自己的应用程序进行 WS 调用并阻塞,我很确定它注定会超时。
  • 有趣,它处于开发模式...此外,这在 play 2.2 中有效,所以如果在迁移指南中提到这一点会很好。我想知道是否有办法绕过该限制而不切换到 prod 模式(这也禁用自动重新加载)
  • 另外,切换到 application.mode=prod 仍然会出现问题。
  • 除非我仍然不知道如何将 application 设置为 prod...我认为将 application.mode=prod 放入 application.conf 文件中就可以了,但日志仍然说 play以开发模式启动。
  • activator start 看看它在那里的表现会很有趣。

标签: web-services playframework cxf playframework-2.3


【解决方案1】:

我想通了。问题是,在我们重定向请求的过程中,我们重新添加了两次 Content-Length 标头,一次是长度,一次是零(试图强制重新生成长度)。原来这在 play 2.2 中有效,但导致它在 2.3 中挂起。确保只添加一次 Content-Length 标头可以防止请求挂起。开发/生产模式经过测试并正常工作。

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2012-10-14
    • 2018-09-10
    • 2015-09-06
    • 1970-01-01
    相关资源
    最近更新 更多