2013-10-26 54 views
1

在我使用JSF的Web應用程序中,我有100條從前端選擇的記錄(使用複選框),並且單擊按鈕時,需要啓動所選的100條記錄(它將使用RESTAPI調用創建調查),該調用將調用將調用REST API的bean中的方法。如何在jsf中使用bean中的線程

目前每個記錄按順序處理,每個記錄平均需要20秒。所以如果我選擇將近100條記錄,我會收到請求超時..我打算使用線程在bean中調用該方法..請問我該怎麼辦? bean中的方法是以reference number爲參數的initiatereview。

回答

4

託管bean最終是一個POJO。因此,你的問題歸結爲如何使用多個線程執行類似的任務在不同的對象,所以最終是一個Java問題而不是JSF問題。爲此,您必須使用接口ExecutorService。一個簡單的例子來實現:

@ManagedBean 
@RequestScoped 
public class SomeBean { 
    List<String> records; 
    //other fields, constructor, getters and setters... 
    public void foo() { 
     int poolSize = records.size(); 
     ExecutorService executor = Executors.newFixedThreadPool(poolSize); 
     for (final String record : records) { 
      executor.execute(new Runnable() { 
       public void run() { 
        //tasks to perform in the threads... 
       } 
      }); 
     } 
     executor.shutdown(); 
    } 
} 

的一些注意事項,以這個例子:

  • poolSize值不應records.size(),我只是用這個例子作爲有關創建每一個工作線程來執行。請注意,您應該創建儘可能多的服務器支持的線程。這個變量的實際價值取決於你的測試結果。我會建議使用10作爲初始值,然後更改它來衡量性能結果。
  • 您可以創建一個實現Runnable接口的類,該接口將保存要完成的任務,而不是創建匿名類。

請注意,這是一個可能的解決方案。 IMO最好將記錄列表發送給將處理它們的組件,例如通過JMS調用。然後組件會調用您的寧靜服務以及它必須處理記錄的其他事情。

+0

+1我認爲JMS是更好的答案。 –

+0

你能爲我提供一個JMS的例子嗎?點擊commndbutton時,我正在調用具有其他方法的bean中的initiatereview方法。啓動重新查看方法將選擇一個obj作爲參數。啓動重審方法依次調用RESTAPI調用和發送電子郵件的類中的另一種方法。我需要在一個線程中執行此操作。我怎樣才能將參數傳遞給運行中的方法..我可以使用實現runnable的類並在構造函數中傳遞參數.. – hemsush

+0

@hemsush在此檢查:https://blogs.oracle.com/soaproactive/entry/jms_step_2_using_the –