0

Spring で、永遠にループし、LinkedBlockingQueue.take() でブロックしてオブジェクトを処理するスレッドを作成する必要があります (コントローラーはオブジェクトをそのキューに入れます)。@Controller 内で処理されている場合、私のコードは正常に動作します。ただし、スレッドに移動したので、Hibernate から複数の LazyInitializationException が発生します。一言で言えば、私のスレッドの擬似コードのスケルトンは次のとおりです。

@Component
public class AsynchronousConsumer implements Runnable
{
   @Autowire
   // Service Layer and other goodies (all correctly injected)

   @PostConstruct
   public void init(){
      (new Thread(this)).start();
   }

   // Note that an @Controller action is placing MyBean in the queue 
   protected static LinkedBlockingQueue<MyBean> queue = new LinkedBlockingQueue<MyBean>();

   @Override
   public void run()
   {
      while(true)
      {
         MyBean myBean = queue.take();
         this.processBean(myBean); // do the processing
      }    
   }    
   void processBean(MyBean m)
   {
      // Hybernate exceptions happen when retrieving objects from the DB
   }
}

ここで何か間違ったことをしていますか?Spring/Hibernate を完全に認識できるように、スレッドを開始するにはどうすればよいですか?

4

1 に答える 1

1

独自のスレッドを作成する必要があるかどうかはわかりません。春にタスクスケジューラとエグゼキュータを使用することで、これを実行できるはずです。タスクとスケジューリング

于 2012-07-18T11:20:33.277 に答える