2015-12-03 1 views
1

J'essaie d'utiliser org.springframework.data.redis.listener.RedisMessageListenerContainer pour écouter sur le canal redis pubsub.données de printemps redis message écouteur messages d'écoute deux fois

ma classe MessageListener ressemble à ceci

@Component 
public class RedisMessageListener { 

    @Autowired 
    private ProcessAdapterImpl processAdapter; 

    private static Logger logger = LoggerFactory.getLogger(RedisMessageListener.class); 

    public void handleMessage(Serializable message, String channel) { 
     logger.debug("handleMessage >>>>> Message received: " + message.toString() + " channel:" + channel); 
     processAdapter.onEventReceived(message.toString()); 
    } 
} 

et dans le contexte de l'application

<bean id="tbProperties" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location"> 
     <value>classpath:conf/notifier-local.properties 
     </value> 
    </property> 
</bean> 
<bean id="jedisConnectionFactory" 
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> 
    <property name="hostName" value="${redis.server}" /> 
    <property name="port" value="${redis.port}" /> 
    <property name="usePool" value="true" /> 
</bean> 

<!-- redis template definition --> 
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" 
    p:connection-factory-ref="jedisConnectionFactory" /> 

<bean id="redisPublisher" 
    class="com.vgroup.apps.notifier.event.publisher.RedisPublisherImpl" /> 

<bean id="messageListener" 
    class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"> 
    <constructor-arg> 
     <bean class="com.vgroup.apps.notifier.event.listener.RedisMessageListener" /> 
    </constructor-arg> 
</bean> 

<bean id="redisContainer" 
    class="org.springframework.data.redis.listener.RedisMessageListenerContainer"> 
    <property name="connectionFactory" ref="jedisConnectionFactory" /> 
    <property name="messageListeners"> 
     <map> 
      <entry key-ref="messageListener"> 
       <bean class="org.springframework.data.redis.listener.ChannelTopic"> 
        <constructor-arg value="${redis.queue}" /> 
       </bean> 
      </entry> 
     </map> 
    </property> 
</bean> 

éditeur de Redis ressemble ci-dessous

@Component 
public class RedisPublisherImpl implements IRedisPublisher { 

    @Autowired 
    private StringRedisTemplate redisTemplate; 

    @Autowired 
    private ObjectMapper mapper; 

    private static Logger logger = LoggerFactory.getLogger(RedisPublisherImpl.class); 

    public void afterPropertiesSet() throws Exception { 
    } 

    @Override 
    public void publish(Object event) { 
     logger.info("Start executing publish object"); 
     try { 
      String jsonString = mapper.writeValueAsString(event); 
      redisTemplate.convertAndSend("notifications", jsonString); 
     } catch (Exception e) { 
      logger.error(e.getMessage(), e); 
     } 

     logger.info("End executing publish object"); 
    } 
} 

avec cette configuration, pour des raisons étranges, je suis recevoir un message deux fois (parfois même 3-4 fois) même s'il est envoyé par mon p ublisher une seule fois

dans mes journaux, je vois qu'il est message est écouté par 2 différents fils de rediscontainer

2015-12-03 09:13:12.152 [redisContainer-2] DEBUG c.v.a.n.e.l.RedisMessageListener - handleMessage >>>>> Message received: abc channel:notifications 
2015-12-03 09:13:12.152 [redisContainer-2] DEBUG c.v.a.n.e.l.RedisMessageListener - handleMessage >>>>> Message received: def channel:notifications 
2015-12-03 09:13:12.156 [redisContainer-3] DEBUG c.v.a.n.e.l.RedisMessageListener - handleMessage >>>>> Message received: abc channel:notifications 
2015-12-03 09:13:12.157 [redisContainer-3] DEBUG c.v.a.n.e.l.RedisMessageListener - handleMessage >>>>> Message received: def channel:notifications 

Répondre

3

Vérifiez si les haricots créent deux fois (i.e. l'abonnement se produit deux fois). J'ai eu un problème similaire, dans web.xml. J'ai eu à la fois contextListener et DispatchServlet qui initialise les beans deux fois en s'abonnant deux fois.

+1

Merci @JaraviS c'était vraiment très utile. J'ai eu une servlet qui chargeait au démarrage, en ce que j'ai eu cette ligne ApplicationContext context = new ClassPathXmlApplicationContext ("applicationContext.xml"); Je suppose que cela créait le problème. Maintenant, il est fixé. Merci beaucoup pour votre aide. –