Spring数据Redis Pub / Sub和Websockets:接收消息

时间:2018-01-24 16:17:27

标签: java spring websocket redis

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

我的问题是:如何将我在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());
    }

}

1 个答案:

答案 0 :(得分:1)

在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);
    }

}