2012-07-18 38 views
0

我需要在Spring中創建一個線程,它永遠循環並在LinkedBlockingQueue.take()中處理一個對象以處理其中的對象(控制器將對象放入該隊列中)。如果在@Controller中處理,我的一段代碼工作正常。但是,現在我將它移入線程中,我從Hibernate中獲取了多個LazyInitializationException。簡而言之,我的主題的僞代碼骨架是:在Spring中產生一個線程,它意識到其他bean

@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?

+0

當沒有hibernate會話綁定到線程時,發生懶惰初始化。也許你應該在你的交易配置上發佈更多信息。公開會議的視野? @Transactional註釋? ......那種東西。 – 2012-07-18 13:54:55

+0

@ G-Man你能不能更具體一些,我會很欣賞一些文檔,教程,例子的一些指示... – Pomario 2012-07-18 14:10:37

+0

沒有清晰的解決方案,因爲你沒有提供所有必需的信息。我所知道的是在你的應用程序的某個地方是一段代碼失敗,因爲當它嘗試懶加載某些內容時,沒有實時會話被綁定到線程。只要我不知道問題出在哪裏,以及應用程序的一般配置是什麼,我只是猜測。所以請提供有關您的休眠配置的附加信息。 其可能的這個問題可以通過在你的線程中注入一個sessionfactory來解決,並在while循環的每個循環中創建和打開會話。 – 2012-07-23 14:26:20

回答

0

我不確定是否需要創建自己的線程我認爲你應該可以通過在春天執行任務計劃程序和執行程序來完成此任務。 Task & Scheduling

相關問題