2016-05-18 22 views
25

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

प्रौद्योगिकियों शामिल हैं: सामान्य सामने के अंत आवेदन के लिए

  • कोणीय संदेश दलाल
  • Springboot WebSockets
  • से संदेश प्राप्त करने के लिए WebSocket संचार
  • webosocket से अधिक Stomp बनाने के लिए
  • SockJS
  • स्टॉम्प संदेश ब्रोकर (जावा संबंधित ढांचा)

क्या मैं सामने के छोर पर हासिल करना चाहते हैं:

  1. एक WebSocket कनेक्शन जब दृश्य लोड किया जाता है
  2. कि WebSocket का उपयोग कर रों stomp प्रदाता बनाएं
  3. मेरे मुवक्किल की सदस्यता है बनाएं
  4. पकड़ने सर्वर संदेशों को धक्का दिया और कोणीय दृश्य

जहाँ तक सर्वर साइड कोड के रूप में अद्यतन:

  1. कॉन्फ़िगर WebSocket सामान और कनेक्शन
  2. सर्वर पुश संदेशों को समय की हर एक्स राशि है प्रबंधन (एक निष्पादक या @Scheduled के माध्यम से?)।

मुझे लगता है कि मैंने सर्वर साइड कोड के अंतिम भाग को छोड़कर अब तक सब कुछ हासिल कर लिया है। उदाहरण का अनुसरण मैं वेबप्लेट को पूर्ण डुप्लेक्स मोड में उपयोग करता हूं और जब कोई क्लाइंट कुछ भेजता है तो सर्वर तुरंत संदेश कतार और सभी सब्सक्राइब किए गए क्लाइंट अपडेट का जवाब देता है। लेकिन क्लाइंट के लिए कोई अनुरोध करने के लिए इंतजार किए बिना सर्वर के लिए Stomp पर कुछ भेजने के लिए मैं चाहता हूं।

पहले मैंने एक वसंत @Controller बनाया और @SendTo("/my/subscribed/path") एनोटेशन के साथ इसमें एक विधि जोड़ा। हालांकि मुझे नहीं पता कि इसे कैसे ट्रिगर किया जाए। इसके अलावा मैंने @Scheduled जोड़ने का प्रयास किया लेकिन यह एनोटेशन केवल void रिटर्न प्रकार के साथ विधियों पर काम करता है (और मैं न्यूजमेसेज ऑब्जेक्ट लौटा रहा हूं)।

अनिवार्य रूप से मुझे क्या चाहिए कि ग्राहक को वेबस्केट कनेक्शन शुरू करना है, और सर्वर के बाद सेट अंतराल पर संदेश को धक्का देना शुरू हो जाता है (या जब भी कोई ईवेंट ट्रिगर होता है तो इससे कोई फर्क नहीं पड़ता)। साथ ही, प्रत्येक नए ग्राहक को एक ही संदेश कतार सुनना चाहिए और वही संदेश प्राप्त करना चाहिए।

+0

क्या आपके पास गिथब पर शायद एक हल हो सकता है? –

+0

आप स्प्रिंग फ्रेमवर्क :: [एक इंटरैक्टिव वेब एप्लिकेशन बनाने के लिए वेबसॉकेट का उपयोग करके) द्वारा इस सरलीकृत अनुभाग से शुरू कर सकते हैं (http://spring.io/guides/gs/messaging-stomp-websocket/) – Dun0523

उत्तर

28

सबसे पहले आप यद्यपि अपने websocket वसंत में सक्षम किया है की जरूरत है, इससे पहले कि सुनिश्चित करें कि आप उदाहरण के सबसे महत्वपूर्ण एक के लिए अपने pom.xml

में अनुसार निर्भरता है कि बनाने:

  <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-websocket</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

फिर आपको अपनी कॉन्फ़िगरेशन की आवश्यकता है। मैं आपको सरल दलाल से शुरू करने का सुझाव देता हूं।

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/portfolio").withSockJS(); 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.setApplicationDestinationPrefixes("/app"); 
     config.enableSimpleBroker("/topic", "/queue"); 
    } 

} 

तब आपका नियंत्रक इस तरह दिखना चाहिए। जब आपका AngularJs ऐप 'पोर्टफोलियो' पर कनेक्शन खुलता है और इस चैनल /topic/greeeting पर सदस्यता भेजता है तो आप इसे नियंत्रक में प्राप्त करेंगे और सभी सब्स्क्राइब किए गए उपयोगकर्ताओं का जवाब देंगे।

@Controller 
public class GreetingController { 

    @MessageMapping("/greeting") 
    public String handle(String greeting) { 
     return "[" + getTimestamp() + ": " + greeting; 
    } 
} 

अपने अनुसूचक प्रश्न के बारे में, आप विन्यास के माध्यम से इसे सक्षम करना होगा: तो

@Configuration 
@EnableScheduling 
public class SchedulerConfig{} 

और यह अनुसूची:

@Component 
public class ScheduledUpdatesOnTopic{ 

    @Autowired 
    private SimpMessagingTemplate template; 

    @Scheduler(fixedDelay=300) 
    public void publishUpdates(String text){ 
     template.convertAndSend("/topic/greetings", text); 
    } 
} 

आशा इस किसी भी तरह स्पष्ट किया अवधारणा और कदम उठाए जाने की आवश्यकता है चीजों को आपके लिए काम करने के लिए।

+0

इस भाग में उल्लिखित/विषय/ग्रीटिंग नहीं होना चाहिए "इस चैनल/विषय/ग्रीटिंग के लिए सदस्यता भेजें, आप इसे नियंत्रक में प्राप्त करेंगे और सभी सब्सक्राइब किए गए उपयोगकर्ताओं को जवाब देंगे" वास्तव में/ऐप/ग्रीटिंग? – HopeKing

+0

आम तौर पर किसी के अनुरोध के बाद एक उपयोगकर्ता को 'ग्रीटिंग' के साथ प्रतिक्रिया देने के लिए समय-समय पर 'बधाई' भेजना था। – RMachnik

6

सबसे पहले आप बिना किसी सदस्यता के ग्राहकों को संदेश भेज सकते हैं (पुश) संदेश भेज सकते हैं।

दूसरी बात यह है कि सभी ग्राहकों को संदेश भेजने के लिए आपको topic अमूर्त पक्ष को देखना चाहिए।

यह STOMP का एक मूलभूत सिद्धांत है।

मुझे लगता है कि आप @Scheduled के साथ ठीक हैं, लेकिन आपको बाद में धक्का देने के लिए STOMP ब्रोकर को संदेश भेजने के लिए SimpMessagingTemplate इंजेक्ट करने की आवश्यकता है।

भी देखें Spring WebSockets XML configuration not providing brokerMessagingTemplate

+2

हालांकि मैंने आपका जवाब उपयोग किया है (मेरी परियोजना पहले से ही 'लॉगआउट' संदेश भेजने के लिए 'सिम्प मैसेजिंग टेम्पलेट' का उपयोग कर रही थी जिसे मैंने प्रश्न पोस्ट करने के बाद उपयोग करने के बारे में सोचा था) मैंने दूसरे को सही के रूप में चिह्नित किया क्योंकि यह अन्य लोगों के लिए अधिक उपयोगी हो सकता है। – Konstantine

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