Spring data Redis Pub/Sub and Websockets:接收消息



我正在使用Spring Boot和Redis服务器来开发我的Web应用程序。当客户端发送帖子时,会在频道"聊天"上向 Redis 发送一条消息。这很好用。为了接收消息,我创建了 RedisMessageSubscriber 类,它接收来自 Redis 的消息。 所有客户端都订阅了 STOMP Websocket 客户端"topic/test"。

我的问题是:如何将我在 RedisMessageSubscriber 中收到的消息重定向到客户端 Websocket 通道?

我在下面的第一次尝试没有奏效,因为控制器在收到来自 Redis 的消息之前将消息从队列发送到客户端。

DwittrController.class(消息在此处发送给客户端):

@MessageMapping("/newPost")
@SendTo("/topic/test")
public Message message(ClientMessage message) {
log.debug("a message from client was recieved");
userRepository.sendMessage(message.getMessage());
String redisMessage = RedisMessageSubscriber.messageList.get(0);
RedisMessageSubscriber.messageList.remove(0);
return new Message("New post from " + redisMessage + " is available.");
}

UserRepositoryImpl.class:

public void sendMessage(String message) {
stringRedisTemplate.convertAndSend("chat", message);
}

RedisMessageSubscriber.class:

@Component
public class RedisMessageSubscriber implements MessageListener {
private final Logger log = LoggerFactory.getLogger(this.getClass());
public static List<String> messageList = new ArrayList<String>();
public void onMessage(Message message, byte[] pattern) {
messageList.add(message.toString());
log.debug("Message received: " + message.toString());
}
}

在 RedisMessageSubscriber 类中,您可以自动连接 SimpMessagingTemplate。代码示例并不精确,但你明白了。

@Component
public class RedisMessageSubscriber implements MessageListener {
private final Logger log = LoggerFactory.getLogger(this.getClass());
public static List<String> messageList = new ArrayList<String>();
@Autowired
SimpMessagingTemplate messagingTemplate;

public void onMessage(Message message, byte[] pattern) {
messageList.add(message.toString());
log.debug("Message received: " + message.toString());
messagingTemplate.convertAndSend( "/topic/test", message);
}
}

最新更新