2017-02-13 32 views
5

Próbuję utworzyć połączenie między klientem a serwerem za pośrednictwem Spring webSocket i robię to za pomocą this link. Chcę, aby kontroler wysyłał "cześć" do klienta co 5 sekund, a klient dołączał go do skrzynki z życzeniami za każdym razem. Jest to klasa kontrolera:Wysyłanie wiadomości do klienta okresowo przez Spring Web-Socket

@EnableScheduling 
@Controller 
public class GreetingController { 

    @Scheduled(fixedRate = 5000) 
    @MessageMapping("/hello") 
    @SendTo("/topic/greetings") 
    public Greeting greeting() throws Exception { 
     Thread.sleep(1000); // simulated delay 
     System.out.println("scheduled"); 
     return new Greeting("Hello"); 
    } 

} 

i to Połącz function() w app.jsp:

function connect() { 
    var socket = new SockJS('/gs-guide-websocket'); 
    stompClient = Stomp.over(socket); 
    stompClient.connect({}, function (frame) { 
     setConnected(true); 
     console.log('Connected: ' + frame); 
     stompClient.send("/app/hello", {}, JSON.stringify({'name': "connect"})); 
     stompClient.subscribe('/topic/greetings', function (message) { 
      console.log("message"+message); 
      console.log("message"+(JSON.parse(message.body))); 

      showGreeting(JSON.parse(message.body).content); 
     }); 
    }); 
} 

po załadowaniu index.jsp i naciśnięciu przycisku Connect, tylko jeden raz go witam się na powitanie, jak mam sprawić, by klient wyświetlał komunikat "cześć" co 5 sekund?

+0

Wiadomość "Zaplanowano" jest widoczna? Mam na myśli zapowiedź zaplanowana? – cralfaro

+0

Tak, działa @cralfaro – user5621266

+0

Myślę, że problem polega na tym, co próbujesz zrobić, nie ma sensu, mam na myśli komunikat, że musisz myśleć w nim jako dyspozytor, kiedy ktoś wysyła wiadomość do konkretnego tematu transmisja do wszystkich słuchaczy, ale dodanie Harmonogramu w rzeczywistości nikt nie wysyła prawdziwej wiadomości. Proponuję usunąć zaplanowaną adnotację i zrobić to samo z jakiegoś fałszywego html z pewną funkcją setTimeout() JS i połączyć się z tematem i wysłać wiadomość, a zobaczysz wiadomość na twojej drugiej stronie html. – cralfaro

Odpowiedz

10

Proszę odnieść się do tej części documentation. Sposób, w jaki próbujesz wysłać wiadomość, jest całkowicie błędny. Zmodyfikuję powyższą klasę w następujący sposób:

@EnableScheduling 
@Controller 
public class GreetingController { 

    @Autowired 
    private SimpMessagingTemplate template; 

    @Scheduled(fixedRate = 5000) 
    public void greeting() { 
     Thread.sleep(1000); // simulated delay 
     System.out.println("scheduled"); 
     this.template.convertAndSend("/topic/greetings", "Hello"); 
    } 

} 
+0

Sposób w jaki używa jest poprawny, sprawdź ten dokument https://spring.io/guides/gs/messaging-stomp-websocket/ – cralfaro

+2

Używając @SendTo, metoda opublikuje wiadomość tylko do tego tematu, gdy metoda jest wywoływana jako obsługa komunikatów (to znaczy, gdy wiadomość pochodzi z samego websocket). Jeśli chcesz, aby kontener wywoływał metodę co 5 sekund i otrzymywał wiadomości opublikowane w temacie, musisz użyć szablonu wiadomości. Nie da się tego obejść. –

+0

Ahh przepraszam, nie widziałem, żebyś usunął kilka adnotacji, tak ta metoda, jak sądzę, również może działać – cralfaro