2013-01-09 10 views
19

मुझे एक बीन लिखने की ज़रूरत है जो इसे कितनी बार एक्सेस किया गया था इसके काउंटर के रूप में कार्य करेगा। जब एक ही समय में एक से अधिक अनुरोध पर विचार यह ठीक है:जेईई 6 @ आवेदन स्कोप्ड बीन और समरूपता

मुझे लगता है कि

@ApplicationScoped 
class VisitsCounter { 

    private AtomicInteger counter; 

    @PostConstruct 
    public void construct() { 
     counter = new AtomicInteger(0); 
    } 

    public int visited() { 
     return counter.incrementAndGet(); 
    } 
} 

मेरा प्रश्न की तरह AtomicInteger साथ @ApplicationScoped सेम का उपयोग करने का सोच रहा हूँ है? या मुझे @ConcurrencyManagement और @Lock एनोटेशन के साथ खेलने की ज़रूरत है? मुझे लगता है कि Atomic* चाल चलाना चाहिए लेकिन मुझे यकीन नहीं है।

क्या यह वही लागू होता है जब मेरे पास फ़ील्ड के रूप में थ्रेड सुरक्षित संग्रह होते हैं? जैसे कहें कि मेरे पास

@ApplicationScoped 
class ValuesHolder { 

    private List<String> values; 

    @PostConstruct 
    public void construct() { 
     values = Collections.synchronizedList(new LinkedList<String>()); 
    } 

    public void insert(String value) { 
     values.add(value); 
    } 

    public String remove(String value) { 
     return values.remove(value); 
    } 
} 

ऑपरेशन वास्तव में थ्रेड-सुरक्षित हैं?

ऐसा कहा जाता है कि बीन की स्थिति में संशोधन होने पर समवर्ती एनोटेशन और ताले का उपयोग किया जाना चाहिए, लेकिन क्या होगा यदि मेरी सूची पहले से ही थ्रेड सुरक्षा का ख्याल रखती है?

+2

लागू होने के रूप में, मुझे कोई समरूपता समस्या नहीं दिखाई देती है। – McDowell

उत्तर

31

सीडीआई में आपके पास समवर्ती प्रबंधन नहीं है, इसलिए @ApplicationScoped इंजेक्शन ऑब्जेक्ट की कार्डिनालिटी को बताता है (यानी इंजेक्शन इंजन को आपके बीन का केवल एक उदाहरण बनाने और इसे सभी एप्लिकेशन में उपयोग करने के लिए निर्देशित करता है)। यह आपके बीन को ईजेबी में परिवर्तित नहीं करता है, और किसी भी समवर्ती बाधा को लागू नहीं करता है।

इसलिए, उदाहरणों में ऑपरेशन स्वाभाविक रूप से थ्रेड सुरक्षित हैं, AtomicInteger और सिंक्रनाइज़ सूची के लिए धन्यवाद, यह सामान्य रूप से सच नहीं है।

सामान्य आप कर सकते हैं:

  • मैन्युअल सूची सिंक्रनाइज़ मानक संगामिति पुरातन के माध्यम से पहुँचता है (जैसा कि तुमने क्या किया)

  • या javax.ejb.Singleton एनोटेशन, जो करने के लिए आवेदन सर्वर का निर्देश का उपयोग समेकन का प्रबंधन करें। यह आपके बीन को ईजेबी में बदल देता है और डिफ़ॉल्ट रूप से @ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) और @Lock(LockType.WRITE) लागू करता है।

वैसे, @ConcurrencyManagement और @Lock सिंगलटन सत्र सेम पर ही उपलब्ध हैं।

+0

अच्छा एक। मैं सोच रहा था कि क्या होगा यदि मैंने '@ एप्लिकेशनफॉप्ड' बीन को '@ स्टेटफुल' ईजेबी में इंजेक्शन दिया, ऐसा लगता है कि आप समस्याओं में भाग ले सकते हैं, क्योंकि ईजेबी के 2 उदाहरणों से आप एक ही डेटा को संशोधित कर सकते हैं। – dalvarezmartinez1

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