2012-05-10 9 views
5

में सिंक्रनाइज़ किए गए तरीकों में सर्वश्रेष्ठ अभ्यास मेरे पास एक जेएसएफ एप्लीकेशन है जहां उपयोगकर्ता कुछ फाइलें बनाते हैं। समस्या यह है कि, उन्हें अपलोड करना होगा और पुष्टिकरण संदेश भी डाउनलोड करना होगा और अपलोड/डाउनलोड करने की प्रक्रिया अनन्य है, उस समय केवल एक ही उपयोगकर्ता, क्योंकि प्रमाणीकरण के लिए तकनीकी उपयोगकर्ता/पासवर्ड की आवश्यकता होती है। मेरे सवाल है, मैं कैसे उदाहरण के लिए, उपयोगकर्ता, प्रोटोकॉल का एक प्रकार के लिए प्रतीक्षा की प्रक्रिया को पारदर्शी बनाने के कर सकते हैं:जेएसएफ और जावा

  • कनेक्शन
  • प्रमाणीकरण
  • अपलोड फ़ाइल
  • डाउनलोड पुष्टिकरण फ़ाइल पाने के लिए इंतजार कर
  • किया

उत्तर

3

किसी एकल थ्रेड निष्पादक का प्रयोग करें।

@ManagedBean 
@ApplicationScoped 
public class FileManager { 

    private ExecutorService executor; 

    @PostConstruct 
    public void init() { 
     executor = Executors.newSingleThreadExecutor(); 
    } 

    public Result process(Task task) throws InterruptedException, ExecutionException { 
     return executor.submit(task).get(); 
    } 

    @PreDestroy 
    public void destroy() { 
     executor.shutdownNow(); 
    } 

} 

कहाँ Result सिर्फ अपने JavaBean वस्तु वांछित परिणाम युक्त और Task देखो इस तरह है: (? अपलोड की गई फ़ाइल)

public class Task implements Callable<Result> { 

    private Data data; 

    public Task(Data data) { 
     this.data = data; 
    } 

    @Override 
    public Result call() throws Exception { 
     Result result = process(data); // Do your upload/download/auth job here. 
     return result; 
    } 

} 

Data सिर्फ अपने JavaBean वस्तु इनपुट डेटा युक्त है। अंत में अपने प्रबंधित सेम में से यह आह्वान इस प्रकार है:

@ManagedBean 
@RequestScoped 
public class Bean { 

    @ManagedProperty("#{fileManager}") 
    private FileManager fileManager; 

    public void submit() { 
     try { 
      Data data = prepareItSomehow(); 
      Result result = fileManager.process(new Task(data)); 
      // Now do your job with result. 
     } 
     catch (Exception e) { 
      // Handle 
     } 
    } 

    // ... 
} 

इस तरह सभी कार्यों में पहली में एक भी thead द्वारा कार्रवाई की जाएगी - पहले बाहर आदेश।

यदि आपका कंटेनर ईजेबी का समर्थन करता है, तो अन्य तरीके भी हैं।

+0

धन्यवाद, मैं इसे आज़मा दूंगा –