2017-02-13 37 views
5

Spring webSocket ile istemci ve sunucu arasında bağlantı kurmaya çalışıyorum ve bunu this link yardımıyla yapıyorum. Denetleyicinin istemciye her 5 saniyede bir "merhaba" göndermesini ve istemciyi her seferinde tebrik kutusuna eklemesini istiyorum. Bu kontrolör sınıftır:Spring Web-Socket ile istemciye düzenli olarak mesaj gönderme

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

} 

ve bu app.jsp içinde Bağlan() fonksiyonudur: index.jsp yükler ve ben, sadece bir kez o bağlantı düğmesine bastığınızda

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

selamlamada merhaba, müşteriyi her 5 saniyede bir "merhaba" mesajını göstermesi için nasıl yapmalıyım?

+0

"Zamanlanmış" mesajı görüntüleniyor mu? Zamanlanmış açıklama çalışması çalışıyor mu demek istediniz? – cralfaro

+0

Evet, çalışıyor @cralfaro – user5621266

+0

Sanırım sorun şu ki, ne yapmaya çalışıyorsun, anlam ifade etmiyorsun, ben bir mesaj gönderen olarak düşünmem gerek. Tüm dinleyicilere bir yayın, ancak Program ekleyerek aslında kimse gerçek bir mesaj gönderiyor. Zamanlanmış açıklamayı kaldırmanızı ve bazı setTimeout() JS işlevleriyle kukla html'den aynı şeyi gerçekleştirmenizi ve konuya bağlanmanızı ve biraz ileti göndermenizi öneririm, sonra iletiyi diğer html sayfanızda görürsünüz. – cralfaro

cevap

10

Lütfen documentation'un bu bölümüne başvurun. Bir mesaj göndermeye çalıştığınız yol tamamen yanlış. Yukarıdaki sınıfınızı aşağıdaki gibi değiştiririm:

@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

Kullandığı yöntem doğru, bu belgeleri kontrol edin https://spring.io/guides/gs/messaging-stomp-websocket/ – cralfaro

+2

@SendTo kullanarak, yöntem yalnızca mesajın söz konusu konuya yayınlanacağı zaman yöntem, bir mesaj işleyici olarak çağrılır (mesaj, mesaj kutusunun kendisinden geldiğinde). Konteynerin her 5 saniyede bir yöntemi çağırmasını ve mesajların konuya yayınlanmasını istiyorsanız mesajlaşma şablonunu kullanmanız gerekir. Etrafında bir yolu yok. –

+0

Ahh üzgünüm, bazı ek açıklamaları kaldırdığınızı görmedim, evet bu yöntemin de işe yarayacağını düşünüyorum – cralfaro