2014-10-10 180 views
1

我正在使用Redis Publish通過Spring Data發佈訂閱,但我遇到了添加多個頻道的問題。如何用不同的接收器創建多個通道? Spring Redis pub/sub

目前我以下其中MessageListenerContainer的是通過添加已相關聯的接收器類的MessageListenerAdapter配置的典型的例子,如下:

enter image description here

先前作品完美和我能推送和接收消息。 但是一個我嘗試添加第二個偵聽器適配器與differente接收器建立一個「通道和我得到一個NullPointerException。

enter image description here

錯誤被附在下面。有不同的方式來增加新的適配器?一般來說,我想動態添加渠道。

有可能通過在addMessageListener方法提供PatternTopic列表添加與一個特定的接收器相關的多個通道。

感謝您的幫助

enter image description here

回答

1

我相信這是與Spring Redis的增加的MessageListenerAdapter當一個重要的錯誤。

如果接收機類不從消息監聽延伸(因此,實現的onMessage)從的MessageListenerAdapter類內的方法MethodInvoker()具體問如果接收機的MessageListener的實例(見下文圖像的最後一行) 。

enter image description here

爲了解決這個問題,剛剛從消息監聽延伸,然後就可以直接添加額外的適配器。

這是一個遺憾的是,spring-data-redis團隊不會在他們的github頁面中啓用發佈此bug的問題。 https://github.com/spring-projects/spring-data-redis

0

如果有人還在尋找,使用下面的配置春季啓動1.5.X

RedisConfig類多種渠道:

@Configuration 
public class RedisConfig { 

    @Bean 
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, 
              @Qualifier("notificationListenerAdapter") MessageListenerAdapter notificationListenerAdapter, 
              @Qualifier("countListenerAdapter") MessageListenerAdapter countListenerAdapter) { 

     RedisMessageListenerContainer container = new RedisMessageListenerContainer(); 
     container.setConnectionFactory(connectionFactory); 
     container.addMessageListener(notificationListenerAdapter, new PatternTopic("notification")); 
     container.addMessageListener(countListenerAdapter, new PatternTopic("count")); 
     return container; 
    } 

    @Bean("notificationListenerAdapter") 
    MessageListenerAdapter notificationListenerAdapter(RedisReceiver redisReceiver) { 
     return new MessageListenerAdapter(redisReceiver, "receiveNotificationMessage"); 
    } 

    @Bean("countListenerAdapter") 
    MessageListenerAdapter countListenerAdapter(RedisReceiver redisReceiver) { 
     return new MessageListenerAdapter(redisReceiver, "receiveCountMessage"); 
    } 

    @Bean 
    RedisReceiver receiver() { 
     return new RedisReceiver(); 
    } 

    @Bean 
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) { 
     return new StringRedisTemplate(connectionFactory); 
    } 

} 

RedisReceiver從渠道獲得的消息。

注意:確保方法名稱與上面定義的方法名稱匹配。

public class RedisReceiver { 

    private static final Logger LOGGER = LoggerFactory.getLogger(RedisReceiver.class); 


    public void receiveNotificationMessage(String message) { 
     LOGGER.info("Message Received from notification channel: <" + message + ">"); 

    } 

    public void receiveCountMessage(String message) { 
     LOGGER.info("Message Received from count channel: <" + message + ">"); 
    } 
} 

測試流程:

public class TestMessages { 

    private static final Logger LOG = LoggerFactory.getLogger(TestMessages.class); 

    private final StringRedisTemplate redisTemplate; 

    public TestMessages(StringRedisTemplate redisTemplate) { 
     this.redisTemplate = redisTemplate; 
    } 

    public void sendNotification(String message) { 

     redisTemplate.convertAndSend("notification", message); 

    } 

    public void sendCount(String message) { 

     redisTemplate.convertAndSend("count", message); 

    } 
} 
相關問題