2013-02-04 7 views
5

जिस परिदृश्य को मैं हल करने का प्रयास करता हूं वह निम्न है, मेरे पास एक परीक्षण प्रोग्राम है जो किसी सिस्टम पर वेब एंडपॉइंट पर वेब बनाता है।धागे के बीच सिंकिंग के लिए क्लोजर idiomatic

इस परीक्षण कार्यक्रम में जेटी वेब सर्वर चल रहा है जिस पर यह बाहरी प्रणाली से कॉलबैक की अपेक्षा करता है जो एक सफल परीक्षण चक्र पूरा करता है। यदि किसी विशिष्ट समय सीमा (टाइमआउट) के दौरान कॉलबैक प्राप्त नहीं होता है, तो परीक्षण विफल हो जाता है।

इसे प्राप्त करने के लिए, मैं चाहता हूं कि परीक्षण धावक एक "घटना" पर प्रतीक्षा करें कि जेटी हैंडलर कॉलबैक पर सेट करेगा।

मैंने जावा के साइक्लिकबैरियर का उपयोग करने के बारे में सोचा लेकिन मुझे आश्चर्य है कि इसे हल करने के लिए क्लोजर में एक बेवकूफ तरीका है या नहीं।

धन्यवाद

उत्तर

6

आप promise उपयोग कर सकते हैं यदि आप हाल ही के बारे में पूछा :) इस तरह कुछ:

(def completion (promise)) 

; In test runner. 
; Wait 5 seconds then fail. 
(let [result (deref completion 5000 :fail)] 
    (if (= result :success) 
    (println "Great!") 
    (println "Failed :("))) 

; In jetty on callback 
(deliver completion :success) 
+0

धन्यवाद! मैंने मूल रूप से वादे का उपयोग करने के बारे में सोचा लेकिन मैंने @ का उपयोग करके अपमानित करने पर ध्यान केंद्रित किया और मुझे पता नहीं था कि डेफ एक टाइमआउट ले सकता है। – reshefm

3

सीधे Clojure में, एक एजेंट है कि बकाया कॉलबैक पटरियों का उपयोग कर कोई मतलब होता है, हालांकि व्यवहार में मैं करूंगा Aleph का उपयोग करने की अनुशंसा करें, जो एसिंक्रोनस वेब प्रोग्रामिंग के लिए लाइब्रेरी है जो संचालित हैंडलर को भी आसान बनाता है। यह रिंग हैंडलर का उत्पादन करता है, जो लगता है कि यह आपके मौजूदा कोड के साथ अच्छी तरह से फिट होगा।

+1

सूचक के लिए धन्यवाद। वास्तव में लैमिना ऐसा लगता है कि यह इस स्थिति का ख्याल रख सकता है। – reshefm

+1

मैं सहमत हूं। इन प्रयोजनों के लिए लैमिना थोड़ा हल्का वजन है। पीएस जो भविष्य के पाठकों के लिए https://github.com/ztellman/lamina है। –

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