Grails 承诺丢失数据 - 似乎不等待对方完成
Grails promises losing data - seemingly not waiting for each other to complete
以下随机先调用getParentCustomers
或getAccountManagers
。当它工作时它工作正常。但是,无论哪个被调用第二个,都会将 null
传递给它。这些方法都不会以任何方式改变传入的值。我猜这些是从上下文中调用的,指向 response.salesChannels
的原始指针在任务之间丢失了。
Map response = [
salesChannels: null,
accountManagers: null,
parentCustomers: null,
isrs: null,
operatingUnits: null,
businessUnits: null
]
def t1 = task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
}
def t1b = task {
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
}
waitAll([t1a, t1b])
}
def t2 = task {
//... other stuff
}
def t3 = task {
//... other stuff
}
waitAll([t1, t2, t3])
return response
我什至尝试修改内部结构以利用 onComplete
。
...
onComplete([task {
return salesChannelApiService.get(salesChannel)
}], { salesChannels ->
response.salesChannels = salesChannels
def t1a = task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(salesChannels)
}
def t1b = task {
response.accountManagers = salesChannelTransformService.getAccountManagers(salesChannels)
}
waitAll([t1a, t1b])
})
...
然而,我还是得到了同样的结果。
注意:这也是随机的。有时它工作正常 - 将相同的列表传递给两种方法。但是当它坏了的时候,总是先发火的那个。
对此有什么想法吗?
以下解决方案目前有效。但是,我不知道为什么上面的代码块都没有。
有什么想法吗?
def t1 = createPromise()
task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = createPromise()
def t1b = createPromise()
task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
t1a.accept()
}
task {
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
t1b.accept()
}
onComplete([t1a, t1b], { a, b -> t1.accept() })
}
所以我认为线程在极少数情况下会出现一些问题,所以我删除了 getParentCustomers 和 getAccountManagers 之间的单独线程,因为它们无论如何都不进行外部调用。
我认为跨线程同时使用 response.salesChannels 会扰乱 response.salesChannels 的内存分配 - 每隔几百次调用就会随机抛出一个空指针异常。
这个好像靠谱多了
def t1 = createPromise()
task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = createPromise()
task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
t1a.accept()
}
onComplete([t1a], { a -> t1.accept() })
}
以下随机先调用getParentCustomers
或getAccountManagers
。当它工作时它工作正常。但是,无论哪个被调用第二个,都会将 null
传递给它。这些方法都不会以任何方式改变传入的值。我猜这些是从上下文中调用的,指向 response.salesChannels
的原始指针在任务之间丢失了。
Map response = [
salesChannels: null,
accountManagers: null,
parentCustomers: null,
isrs: null,
operatingUnits: null,
businessUnits: null
]
def t1 = task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
}
def t1b = task {
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
}
waitAll([t1a, t1b])
}
def t2 = task {
//... other stuff
}
def t3 = task {
//... other stuff
}
waitAll([t1, t2, t3])
return response
我什至尝试修改内部结构以利用 onComplete
。
...
onComplete([task {
return salesChannelApiService.get(salesChannel)
}], { salesChannels ->
response.salesChannels = salesChannels
def t1a = task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(salesChannels)
}
def t1b = task {
response.accountManagers = salesChannelTransformService.getAccountManagers(salesChannels)
}
waitAll([t1a, t1b])
})
...
然而,我还是得到了同样的结果。
注意:这也是随机的。有时它工作正常 - 将相同的列表传递给两种方法。但是当它坏了的时候,总是先发火的那个。
对此有什么想法吗?
以下解决方案目前有效。但是,我不知道为什么上面的代码块都没有。
有什么想法吗?
def t1 = createPromise()
task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = createPromise()
def t1b = createPromise()
task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
t1a.accept()
}
task {
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
t1b.accept()
}
onComplete([t1a, t1b], { a, b -> t1.accept() })
}
所以我认为线程在极少数情况下会出现一些问题,所以我删除了 getParentCustomers 和 getAccountManagers 之间的单独线程,因为它们无论如何都不进行外部调用。
我认为跨线程同时使用 response.salesChannels 会扰乱 response.salesChannels 的内存分配 - 每隔几百次调用就会随机抛出一个空指针异常。
这个好像靠谱多了
def t1 = createPromise()
task {
response.salesChannels = salesChannelApiService.get(salesChannel)
def t1a = createPromise()
task {
response.parentCustomers = salesChannelTransformService.getParentCustomers(response.salesChannels)
response.accountManagers = salesChannelTransformService.getAccountManagers(response.salesChannels)
t1a.accept()
}
onComplete([t1a], { a -> t1.accept() })
}