2010-05-10 15 views
5

मैं एक Runnable वर्ग के run() विधि में FacesContext.getCurrentInstance() फोन करके FacesContext पाने के लिए कोशिश कर रहा हूँ में अशक्त देता है, लेकिन यह null देता है।FacesContext.getCurrentInstance() Runnable वर्ग

public class Task implements Runnable { 

    @Override 
    public void run() { 
     FacesContext context = FacesContext.getCurrentInstance(); // null! 
     // ... 
    } 

} 

यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?

उत्तर

12

FacesContext धागा HTTP अनुरोध जो FacesServlet, एक FacesContext बनाने के लिए जिम्मेदार लागू करने के लिए जिम्मेदार में एक ThreadLocal चर के रूप में संग्रहीत किया जाता है। यह थ्रेड आमतौर पर केवल जेएसएफ प्रबंधित बीन विधियों के माध्यम से जाता है। FacesContext उस थ्रेड द्वारा उत्पन्न अन्य धागे में उपलब्ध नहीं है।

आपको वास्तव में अन्य धागे में इसकी आवश्यकता भी नहीं होनी चाहिए। इसके अलावा, जब आपका धागा स्वतंत्र रूप से शुरू होता है और चलता है, अंतर्निहित HTTP अनुरोध तत्काल HTTP प्रतिक्रिया को संसाधित करना जारी रखेगा और फिर गायब हो जाएगा। आप वैसे भी HTTP प्रतिक्रिया के साथ कुछ करने में सक्षम नहीं होंगे।

आपको अपनी समस्या को अलग-अलग हल करने की आवश्यकता है। खुद से पूछें: आपको इसके लिए क्या चाहिए? कुछ जानकारी प्राप्त करने के लिए? बस इसके निर्माण के दौरान Runnable पर जानकारी पास करें।

नीचे दिया गया उदाहरण मानता है कि आप थ्रेड में कुछ सत्र स्कॉप्ड ऑब्जेक्ट तक पहुंच बनाना चाहते हैं।

public class Task implements Runnable { 

    private Work work; 

    public Task(Work work) { 
     this.work = work; 
    } 

    @Override 
    public void run() { 
     // Just use work. 
    } 

} 
Work work = (Work) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("work"); 
Task task = new Task(work); 
// ... 

आप फिर भी अंत में जैसे ग्राहक को सूचित करने की जरूरत है कि धागा का काम खत्म हो गया है, तो आपको उदा। से अलग समाधान की तलाश करनी चाहिए एक चेहरे संदेश या तो जोड़ना। जवाब "पुश" का उपयोग करना है। यह एसएसई या websockets के साथ हासिल किया जा सकता है। एक ठोस वेबसाइकिल उदाहरण इस संबंधित प्रश्न में पाया जा सकता है: Real time updates from database using JSF/Java EE। यदि आप प्राइमफेस का उपयोग करते हैं, तो <p:push> देखें। यदि आप OmniFaces का उपयोग करते हैं, तो <o:socket> देखें।


असंबंधित ठोस समस्या, मैन्युअल Runnable रों बनाने और मैन्युअल रूप से एक जावा EE वेब अनुप्रयोग में धागे को उत्पन्न करने के लिए खतरनाक है। निम्नलिखित क्यू & एक को सिर चेतावनियां के बारे में सभी जानने के लिए और कैसे यह वास्तव में किया जाना चाहिए:

संबंधित मुद्दे