0

メッセージが並行して来る場合、以下の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
         }

         ....
    } 
4

1 に答える 1

1

以下のように@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
     }

     ....
}
于 2014-02-06T11:47:58.987 に答える