के साथ इवेंटबस के साथ पंजीकृत है, मैं थोड़ी देर के लिए जावा ईई में एक ही समस्या का हल ढूंढ रहा हूं। मैंने Axon और jdon देखा (पृष्ठ वास्तव में अच्छी तरह से अच्छा नहीं है :))। दोनों में इवेंट सोर्सिंग शामिल है जिसे मैं अपने नियोक्ता/ग्राहकों को "बेचना" नहीं कर सका। मैं डोमेन इवेंट्स चाहता था हालांकि मैं .NET/C# परियोजनाओं में उनके लिए बहुत अधिक उपयोग करता था। तो मैं निम्नलिखित के साथ आया ...
मैंने एक समान स्थिर डोमेनइवेंट ऑब्जेक्ट का उपयोग किया ताकि मुझे मेरे डोमेन मॉडल इकाइयों को लीक करने वाले वास्तविक कार्यान्वयन विवरण के बिना प्रकाशन तंत्र तक पहुंच प्रदान की जा सके। तो इस तरह से कॉल कुछ:
DomainEvents.fire(new MySampleEvent(...some params...));
एक पैटर्न और तंत्र कि CDI कल्पना में उपलब्ध है Events with @Observes है कि आप सभी सेवा उपलब्ध के साथ सामान्य सेम में कुछ घटनाओं पर प्रतिक्रिया के लिए अनुमति देते हैं। यह वही है जो डीआई फ्रेमवर्क जैसे Castle Windsor का उपयोग करते समय किया गया था जहां मैं इंटरफेस द्वारा जेनेरिक हैंडलर पंजीकृत कर सकता था। तो मुझे पर्यवेक्षकों (हैंडलर, श्रोताओं, जिन्हें आप उन्हें कॉल करना चाहते हैं) मिला है। उदाहरण:
@Stateless
public class MySampleEventObserver {
public void listen(@Observes MySampleEvent event) {
...
doSomethingWithEvent();
}
}
अब प्रकाशन (सीडीआई में फायरिंग) भाग के लिए। चूंकि संस्थाओं में सीडीआई तक पहुंचने का कोई तरीका नहीं है (अच्छे कारण से!) मैंने जेएनडीआई और BeanManager का उपयोग करने का संकल्प किया। मैंने बीएनएमएनेजर प्राप्त करने के लिए जेएनडीआई का इस्तेमाल किया और इसकी fireEvent विधि का उपयोग किया।सेम प्रबंधक को हल करने कोड में डाल करने के लिए (seen here के रूप में):
public class BeanHelper {
public static BeanManager getBeanManager() {
try {
InitialContext initialContext = new InitialContext();
return (BeanManager) initialContext.lookup("java:comp/BeanManager");
} catch (NamingException e) {
e.printStackTrace();
return null;
}
}
}
अंतिम चरण है DomainEvents ही वस्तु:
public class DomainEvents {
private static boolean mNopMode = false;
public static void setNopMode() {
mNopMode = true;
}
public static void reset() {
mNopMode = false;
}
public static <TDomainEvent> void fire(TDomainEvent event) {
if (mNopMode) {
return;
}
BeanManager manager = BeanHelper.getBeanManager();
manager.fireEvent(event);
}
}
setNopMode
और reset
भागों कोई संदर्भ नहीं होने पर परीक्षण उद्देश्यों के लिए हैं। मूल रूप से मैन्युअल मॉकिंग। यूनिट परीक्षण से पहले एनओपी ऑपरेशन मोड में सेट करें और उनके बाद रीसेट करें।
एक पीओसी के रूप में ठीक काम करता है। पता नहीं है कि इसके उपयोग के लिए कोई गंभीर सीमाएं हैं या नहीं। मैं एसिंक बस इंटरैक्शन छोड़ देता हूं और श्रोताओं के कार्यान्वयन के समान हूं।
किसी भी टिप्पणी से प्यार होगा।
स्रोत
2013-04-12 08:59:45
धन्यवाद स्टीफन, यह बहुत अच्छा है - मुझे अमरूद के बारे में पता नहीं था। मैं वास्तव में अपने डोमेन को कार्यान्वयन विवरणों से अनजान रखने की कोशिश कर रहा हूं, लेकिन मैं कुछ विचारों को गवा इवेंटबस दूंगा। शायद मैं अपने डोमेन से कार्यान्वयन को छिपाने के लिए इवेंटबस को लपेट सकता हूं ... – HolySamosa
हाँ @ होलीसामोसा - जब मैं इसे डालता हूं, तो मैं उसे लपेटने जा रहा हूं, लेकिन सरल 'रजिस्टर()' और 'पोस्ट()' इंटरफेस को सरल रखें यह। –
मुझे लगता है कि आप अपने डोमेन मॉडल में गुवा सदस्यता लें एनोटेशन रखने जा रहे हैं? मुझे बाध्यकारी सदस्यता के लिए एनोटेशन का उपयोग करने का विचार पसंद है, लेकिन मैं अपने अच्छे, स्वच्छ डोमेन मॉडल में इस तरह के एक कार्यान्वयन विस्तार को पर्ची नहीं देना चाहूंगा। – HolySamosa