java - 空指针异常 : Cannot send from MessageListener to client via websocket with Spring boot

标签 java spring-boot websocket redis

在从 Redis 订阅消息后,我正在尝试向主题 /topic/room 发送消息。 我的代码如下。

@Component
public class RedisSubscriber implements MessageListener {

    static private Logger log = Logger.getLogger(RedisSubscriber.class.getName());

    @Autowired
    private SimpMessagingTemplate template;

    @Override
    public void onMessage(final Message message, final byte[] pattern) {

        log.info("template: " + template);
        template.convertAndSend("/topic/room", message);
        log.info("Message send: " + message.toString());
    }
}

结果如下。 我不知道为什么 SimpMessagingTemplate 对象为空。 SimpMessagingTemplate 似乎不是@Autowired。 我是否需要创建其他模板? 请给我建议。

得到以下异常

2017-07-12 19:53:24.920  INFO 8724 --- [edisContainer-2] j.c.t.l.delivery.redis.RedisSubscriber   : template: null
2017-07-12 19:53:24.939 ERROR 8724 --- [edisContainer-2] o.s.d.r.l.a.MessageListenerAdapter       : Listener execution failed

java.lang.NullPointerException: null
    at XXXX.redis.RedisSubscriber.onMessage(RedisSubscriber.java:27) ~[classes/:na]
    at org.springframework.data.redis.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:299) ~[spring-data-redis-1.8.4.RELEASE.jar:na]
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.executeListener(RedisMessageListenerContainer.java:249) [spring-data-redis-1.8.4.RELEASE.jar:na]
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.processMessage(RedisMessageListenerContainer.java:239) [spring-data-redis-1.8.4.RELEASE.jar:na]
    at org.springframework.data.redis.listener.RedisMessageListenerContainer$1.run(RedisMessageListenerContainer.java:967) [spring-data-redis-1.8.4.RELEASE.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

其他信息如下。 这就是我如何获取 RedisSubscriber 并将其注册到 MessageListenerAdapter

@Configuration
@EnableScheduling
public class AppConfig {

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        return template;
    }

    @Bean
    MessageListenerAdapter messageListener() {
        return new MessageListenerAdapter(new RedisSubscriber());
    }

    @Bean
    RedisMessageListenerContainer redisContainer() {
        final RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        container.setConnectionFactory(jedisConnectionFactory());
        container.addMessageListener(messageListener(), topic());

        return container;
    }

    @Bean
    RedisPublisher redisPublisher() {
        return new RedisPublisher(redisTemplate(), topic());
    }

    @Bean
    ChannelTopic topic() {
        return new ChannelTopic("topic");
    }
}

最佳答案

在 AppConfig 中,您可以自动连接您的订阅者

@Configuration
@EnableScheduling
public class AppConfig {
    @Autowire
    RedisSubscriber redisSubscriber

    @Bean
    MessageListenerAdapter messageListener() {
        return new MessageListenerAdapter(redisSubscriber);
    }
}

如果您的订阅者使用@Service 注释,您可以在订阅者类中自动连接服务:

@Service
public class RedisSubscriber implements MessageListener {
    @Autowired
    private SimpMessagingTemplate template // should be non-null
}

关于java - 空指针异常 : Cannot send from MessageListener to client via websocket with Spring boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45056152/

相关文章:

android - 移除@Override 注解错误

java - Spring安全和Spring引导

spring - 考虑在您的配置中定义一个名为 'entityManagerFactory' 的 bean

c# - Websocket-sharp 在打开 websocket 时不会引发 OnOpen 事件

java - 为什么我的 JmenuBar 不显示

java - Guava 中 ForwardingMap 的用途是什么?

spring-boot - 如何使用 Openshift secret 通过 SSL 建立 MQ 客户端连接

concurrency - 为什么 go.net/websocket'api 不使用 channel 来发送和接收消息?

php - Websocket 客户端身份验证

java - 在没有servlet api的webflux项目中使用OAuth2与Spring Security OAuth2和reactor netty