복붙노트

[SPRING] Spring을 사용하여 websocket을 통해 클라이언트에게 메시지를 보내는 방법

SPRING

Spring을 사용하여 websocket을 통해 클라이언트에게 메시지를 보내는 방법

나는 websocket과 함께 Spring을 사용하려고한다. 이 튜토리얼을 통해 조사를 시작했습니다.

내 사이드 ​​클라이언트에서 나는 서버에 연결을 초기화하는 것과 비슷한 것을 가지고있다.

function connect() {
    var socket = new SockJS('/myphotos/form');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function(greeting){
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

그것은 내 컨트롤러에서 다음과 같은 클래스에서 내 프로세스를 수행 할 수있어 훌륭합니다.

@Controller
@RequestMapping("/")
public class PhotoController {

    @MessageMapping("/form")
    @SendTo("/topic/greetings")
    public Greeting validate(AddPhotosForm addPhotosForm) {
        return new Greeting("Hello world !");
    }
}

이제 내가 원하는 것은 "/ topic / greeting"을 듣는 클라이언트에게 메시지를 보내는 쓰레드가있는 것입니다. 나는 다음과 같이 Runnable 클래스를 작성했다.

public class FireGreeting implements Runnable {

    private PhotoController listener;

    public FireGreeting(PhotoController listener) {
        this.listener = listener;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep( 2000 );
                listener.fireGreeting();
            } catch ( InterruptedException e ) {
                e.printStackTrace();
            }
        }   
    }
}

그리고 내 컨트롤러 완성 :

@Controller
@RequestMapping("/")
public class PhotoController {

    @MessageMapping("/form")
    @SendTo("/topic/greetings")
    public Greeting validate(AddPhotosForm addPhotosForm) {

        // added this part
        FireGreeting r = new FireGreeting( this );
        new Thread(r).start();

        return new Greeting("Hello world !");
    }

    // added this method
    @SendTo("/topic/greetings")
    public Greeting fireGreeting() {
        System.out.println("Fire");
        return new Greeting("Fire");
    }
}

내가 원하는대로 PhotoController.fireGreeting 메서드가 호출되지만 클라이언트 측에서 아무 일도 일어나지 않습니다. 어떤 제안? 고맙습니다.

해결법

  1. ==============================

    1.@Boris the Spider 덕분에 문제를 해결할 수있었습니다. 올바른 해결책은 다음과 같이하는 것입니다.

    @Boris the Spider 덕분에 문제를 해결할 수있었습니다. 올바른 해결책은 다음과 같이하는 것입니다.

    @Controller
    @RequestMapping("/")
    public class PhotoController {
    
        @Autowired
        private SimpMessagingTemplate template;
    
        @MessageMapping("/form")
        @SendTo("/topic/greetings")
        public Greeting validate(AddPhotosForm addPhotosForm) {
    
            FireGreeting r = new FireGreeting( this );
            new Thread(r).start();
    
            return new Greeting("Hello world !");
        }
    
        public void fireGreeting() {
            System.out.println("Fire");
            this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
        }
    }
    
  2. from https://stackoverflow.com/questions/28250719/how-to-send-message-to-client-through-websocket-using-spring by cc-by-sa and MIT license