Как Spring Boot узнает, определяет ли MessageMapping тему Jms Queue или тему Websocket? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть компонент-контроллер с таким методом, как

@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
    log.info("Received command: " + content);
}

И я также вводю SimpMessagingTemplate и JmsMessagingTemplate в этот контроллер.Я считаю, что проблема с моим receiveCommand методом заключается в том, что Spring ожидает, что это будет сообщение JMS, а не сообщение WebSocket.Однако это кажется невозможным для определения, как я могу убедиться, что этот метод соответствует теме WebSocket, а не очереди JMS?

Мое приложение помечено @EnableJms и @EnableWebSocket и хорошо работает для получения JMSсообщения и отправка сообщений WebSocket через STOMP, но, похоже, не может получать сообщения WebSocket.

Импорт сообщений на моем контроллере выполняется следующим образом.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;

У меня также есть другойметод, который использует JmsListener, который работает, поэтому мне интересно, если это каким-то образом подхватывается Spring на classpath и переопределяет MessageMapping, чтобы быть именем очереди JMS.

@JmsListener(destination = "${my.destination}")
public void receiveMessage(String content) {
   System.out.println("Jms message: " + content); 
}

Я не вижу никаких следов стекаили ошибки при запуске модульного теста, который выглядит следующим образом:

@Autowired
private SimpMessagingTemplate websocket;

@Value("${my.topic}")
private String topic;

@Test
public void shouldReceiveCommandMessages() throws IOException {
    URL url = Resources.getResource("command.json");
    String json = Resources.toString(url, Charsets.UTF_8);
    this.websocket.convertAndSend(topic, json);
}

, который находится в пределах большего SpringBootTest, который работает для проверки отправки и получения Jms.

1 Ответ

0 голосов
/ 31 мая 2018

Шаблон SIMP предназначен для отправки данных подключенным клиентам;Для отправки данных в контроллер необходимо использовать STOMP Client .

4.4.6.Отправка сообщений

Что если вы хотите отправлять сообщения подключенным клиентам из какой-либо части приложения?Любой компонент приложения может отправлять сообщения в «brokerChannel».Самый простой способ сделать это - вставить SimpMessagingTemplate и использовать его для отправки сообщений.Как правило, его легко ввести по типу, например:

4.4.15.Клиент STOMP

Spring предоставляет клиент STOMP через WebSocket и клиент STOMP через TCP.

@Controller
class Listener {

    @MessageMapping("/string")
    public void handle(String in) {
        System.out.println("STOMP Received: " + in);
    }

    @JmsListener(destination = "so50614472")
    public void listen(String in) {
        System.out.println("JMS Received: " + in);
    }

}

и

STOMP Received: foo
JMS Received: bar
...