gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:11:06 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com