java - Spring Boot如何知道MessageMapping指定的是Jms队列还是Websocket主题?

标签 java spring spring-boot websocket spring-jms

我有一个 Controller bean,其方法如下

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

我还将一个 SimpMessagingTemplate 和一个 JmsMessagingTemplate 注入(inject)到该 Controller 中。我相信我的 receiveCommand 方法的问题在于 Spring 期望这是一条 JMS 消息而不是 WebSocket 消息。然而这似乎无法确定,我如何确保该方法对应于 WebSocket 主题而不是 JMS 队列?

我的应用程序使用 @EnableJms@EnableWebSocket 进行注释,并且可以很好地接收 JMS 消息并通过 STOMP 发送 WebSocket 消息,但似乎无法接收WebSocket消息。

消息导入在我的 Controller 上如下。

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 模板用于将数据发送到连接的客户端;要将数据发送到 Controller ,您应该使用 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

关于java - Spring Boot如何知道MessageMapping指定的是Jms队列还是Websocket主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50614472/

相关文章:

java - 如何检查舍入误差?

java - 如何在 Java 中联合 List<Date> list1 和 List<Date> list2?

spring - 使用类路径 : in spring

java - Spring CrudRepository Save For Update 覆盖其他字段

java - 考虑在您的配置中定义一个类型为 'com.repository.UserRepository' 的 bean

Java 正则表达式与换行符不匹配

java - 当用邻接矩阵表示稀疏图时,为什么使用链表作为包含边的结构?

docker - 无法通过 URL 访问 Web 应用程序。从 Netscaler 到应用服务器的 SSL 连接失败

Spring:@PreAuthorize 是否优先于 @Cacheable?

java - 是否可以从 Spring Boot 应用程序压缩嵌入式 HSQL DB?