gpt4 book ai didi

multithreading - 具有多线程的Grails服务

转载 作者:行者123 更新时间:2023-12-02 15:29:42 25 4
gpt4 key购买 nike

如果并行发送消息,则一次最多创建10个以下 NewProcessor 线程。为了进行测试,使用了20条具有相同参数的消息,并且在数据库中 Net 域仅预期有一条记录,但是创建了多个记录。

经过数小时的各种更改后,我仍然不知道问题所在...


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
}

....
}

最佳答案

我必须通过将 @Transactional(propagation = Propagation.REQUIRES_NEW)添加到getNet()方法中来使其工作,如下所示。

class NetService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
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
}

....
}

关于multithreading - 具有多线程的Grails服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com