メッセージが並行して来る場合、以下のNewProcessorの最大 10 スレッドが一度に作成されます。テストでは、同じパラメーターを持つ 20 個のメッセージが使用され、 Netドメインの DB に 1 つのレコードしかないと予想されますが、複数のレコードが作成されました。
数時間のさまざまな変更の後、私はまだ問題を理解できませんでした...
class NewProcessor implements Runnable {
...
NewService newService = ApplicationContextHolder.getBean("newService")
public void run(){
process()
}
public boolean process(){
...
def obj = newService.process(param)
...
}
}
class NewService {
NetService netService
...
public Info process(String param){
Info info = new Info()
...
info.net = netService.getNet(param)
...
...
info.save()
}
...
}
class NetService {
public synchronized Info getNet(String param) {
Rule trule = Rule.findByParam(param)
Net net = Net.findByRule(trule)
if (!net){
net = new Net(rule: trule).save(flush: true, validate: false)
}
return net
}
....
}