मैं आवेदन स्तर (विशेष रूप से, एक संदेश संचालित बीन) के आस-पास कुछ गुणों को पारित करने के लिए EJBContext
का उपयोग करने की योजना बना रहा हूं, जो कि जीवनशैली कॉलबैक को सीधे इंजेक्शन या पारित पैरामीटर (ग्रहण लिंक्स में सत्र श्रोता, इकाई लाइफसाइक्ल कॉलबैक इत्यादि) नहीं हो सकता है। ।), और वह कॉलबैक JNDI के माध्यम से EJBContext
प्राप्त कर रहा है।EJBContext getContextData का उपयोग करना - क्या यह सुरक्षित है?
यह काम पर प्रतीत होता है लेकिन क्या कोई छुपा गेटचास है, जैसे थ्रेड सुरक्षा या ऑब्जेक्ट जीवनकाल जो मुझे याद आ रही है? (मान लें पारित किया जा रहा संपत्ति के मूल्य स्ट्रिंग की तरह अडिग या लांग है।)
नमूना सेम कोड
@MessageDriven
public class MDB implements MessageListener {
private @Resource MessageDrivenContext context;
public void onMessage(Message m) {
context.getContextData().put("property", "value");
}
}
तो कॉलबैक कि EJBContext
public void callback() {
InitialContext ic = new InitialContext();
EJBContext context = (EJBContext) ic.lookup("java:comp/EJBContext");
String value = (String) context.getContextData().get("property");
}
मैं क्या सोच रहा हूँ है की खपत, क्या मुझे यकीन है कि contextData
मानचित्र सामग्री केवल वर्तमान आवेषण/धागे के लिए दृश्यमान हैं? दूसरे शब्दों में, यदि दो धागे callback
विधि एक साथ चल रहे हैं, और दोनों JNDI से EJBContext
देख रहे हैं, तो वे वास्तव में contextData
मानचित्र सामग्री प्राप्त कर रहे हैं?
और, कैसे करता है कि वास्तव में काम - EJBContext
JNDI देखने वास्तव में एक ThreadLocal
की तरह संरचना अंततः के चारों ओर एक आवरण वस्तु से दिया जाता है?
अच्छा सुझाव। 'EJBContext' के लिए मैं जिस पैटर्न का उपयोग कर रहा हूं वह लगभग समान है - एक ही स्थान पर '@ संसाधन' के साथ इंजेक्शन, मानचित्र में ऑब्जेक्ट्स डालना, और फिर कहीं और जेएनडीआई में देखना। तो सवाल यह है कि 'EJBContext' ऑब्जेक्ट 'ट्रांज़ेक्शन सिंक्रनाइज़ेशन रजिस्ट्री' – wrschneider
ट्रांज़ेक्शन सिंक्रनाइज़ेशन रजिस्ट्री की एक सीमा है: इसे हमेशा एक लेनदेन की आवश्यकता होती है, लेकिन कुछ मामलों में लेनदेन के बिना सूचनाओं को प्रसारित करना आवश्यक है – obe6