2015-01-07 7 views
8

मैं एक सरल वेब सॉकेट संचार किया था के साथ मेरी WebSocket सर्वर में घटना सदस्यता लेते हैं, निम्नलिखित इस https://spring.io/guides/gs/messaging-stomp-websocket/कैसे वसंत 4, STOMP और sock.js साथ स्प्रिंग 4

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

मैं एनोटेशन @MessageMapping उपयोग करने की कोशिश, लेकिन कोई सफलता नहीं पहुंचे:

@Controller 
public class WebSocketController { 

    @Autowired 
    private SimpMessagingTemplate messagingTemplate; 


    @MessageMapping("/chat/{chatId}") 
    public void chat(ChatMessage message, @DestinationVariable String chatId) { 
     messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("message: " + message.getText())); 
    } 

    @SubscribeMapping("/chat") 
    public void chatInit() { 
     System.out.println("worked"); 
     int chatId = 1; //for example 
     messagingTemplate.convertAndSend("/chat/" + chatId, new ChatMessage("connected")); 
    } 

} 

तब मैं बनाया है कि:

@Controller 
public class ApplicationEventObserverController implements ApplicationListener<ApplicationEvent> { 
    @Override 
    public void onApplicationEvent(ApplicationEvent applicationEvent) { 
     System.out.println(applicationEvent); 
    } 
} 

यह काम करता है, लेकिन सभी संभव घटनाओं कब्जा, मैं ' टी लगता है कि यह एक अच्छा अभ्यास है।

तो, मेरे प्रश्न को दोहराया जा सकता है: प्रारंभिक डेटा कैसे भेजा जाए जब उपयोगकर्ता sth से संतुष्ट हो?

+0

मुझे यहां एक समान प्रश्न मिला: http://stackoverflow.com/questions/24795340/how-to-find-all-users- सदस्यता-to-a-topic-in-spring-websockets – sinedsem

उत्तर

4

@SubscribeMapping हैंडलर विधि का उपयोग करके गंतव्य पर सदस्यता लेने पर आप सीधे किसी ग्राहक को कुछ भी वापस कर सकते हैं। लौटे वस्तु दलाल में नहीं जाएंगे लेकिन ग्राहक को सीधे भेजा जाएगा:

@SubscribeMapping("/chat") 
public Collection<ChatMessage> chatInit() { 
    ... 
    return messages; 
} 

ग्राहक के पक्ष में:

socket.subscribe("/app/chat", function(message) { 
    ... 
}); 

बाहर GitHub, पर chat example चेक जो इस सटीक परिदृश्य से पता चलता ।

+1

अभी तक नहीं पहुंच सका sth कि मैं चाहता हूँ। @ सर्गी अलमार, क्या मैं केवल एक बार सब्सक्राइब कर सकता हूं और इस सदस्यता का उपयोग इनिट मैसेज और भविष्य के संदेशों को प्राप्त करने के लिए कर सकता हूं? – sinedsem

+0

@ सदस्यता लें मैपिंग केवल तभी काम करता है जब मैं stompClient.subscribe ("/ app/chat /") लिखता हूं, लेकिन इस मामले में मुझे नए संदेश प्राप्त नहीं हो सकते – sinedsem

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