2017-02-13 3 views
5

Spring webSocket을 통해 클라이언트와 서버를 연결하려고하는데이 작업은 this link의 도움으로 수행합니다. 컨트롤러에서 매 5 초마다 "hello"를 보내고 클라이언트가 매번 인사말 상자에 추가하도록합니다. 이 컨트롤러 클래스 :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"); 
    } 

} 

및이 app.jsp에 연결() 함수 다음 index.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); 
     }); 
    }); 
} 

인사말에 안녕하세요, 5 초마다 "안녕하세요"라는 메시지를 표시하려면 어떻게해야합니까?

+0

"예약 됨"메시지가 표시됩니까? 예약 된 주석이 작동 중입니까? – cralfaro

+0

네, 작동하고 있습니다 @cralfaro – user5621266

+0

제가 생각하기에 문제는, 당신이하려고하는 것은 이해가되지 않습니다. 나는 메시지를 의미합니다. 디스패처로 생각해야합니다. 누군가가 특정 주제에 메시지를 보낼 때 말입니다. 모든 청취자에게 방송하지만 실제로 아무도 실제 메시지를 보내지 않습니다. Scheduled annotation을 삭제하고 일부 dummyHTML에서 동일한 setTimeout() JS 함수를 사용하여 같은 작업을 수행하고 주제에 연결하고 메시지를 보내면 다른 HTML 페이지에 메시지가 표시됩니다. – cralfaro

답변

10

documentation 부분을 참조하십시오. 메시지를 보내려는 방식이 완전히 잘못되었습니다. 위 클래스를 다음과 같이 수정합니다 :

@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

그가 사용하는 방법은 정확합니다. https://spring.io/guides/gs/messaging-stomp-websocket/ – cralfaro

+2

@SendTo를 사용하면 메소드는 @SendTo를 사용하여 해당 주제에 메시지를 게시합니다. 메서드는 메시지 처리기 (즉, 메시지가 websocket 자체에서 왔을 때)로 호출됩니다. 컨테이너가 매 5 초마다 메소드를 호출하고 주제에 메시지를 공개하게하려면 메시징 템플리트를 사용해야합니다. 주변에는 방법이 없습니다. –

+0

Ahh 미안하지만 일부 주석을 제거하지 못했다. 네,이 방법도 효과가 있다고 생각합니다. – cralfaro