【发布时间】:2018-11-09 21:16:55
【问题描述】:
我有一个控制器 bean,其方法如下:
@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
log.info("Received command: " + content);
}
我还将SimpMessagingTemplate 和JmsMessagingTemplate 注入到这个控制器中。我相信我的 receiveCommand 方法的问题在于 Spring 期望这是 JMS 消息而不是 WebSocket 消息。但是这似乎无法确定,我如何确保此方法对应于 WebSocket 主题而不是 JMS 队列?
我的应用程序使用@EnableJms 和@EnableWebSocket 进行了注释,并且可以很好地通过STOMP 接收JMS 消息和发送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 发送和接收。
【问题讨论】:
-
你的问题不清楚;
Message类型取决于import语句。@MessageMappng不适用于 JMS。您不能有一个同时使用这两种类型的方法。您将需要 2 种方法,其中一种完全限定类型。模板没有区别;它们用于出站消息。 -
你收到异常了吗?
-
@GaryRussell 我添加了更多细节以尝试使问题更清楚。您能否通过完全限定类型来澄清您的意思?你是说消息类型吗?
-
我的意思是,如果您在 JmsListener 中明确地侦听
javax.jms.Message,则必须使用包名称来限定其中之一。>is that Spring is expecting this to be a JMS message- 不;您对消息Message<?>有正确的导入。所以这不是问题。@JmsListener不会干扰。 -
你猜为什么这个单元测试不会调用
receiveCommand?据我所知,应该配置它,以便它们在同一主题上发送和接收,并注入相同的值。似乎也没有在使用带有 STOMP 套接字的 SockJS 的外部 Web ui 上调用此方法,但同样的 UI 能够接收从 SimpMessagingTemplate 发送的消息。
标签: java spring spring-boot websocket spring-jms