4

我有一个带有 HTTP 适配器的 Worklight 应用程序,该适配器连接到另一个应用程序,以便检索要在移动设备上显示的数据(目前正在使用 Android 4.0.4 进行测试)。

当应用程序启动时,我从我的 HTTP 适配器调用三个过程并显示所有三个过程的结果。

当我在浏览器中运行我的应用程序并将其预览为通用时,一切正常。
当我在实际手机上运行应用程序时会出现问题。大多数情况下,我的过程调用中的 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" />

当我从程序中删除 securityTests 时,错误似乎不太频繁发生,但仍然发生。

这里有什么问题?或者如何调试 Worklight Server 以确定原因?

我正在使用版本为 6.0.0.20130701-1413 的 Eclipse Worklight 插件。

4

2 回答 2

2

这听起来与不久前发现的竞争条件缺陷非常相似。

几种可能的解决方法:

  1. 确保WL.Client.connect 调用适配器过程之前
  2. 在应用程序启动后允许一些延迟,然后才调用适配器过程
  3. 您也可以尝试将其添加到您的 JavaScript:

    wl_noDeviceProvisioningChallengeHandler.handleFailure = function() {
        WL.Client.connect();
    };
    
  4. 与上述 3 相同,但具有WL.Client.reloadApp()

问题:在 initOptions.js 中,你设置connectOnStartup为“true”还是“false”?

于 2013-07-19T15:26:27.700 回答
1

在调用程序之前,您必须调用 WL.Client.connect() 并等待它的成功回调。

于 2013-07-21T08:47:20.863 回答