Spring Boot如何知道MessageMapping指定的是Jms Queue还是Websocket topic?
How does Spring Boot know whether MessageMapping specifies a Jms Queue or a Websocket topic?
我有一个控制器 bean,其方法如
@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
log.info("Received command: " + content);
}
我还向这个控制器中注入了一个 SimpMessagingTemplate
和一个 JmsMessagingTemplate
。我认为我的 receiveCommand
方法的问题在于 Spring 期望这是一条 JMS 消息而不是 WebSocket 消息。然而这似乎无法确定,我如何确保此方法对应于 WebSocket 主题而不是 JMS 队列?
我的应用程序带有 @EnableJms
和 @EnableWebSocket
注释,可以很好地接收 JMS 消息和通过 STOMP 发送 WebSocket 消息,但似乎无法接收 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 以某种方式获取并覆盖 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 发送和接收。
SIMP 模板用于向连接的客户端发送数据;要将数据发送到控制器,您应该使用 STOMP Client.
4.4.6. Send Messages
What if you want to send messages to connected clients from any part of the application? Any application component can send messages to the "brokerChannel". The easiest way to do that is to have a SimpMessagingTemplate injected, and use it to send messages. Typically it should be easy to have it injected by type, for example:
4.4.15. STOMP Client
Spring provides a STOMP over WebSocket client and a STOMP over TCP client.
@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
我有一个控制器 bean,其方法如
@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
log.info("Received command: " + content);
}
我还向这个控制器中注入了一个 SimpMessagingTemplate
和一个 JmsMessagingTemplate
。我认为我的 receiveCommand
方法的问题在于 Spring 期望这是一条 JMS 消息而不是 WebSocket 消息。然而这似乎无法确定,我如何确保此方法对应于 WebSocket 主题而不是 JMS 队列?
我的应用程序带有 @EnableJms
和 @EnableWebSocket
注释,可以很好地接收 JMS 消息和通过 STOMP 发送 WebSocket 消息,但似乎无法接收 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 以某种方式获取并覆盖 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 发送和接收。
SIMP 模板用于向连接的客户端发送数据;要将数据发送到控制器,您应该使用 STOMP Client.
4.4.6. Send Messages
What if you want to send messages to connected clients from any part of the application? Any application component can send messages to the "brokerChannel". The easiest way to do that is to have a SimpMessagingTemplate injected, and use it to send messages. Typically it should be easy to have it injected by type, for example:
4.4.15. STOMP Client
Spring provides a STOMP over WebSocket client and a STOMP over TCP client.
@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