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 を完全に認識できるように、スレッドを開始するにはどうすればよいですか?