我有一个奇怪的问题(希望你能提供帮助):我正在开发一个GWT Web应用程序,有时候同时进行超过4到5个GWT RPC调用 - 就时间而言。 / p>
每隔一段时间 - 也许每15个电话一次?一次通话中的返回对象被分配了#39;到另一个。我通过在客户端使用gwt-log库来证明这一点。
此处,HistoryChangesCount调用的返回对象也已分配给modelingGetTemplates调用。
因此导致调用的客户端文件中出现ClassCastException,与onSuccess方法位于同一行。
你对我如何避免这种情况有什么建议吗?
PS - 我在错误级别记录每个响应object.toString()。我知道这不是最好的做法。它仅用于故障排除。
[14:38:01.026] "(-:-) 2014-04-03 14:38:01,025 [ERROR] getHistoryChangesCount - HistoryPreviewFacet - SUCCESS RETURNED: HistoryChangesCount{dateToNumberOfChangesMap={Mon Mar 31 03:00:00 GMT+300 2014=3}, lastUpdatedOn=Mon Mar 31 11:11:02 GMT+300 2014}
"
[14:38:01.163] "(-:-) 2014-04-03 14:38:01,162 [ERROR] modelingGetTemplates - ModelingTemplatesDropdown - SUCCESS RETURNED: HistoryChangesCount{dateToNumberOfChangesMap={Mon Mar 31 03:00:00 GMT+300 2014=3}, lastUpdatedOn=Mon Mar 31 11:11:02 GMT+300 2014}
"
[14:38:01.175] "(-:-) 2014-04-03 14:38:01,174 [ERROR] Browser: null
java.lang.ClassCastException
at Unknown.iCb(StackTraceCreator.java:174)
at Unknown.sd(StackTraceCreator.java:508)
at Unknown.Txn(Throwable.java:46)
at Unknown.kIc(Cast.java:46)
at Unknown.rff(ModelingTemplatesDropdown.java:79)
at Unknown.bXi(AsyncWrapperForRPCManager.java:38)
at Unknown.Loe(RequestCallbackAdapter.java:232)
at Unknown.MWb(Request.java:258)
at Unknown.qXb(RequestBuilder.java:412)
at Unknown.anonymous(XMLHttpRequest.java:351)
at Unknown.eBb(Impl.java:189)
at Unknown.hBb(Impl.java:242)
at Unknown.anonymous(Impl.java:70)
"
以下是对modelingGetTemplates的成功调用:
[14:37:24.933] "(-:-) 2014-04-03 14:37:24,932 [ERROR] modelingGetTemplates - ModelingTemplatesDropdown - SUCCESS RETURNED: [Advanced Business Application, Advanced Business Transaction, TestTemplate]
"
我正在使用vanilla GWT-RPC。我只有一个扩展AsyncWrapper用于记录的类。我还创建了一个客户端队列,将并行调用的数量限制为4,但即使如此,它仍然会发生。
版本: GWT:2.5.1 我也使用Sencha GXT,不确定是否相关。
最终结果是我的小部件一直停留在等待数据的加载上。当然愤怒的用户:)
答案 0 :(得分:0)
记录我解决这个问题的方式,而不是修复它:)(因为我找不到修复方法)
我创建了一个客户端GWT RPC调用队列。 UI进行的任何RPC调用都是对队列的调用,并且队列将管理(在高负载,读取延迟期间),实际执行调用。
它的行为类似于线程池。我有一个常数,我可以同时进行多少次并行呼叫,以及两次呼叫之间的最小时间间隔。我相信它最终设置为200毫秒。
所以通过以上所述我(几乎)从未遇到过这个问题。频率很低,没人注意到了。
我猜测原因如下:
我相信GWT框架有一些使用依赖于调用时间戳的密钥的映射,如果两个调用同时发生,映射可以切换调用,将结果搞乱到调用映射。 / p>