我有一个带有HTTP适配器的Worklight应用程序,该适配器连接到另一个应用程序,以便检索要在移动设备上显示的数据(目前正在使用Android 4.0.4进行测试)。
当应用程序启动时,我从HTTP适配器调用三个过程,并显示所有三个过程的结果。
当我在浏览器中运行我的应用程序并将其预览为Common时,一切都很好
当我在实际的手机上运行应用程序时,就会出现问题。大多数时候,我的1或2个过程调用失败,并且数据不显示,但其中一个(第一个)似乎总是有效的。在极少数情况下,所有3个过程调用都会检索数据,但我无法始终如一地再现这种情况。
当过程失败时,我会在Worklight Development Server控制台中收到错误:
[ERROR ] FWLSE4007E: Received bad token from client. Server token:'null', client token:'b3fuqgdid2701hu855n89pldpk'. [project trunk]
有时,我会收到这个错误,但它并不常见:
[ERROR ] FWLSE0203E: Received bad instance Id from client. Server instance Id:'3f9eveddc7br5mq3ll0nq89miu', client instance Id:'ut5m5f01i3bkq5l78m54uq137o'. [project trunk]
应用程序总是尝试WL.Client.invokeProcedure所有过程,当调用成功时,我的onSuccess函数会运行,但当其他过程无法加载其数据时,onFailure函数永远不会发生。
我的适配器如下所示:
<displayName>Adapter</displayName> <description>Adapter</description> <connectivity> <connectionPolicy xsi:type="http:HTTPConnectionPolicyType"> <protocol>http</protocol> <domain>10.50.22.161</domain> <port>9000</port> </connectionPolicy> <loadConstraints maxConcurrentConnectionsPerNode="5"/> </connectivity> <procedure name="getProcesses" securityTest="securityTest" /> <procedure name="getTasks" securityTest="securityTest" /> <procedure name="metricsList" securityTest="securityTest" /> <procedure name="getMetric" securityTest="securityTest" /> <procedure name="getAllHashTags" securityTest="securityTest" /> <procedure name="getMessages" securityTest="securityTest" /> <procedure name="getMentions" securityTest="securityTest" /> <procedure name="getConversations" securityTest="securityTest" /> <procedure name="getServerTime" securityTest="securityTest" />当我从过程中删除securityTest时,错误似乎不那么频繁,但仍然会发生。
这里有什么问题?或者,如何调试Worklight Server以确定原因?
我使用的是版本为6.0.0.2012130701-1413的Eclipse Worklight插件。
这听起来与不久前发现的竞赛条件缺陷非常相似。
几种可能的解决方案:
- 在调用适配器过程之前,请确保
WL.Client.connect
- 在应用程序启动后允许一些延迟,然后才调用适配器过程
-
您也可以尝试将其添加到您的JavaScript:中
wl_noDeviceProvisioningChallengeHandler.handleFailure = function() { WL.Client.connect(); };
-
与上述3相同,但带有
WL.Client.reloadApp()
问题:在initOptions.js中,您是否将connectOnStartup
设置为"true"或"false"?
在调用过程之前,必须调用WL.Client.connect()并等待其成功回调。