IBM Worklight 6.1 - 如何在较慢的网络中处理超时?
Posted
技术标签:
【中文标题】IBM Worklight 6.1 - 如何在较慢的网络中处理超时?【英文标题】:IBM Worklight 6.1 - How to handle timeouts in slower networks? 【发布时间】:2014-01-17 11:46:49 【问题描述】:我们使用Worklight 6.1
为ios5
、iOS6
和IOS7
构建了一个应用程序,它运行良好。
但是,当我们尝试在 2G 网络 中使用应用程序并尝试调用适配器程序时,它甚至没有连接到服务器。每次我们超时并尝试 10-15 次后,它都会连接到服务器并返回响应。
当我们在其他良好的网络或 3G 上使用相同的应用程序时,它可以完美运行,没有任何问题。
这是我们在使用 2G 网络时在 Xcode Organizer 控制台中看到的日志:
Jan 17 16:50:53 My-iPad Sec Sec[292] <Warning>: WLRequestBuilder.initWithRootUrl else_url: https://domain.com:443/MyApp/apps/services/api/MyApp/ipad/0/query
Jan 17 16:50:55 My-iPad Sec Sec[292] <Warning>: LSHelperClient: Session started with polling: NO
Jan 17 16:50:59 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:50:59 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLRequest requestFailed:]:338::Status code='0' error='The request timed out'
Jan 17 16:50:59 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:50:59 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:50:59 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLClient onInvokeProcedureFailure:userInfo:]:696::response string=''
Jan 17 16:50:59 My-iPad kernel[0] <Debug>: AppleAP3GDL::handleInterrupt2 FIFO is Empty
Jan 17 16:51:08 My-iPad Sec Sec[292] <Warning>: WLRequestBuilder.initWithRootUrl else_url: https://domain.com:443/MyApp/apps/services/api/MyApp/ipad/0/query
Jan 17 16:51:14 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:14 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLRequest requestFailed:]:338::Status code='0' error='The request timed out'
Jan 17 16:51:14 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:14 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:14 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLClient onInvokeProcedureFailure:userInfo:]:696::response string=''
Jan 17 16:51:17 My-iPad Sec Sec[292] <Warning>: WLRequestBuilder.initWithRootUrl else_url: https://domain.com:443/MyApp/apps/services/api/MyApp/ipad/0/query
Jan 17 16:51:23 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:23 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLRequest requestFailed:]:338::Status code='0' error='The request timed out'
Jan 17 16:51:23 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:23 My-iPad Sec Sec[292] <Warning>: Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.
Jan 17 16:51:23 My-iPad Sec Sec[292] <Warning>: [ERROR] Worklight: -[WLClient onInvokeProcedureFailure:userInfo:]:696::response string=''
Jan 17 16:51:33 My-iPad Sec Sec[292] <Warning>: WLRequestBuilder.initWithRootUrl else_url: https://domain.com:443/MyApp/apps/services/api/MyApp/ipad/0/query
Jan 17 16:51:40 My-iPad Sec Sec[292] <Warning>: DeviceAuthManager:getWorklightUniqueDeviceId --> returning UUID from the keychain
Jan 17 16:51:40 My-iPad Sec Sec[292] <Warning>: WLRequestBuilder.initWithRootUrl else_url: https://domain.com:443/MyApp/apps/services/api/MyApp/ipad/0/query
让我知道会出现什么问题以及我们还能做些什么。我们的后端 API 非常快,我们在毫秒内就能得到响应。
我们在程序方面做了什么:
var timeout = 600000;
var invocationOptions =
onSuccess: LoginSuccess,
onFailure: LoginFail,
timeout: timeout
;
在适配器 XML 文件中:
<procedure name="Authentication" requestTimeoutInSeconds="600000"/>
我们已经用 HTTP 和 HTTPS 尝试过这个实验,并且遇到了同样的问题(超时)。
当我们启动应用程序时,我们会收到wlclient init success
。
【问题讨论】:
【参考方案1】:不要在适配器 XML 文件中设置高超时。 600.000 秒超时意味着用于连接后端的线程将在超时前等待 166.6 小时,这很容易杀死您的服务器功能:)
通常您希望您的适配器后端超时是您在应用程序适配器连接中允许的最大值。例如。如果您在应用中使用的最大超时时间为 60 秒 - 这也是适配器后端段中使用的值。
现在,关于应用适配器部分。 AFAIR 默认超时为 30 秒。这对于 2G 网络通常也足够了。但是在某些情况下,这可能有点低。您可以使用 getNetworkInfo() API (http://pic.dhe.ibm.com/infocenter/wrklight/v6r1m0/index.jsp?topic=%2Fcom.ibm.worklight.apiref.doc%2Fhtml%2Frefjavascript-client%2Fhtml%2FWL.Device.html) 来检测您是否使用 WIFI/Mobile 和 3g/2g 等。一旦您使用的是慢速网络 - 增加超时时间。如果您使用的是快速网络 - 没有理由让用户等待太久,请减少超时。
【讨论】:
【参考方案2】:您的后端速度非常快,但这是一个内部系统。
使用 3G 或 WiFi 时,速度通常很快。 使用 2G 或更少时,速度通常要慢得多。
您是否尝试增加 WL.Client.invokeProcedure
以及适配器过程中的超时值?
这些将允许客户端和/或服务器等待更长时间的响应。这在网络速度非常慢的情况下应该会有所帮助。
查看这些问题:
How to increase the adapter procedure timeout value in Worklight? IBM Worklight 6.0.0.1 - Timeout setting in Adapters【讨论】:
是的,我们已经尝试过这些东西,但没有用。在进行了如此多的研发和更改之后,我们将在 *** 上发布。 这是什么意思?您尝试了哪些设置?您是否在 invokeProcedure 和过程上都尝试了 10 分钟,但仍然失败?编辑问题并详细说明您做了哪些“实验”,因为您根本没有提到这一点。 另外,您是否尝试过使用 HTTP 而不是 HTTPS?有区别吗?哪个功能失败了?这是登录吗?连接到服务器?一些数据检索程序?什么失败了? 无论如何你都会获得 wlclient init 成功。这个消息是关于客户端框架而不是连接,所以再次失败 - 与服务器的连接(这个“身份验证”功能是做什么的?)?您的服务器架构中是否有防火墙或任何其他服务器或任何东西? 但如果是这种情况,为什么同一个应用程序正在其他网络上运行。是的,我们有防火墙和其他服务器。以上是关于IBM Worklight 6.1 - 如何在较慢的网络中处理超时?的主要内容,如果未能解决你的问题,请参考以下文章
IBM Worklight 6.1 - 如何将应用程序连接到远程 Worklight 服务器?
IBM Worklight 6.1 - 如何集成 Ionic 框架?
IBM Worklight 6.1 - 如何提供可访问性支持
IBM Worklight 6.1 - 如何在适配器中发送帖子值?