2015-10-05 6 views
12

मैं प्ले 2 और जावा के साथ एक वेबसाकेट आधारित समाधान को लागू करने की कोशिश कर रहा हूं। वर्तमान में मैं समवर्ती प्रबंधन के लिए Actor Model का उपयोग नहीं कर रहा हूं। इसके बजाए, यह सिर्फ handling the WebSockets using callbacks है।जावा - प्ले 2 वेबसाकेट कार्यान्वयन के लिए आवश्यक अभिनेता हैं?

समस्या यह है कि सर्वर कई ग्राहकों को संदेशों को 'प्रसारण' करने में असमर्थ है। उदाहरण के लिए, क्लाइंट के माध्यम से एक क्रिया ट्रिगर होने के बाद मुझे एक सरल अधिसूचना प्राप्त करने के लिए सभी सक्रिय ब्राउज़र सत्रों की आवश्यकता होती है। इसके बजाय, मैं इसे एक क्लाइंट सत्र के लिए अनुकरण करने में सक्षम हूं। असल में, यह सिर्फ नियमित अजाक्स अनुरोध/प्रतिक्रिया परिदृश्य के रूप में कार्य करता है।

मेरा अनुमान है कि प्ले 2 & जावा के साथ वेबसाकेट समाधान सरल कॉलबैक के साथ जावा सभी कनेक्टेड क्लाइंट ब्राउज़र पर संदेशों को प्रसारित करने में सक्षम नहीं है।

कॉलबैक सर्वर कोड

public static WebSocket<String> heartUpdate() { 
     return new WebSocket<String>() { 
      public void onReady(final WebSocket.In<String> in, 
        WebSocket.Out<String> out) { 
       in.onMessage(new Callback<String>() { 
        @Override 
        public void invoke(String event) throws Throwable { 
         Product product = Product.find.byId(Long.decode(event)); 
         // Other business stuff 
         out.write(entity.id + " " + decimalValue); 
        } 
       }); 
       in.onClose(new Callback0() { 
        @Override 
        public void invoke() throws Throwable { 

        } 
       }); 
       out.write(DELIM_USERID_REP); 
      } 
     }; 
    } 

मार्गों प्रविष्टि

GET /repsocket controllers.Application.heartUpdate 

क्लाइंट साइड

<script> 
    // Onto the WebSockets now 
    var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket; 
    var socket = new WS("@routes.Application.heartUpdate.webSocketURL(request)"); 

    var receiveEvent = function(event) { 
     alert(event.data); 
     // Notification badge visible with a common text 
     $('#notify').text(event.data); 
     $('#notify').addClass('visible'); 
    } 
     $('#heart').click(function(e) { 
      e.preventDefault(); 
      socket.send(@product.id); 
     }); 
    socket.onmessage = receiveEvent; 
    </script> 

में उपर्युक्त मामला, क्लाइंट ट्रिगर करने वाला कार्य वह है जो सफलतापूर्वक सर्वर से संदेश प्राप्त करता है, जबकि कोई अन्य ब्राउज़र सत्र नहीं करता है।

मैं जावा & वेबसाकेट्स के साथ Play2 के साथ गठबंधन किए गए किसी दस्तावेज़ को खोजने में विफल रहा जो सभी जुड़े सक्रिय ग्राहकों के साथ लगातार संचार बनाए रखने के लिए अभिनेताओं के अनिवार्य उपयोग का सुझाव देता है।

प्रश्न: क्या जावा के साथ Play2 में वेबसाकेट को सक्रिय सक्रिय सत्रों में संदेश प्रसारित करने के लिए अभिनेता मॉडल के साथ कार्यान्वित किया जाना चाहिए?

संपादित करें: नीचे स्क्रीनशॉट ब्राउज़रों के 2 राज्यों को दर्शाता है जो करने के लिए मैं 2 मान्य उपयोगकर्ता क्रेडेंशियल्स का उपयोग करने के लिए प्रवेश कर लिया है।

आदर्श रूप से, सर्वर से वेबसाकेट की प्रतिक्रिया दोनों ब्राउज़रों पर एक ही अधिसूचना बैज बनाना चाहिए।

enter image description here

+0

आपके पास क्या त्रुटि है? –

+0

@nikpon कोई त्रुटि नहीं, सर्वर से संदेश सिर्फ 1 ब्राउज़र सत्र में दिखाई देता है - जिसने अनुरोध को ट्रिगर किया है और किसी अन्य कनेक्ट क्लाइंट सत्र में नहीं – PopoFibo

+0

आपको ब्राउज़र का सत्र कैसे मिला? –

उत्तर

5

कोड आप पोस्ट को देखते हुए, ऐसा लगता है समस्या यह है कि आप प्रत्येक कनेक्शन के लिए एक संदर्भ की बचत नहीं कर रहे हैं, ताकि आप बाद में संदेशों को प्रसारित कर सकते है। कुछ इस तरह:

// Just an example: does not deal with concurrency problems 
private static final Set<WebSocket.Out<String>> SOCKETS = new HashSet<>(); 

public static WebSocket<String> heartUpdate() { 
    return new WebSocket<String>() { 
     public void onReady(final WebSocket.In<String> in, 
        final WebSocket.Out<String> out) { 
      SOCKETS.add(out); 
      in.onMessage(new Callback<String>() { 
       @Override 
       public void invoke(String event) throws Throwable { 
        for(WebSocket.Out<String> s: SOCKETS) { 
         s.write("SOME MESSAGE");  
        } 
       } 
      }); 
      in.onClose(new Callback0() { 
       @Override 
       public void invoke() throws Throwable { 
        SOCKETS.remove(out); 
       } 
      }); 
     } 
    }; 
} 

तुम भी अभिनेताओं का उपयोग कर सकते इस समस्या को मॉडल करने के लिए: कनेक्शन का ट्रैक रखने के लिए और नए सॉकेट कनेक्शन/बंद से निपटने के लिए एक अभिनेता के जिम्मेदार रही है।

यदि आप अक्का का उपयोग करना चाहते हैं तो आपको शुरू करने के लिए some activator templates हैं।

+0

यह वास्तव में एक बार लूप में चला गया, प्रभावी रूप से मूल समस्या के समान व्यवहार - शायद मुझे कुछ और बुनियादी याद आ रहा है – PopoFibo

+0

स्क्रैच कि, मैं इसे सभी गलत परीक्षण कर रहा था। यह वास्तव में काम करता है, बहुत धन्यवाद। मैं इस प्रश्न को आपके उत्तर में कुछ कर्षण के लिए खुले बक्षीस के साथ स्वीकार कर दूंगा। – PopoFibo

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