2015-01-07 8 views
8

ho fatto una semplice comunicazione presa web con molla 4, STOMP e sock.js, seguendo questo https://spring.io/guides/gs/messaging-stomp-websocket/come catturare iscriversi evento nel mio server websocket con la Primavera 4

Ora voglio aggiornarlo a semplice chat. Il mio problema è che quando l'utente si iscrive alla nuova chat room, dovrebbe passare i messaggi. Non so come catturare il momento in cui si è iscritto per mandargli la lista dei messaggi.

Ho provato ad utilizzare @MessageMapping annotazione, ma non ha raggiunto alcun successo:

@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")); 
    } 

} 

Poi ho creato che:

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

Funziona, ma cattura tutti gli eventi possibili, I don' Penso che sia una buona pratica.

Quindi, la mia domanda può essere riformulata: come inviare i dati iniziali quando l'utente è abbonato a sth?

+0

ho trovato la domanda simile qui: http://stackoverflow.com/questions/24795340/how-to-find-all-users-subscribed-to-a-topic-in-spring-websockets – sinedsem

risposta

4

È possibile restituire qualsiasi cosa direttamente a un client quando si abbona a una destinazione utilizzando un metodo di gestione @SubscribeMapping. L'oggetto restituito non andrà al broker, ma sarà inviato direttamente al cliente:

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

Sul lato client:

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

Scopri i chat example su GitHub, che mostra questo scenario esatto .

+1

ancora non riusciva a raggiungere che voglio @Sergi Almar, Posso sottoscrivere una sola volta e utilizzare questo abbonamento per ottenere init messeges e i messaggi futuri? – sinedsem

+0

@SubscribeMapping funziona solo quando scrivo stompClient.subscribe ("/ app/chat /"), ma in questo caso non riesco a ricevere nuovi messaggi – sinedsem

Problemi correlati