Периодическая отправка сообщения клиенту через Spring Web-Socket

Я пытаюсь установить соединение между клиентом и сервером через Spring webSocket, и я делаю это с помощью эта ссылка. Я хочу, чтобы контроллер отправлял «привет» клиенту каждые 5 секунд, а клиент каждый раз добавлял его в окно приветствия. Это класс контроллера:

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

}

и это функция Connect() в 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);
        });
    });
}

когда загружается index.jsp и я нажимаю кнопку подключения, только один раз он добавляет приветствие в приветствие, как мне заставить клиента показывать сообщение «привет» каждые 5 секунд?


person ShakibaZar    schedule 13.02.2017    source источник
comment
Сообщение Запланировано видно? Я имею в виду, что запланированная аннотация работает?   -  person cralfaro    schedule 13.02.2017
comment
Я думаю, проблема в том, что то, что вы пытаетесь сделать, не имеет смысла, я имею в виду отображение сообщений, которое вам нужно думать как диспетчеру, когда кто-то отправляет сообщение в конкретную тему, чтобы сделать трансляцию для всех слушателей, но добавив Расписание на самом деле никто не отправляет реального сообщения. Я предлагаю вам удалить аннотацию Scheduled и сделать то же самое из некоторого фиктивного html с некоторой JS-функцией setTimeout(), подключиться к теме и отправить какое-то сообщение, после чего вы увидите сообщение на другой странице html.   -  person cralfaro    schedule 14.02.2017


Ответы (1)


Пожалуйста, обратитесь к этой части документация. Способ, которым вы пытаетесь отправить сообщение, совершенно неверен. Я бы изменил ваш класс выше следующим образом:

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

}
person Andrei Balici    schedule 13.02.2017
comment
То, как он использует правильно, проверьте эту документацию spring.io/guides/gs/ обмен сообщениями-stomp-websocket - person cralfaro; 14.02.2017
comment
При использовании @SendTo метод будет публиковать сообщение в этой теме только тогда, когда метод вызывается в качестве обработчика сообщений (то есть, когда сообщение пришло из самого веб-сокета). Если вы хотите, чтобы контейнер вызывал метод каждые 5 секунд и публиковал сообщения в теме, вам придется использовать шаблон обмена сообщениями. Нет никакого способа обойти это. - person Andrei Balici; 14.02.2017
comment
Ах, извините, я не видел, как вы удалили некоторые аннотации, да, я думаю, этот метод также может сработать. - person cralfaro; 14.02.2017
comment
Есть ли способ использовать этот метод для подписки на определенную часть информации, например, "/topic/greetings/{id}? Пожалуйста, смотрите мой вопрос здесь для получения более подробной информации: second-using-a-s" title="как я могу запланировать отправку данных, указанных клиентом, каждые несколько секунд, используя s">stackoverflow.com/questions/54942000/ - person AnonymousAngelo; 01.03.2019