託管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調用。然後組件會調用您的寧靜服務以及它必須處理記錄的其他事情。
+1我認爲JMS是更好的答案。 –
你能爲我提供一個JMS的例子嗎?點擊commndbutton時,我正在調用具有其他方法的bean中的initiatereview方法。啓動重新查看方法將選擇一個obj作爲參數。啓動重審方法依次調用RESTAPI調用和發送電子郵件的類中的另一種方法。我需要在一個線程中執行此操作。我怎樣才能將參數傳遞給運行中的方法..我可以使用實現runnable的類並在構造函數中傳遞參數.. – hemsush
@hemsush在此檢查:https://blogs.oracle.com/soaproactive/entry/jms_step_2_using_the –