2010-04-21 4 views
6

मैं राज्यविहीन EJB में 2 पीयू उपयोग कर रहा हूँ और उनमें से हर एक पद्धति पर शुरू हो जाती है:"स्थानीय लेनदेन में पहले से ही 1 गैर-एक्सए संसाधन" अपवाद को रोकने के लिए कैसे करें?

@PersistenceContext(unitName="PU") 
private EntityManager em; 
@PersistenceContext(unitName="PU2") 
private EntityManager em2; 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public void getCandidates(final Integer eventId) throws ControllerException { 
    ElectionEvent electionEvent = em.find(ElectionEvent.class, eventId); 
    ... 
    Person person = getPerson(candidate.getLogin()); 
    ... 
} 

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
private Person getPerson(String login) throws ControllerException { 
    Person person = em2.find(Person.class, login); 
    return person; 
} 

इन तरीकों में इस अपवाद से बचने के लिए REQUIRES_NEW transcaction से एनोटेट। जब मैं javaFX एप्लेट से इन पद्धतियों को बुला रहा था, तो सभी उम्मीद के अनुसार काम करते थे। अब मैं उन्हें जेएक्स-आरएस webservice से कॉल करने की कोशिश कर रहा हूं (मुझे कोई तार्किक अंतर नहीं दिख रहा है क्योंकि दोनों मामलों में ईजेबी प्रारंभिक संदर्भ में देखा गया था) और मुझे यह अपवाद मिल रहा है। जब मैंने ग्लासफ़िश 2.1 कनेक्शन पूल में XADatasource सेट किया, तो मुझे em2 पर nullpointer अपवाद मिला।

कोई विचार क्या अगला प्रयास करना है?

सादर

+0

यह भी देखें http://stackoverflow.com/questions/2413911/if-i-access-usertransaction-does-this-mean-that-i-use-2-phase-commit-or-xa/2425585#2425585 – ewernli

उत्तर

5

ठीक है,

अब हल हो गया है। अगर किसी को भी इसी तरह से सामना करना पड़ता है तो मैं साझा करूंगा। नेटबीन तैनाती के साथ पूरी समस्या थी। वे ग्लासफ़िश कनेक्शन पूल में सेटिंग्स को ओवरराइट करते हैं और जब आप उन्हें रनटाइम पर उचित सेट करते हैं, तो आपको निप या अनुपलब्ध पासवर्ड मूर्खतापूर्ण सामान मिल जाता है। इसे संपादित करने की जगह सूर्य-संसाधन.एक्सएमएल है। एक्सएमएल तत्व में डेटासोर्स-क्लासनाम और आरएस-प्रकार का गुण है। डर्बी डेटाबेस के मामले में क्या करने की आवश्यकता है:

<jdbc-connection-pool ... 
     datasource-classname="org.apache.derby.jdbc.ClientXADataSource" 
     res-type="javax.sql.XADataSource"> 
    ... 
</jdbc-connection-pool> 

अब एक आकर्षण की तरह काम करता है।

2

मैं राज्यविहीन EJB में 2 पीयू उपयोग कर रहा हूँ और उनमें से हर एक पद्धति पर

दरअसल शुरू हो जाती है। लेकिन आप दूसरी विधि को पहले से कॉल कर रहे हैं ताकि आप एक वितरित लेनदेन कर रहे हों और आपको इसके लिए एक्सए का उपयोग करने की आवश्यकता है (कम से कम संसाधन में से एक के लिए क्योंकि ग्लासफ़िश last agent optimization का समर्थन करता है जो एक गैर-एक्सए संसाधन को शामिल करने की अनुमति देता है) । दूसरे शब्दों में, XADataSource के रूप में अपने डेटासोर्स में से एक को सेट करने का तरीका है।

यदि आपको ऐसा करने में कोई त्रुटि मिलती है, तो कृपया बिल्कुल और स्टैकट्रैक के बारे में विवरण जोड़ें।

+0

धन्यवाद, मैं इसे एएसएपी पोस्ट करूंगा लेकिन मतलब में, क्या persadence.xml में XADataSource निर्दिष्ट करने का कोई तरीका है? मैं इसे कहीं भी नहीं ढूंढता और हर बार जब मैं नेटबीन के माध्यम से तैनाती करता हूं तो कनेक्शन पूल में ग्लासफ़िश सेटिंग सादे डेटासोर्स पर वापस लाई जाती है। – zeratul021

1

पहली बार दूसरी विधि को कॉल करते समय, यह एक ईजेबी विधि कॉल नहीं है। यह इसे केवल एक नियमित विधि कॉल के रूप में मानता है और @TransactionAttribute पर नहीं देखता है। यदि आप एक ही ईजेबी को कॉल करना चाहते हैं, तो आप SessionContext इंजेक्ट कर सकते हैं और getBusinessObject पर कॉल कर सकते हैं। फिर लौटे हुए ईजेबी पर विधि को कॉल करें।

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

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