2013-05-07 5 views
0

J'ai un itinéraire simple qui écoute un canal Redis. Pour une raison quelconque, cela ne fonctionne pas. Voici ma route. J'ai vérifié que les données sont publiées dans le canal Redis et je peux le lire en utilisant un abonné Jedis normal. Je cours Camel à l'intérieur de Jetty et il est déployé comme une guerre.Camel Redis Component s'abonner à un canal ne fonctionne pas

public class RedisSubscriberRoute extends RouteBuilder{ 

    @Override 
public void configure() throws Exception { 

    from("spring-redis://localhost:6379?command=SUBSCRIBE&channels=mychannel") 
    .process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       String res = exchange.getIn().getBody().toString(); 
       System.out.println("************ " + res); 
       exchange.getOut().setBody(res); 
      } 
     }) 
    .to("log:foo"); 
} 

}

MISE À JOUR (10 mai 2013 09h56 HNE): Ajout d'informations sur la version

<properties> 
      <spring.version>3.2.2.RELEASE</spring.version> 
      <camel.version>2.11.0</camel.version> 
      <jetty.version>7.6.8.v20121106</jetty.version> 
    </properties> 

version serveur Redis est 2.6.11

L'exemple de projet git est ici. https://github.com/soumyasd/camelredisdemo

MISE À JOUR 10 mai 2013 (22h18 HNE):

Comme suggéré dans les commentaires ci-dessous j'ai changé la version du ressort-données à 1.0.0.RELEASE. On dirait que le message arrive à l'abonné, mais je reçois toujours une exception.

java.lang.RuntimeException: org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.StreamCorruptedException: invalid stream header: 77686174 
    at org.apache.camel.component.redis.RedisConsumer.onMessage(RedisConsumer.java:73)[camel-spring-redis-2.11.0.jar:2.11.0] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.executeListener(RedisMessageListenerContainer.java:242)[spring-data-redis-1.0.0.RELEASE.jar:] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer.processMessage(RedisMessageListenerContainer.java:231)[spring-data-redis-1.0.0.RELEASE.jar:] 
    at org.springframework.data.redis.listener.RedisMessageListenerContainer$DispatchMessageListener$1.run(RedisMessageListenerContainer.java:726)[spring-data-redis-1.0.0.RELEASE.jar:] 
    at java.lang.Thread.run(Thread.java:680)[:1.6.0_45] 
+0

Quelle version de Camel et Redis utilisez-vous? –

+0

J'ai mis à jour la question avec les informations de version ainsi que le lien vers le projet de démonstration sur github. –

+0

Pour le moment, vous pouvez essayer de changer la version d'entraînement dans le composant de chameau ressort Redis comme suit: org.springframework.data ressort données Redis 1.0.0.RELEASE

Répondre

1

Il y a quelque chose de cassé dans le consommateur avec v 1.0.3.RELEASE, utilisez plutôt 1.0.0.RELEASE. L'exception que vous obtenez est quelque chose de différent: le producteur Camel utilise Spring RedisTemplate, qui à son tour utilise JdkSerializationRedisSerializer. Pour le rendre symétrique, le consommateur utilise par défaut JdkSerializationRedisSerializer pour désérialiser les données. Donc, si vous utilisez le producteur de Camel pour publier des données, cela devrait fonctionner sans effort. Mais si vous publiez des données à redis en utilisant d'autres clients redis (ou comme dans le cas de certaines autres bibliothèques), vous devez utiliser un autre sérialiseur pour le consommateur. longue explication, mais pour le faire fonctionner est en fait deux lignes:

de ("printemps-Redis: // localhost: 6379 commande = ABONNEZ & canaux = mychannel & sérialiseur = # sérialiseur")

+0

J'utilise Jedis (et un Python (redis-py) pour publier sur le canal Redis.) J'ai donc besoin d'ajouter ce sérialiseur dans mon XML printanier, je vais essayer –

+0

Ajouter le sérialiseur et l'utiliser dans les travaux de la route de chameau –

0

Voici un résumé de ce que j'ai dû changer pour faire ce travail.

  1. Comme l'a souligné @Bilgin Ibryam - vous devez utiliser la version 1.0.0.RELEASE du ressort des données Redis (comme le 11 mai 2013)

    <dependency> 
        <groupId>org.springframework.data</groupId> 
        <artifactId>spring-data-redis</artifactId> 
           <!-- IMPORTANT - as of 10-May-2013 the Redis Camel 
            component only works with version 1.0.0.RELASE --> 
        <version>1.0.0.RELEASE</version> 
    </dependency> 
    
  2. Autre versions que j'ai utilisé dans mon pom.xml sont

    3.2.2.RELEASE 2.11.0 7.6.8.v20121106

  3. Si vous éditez et consommez en utilisant le composant Camel Redis, vous n'avez pas besoin de déclarer un sérialiseur différent. Dans mon cas, je publiais à partir de python ainsi que du vieux Java en utilisant Jedis. J'ai dû change as my route pour inclure le sérialiseur et définir le sérialiseur dans mon spring/camel config.

    @Override configure public void() throws Exception {

    from("spring-redis://localhost:6379?command=SUBSCRIBE&channels=mychannel&serializer=#redisserializer") 
    .process(new Processor() { 
         @Override 
         public void process(Exchange exchange) throws Exception { 
          String res = exchange.getIn().getBody().toString(); 
          System.out.println("************ " + res); 
          exchange.getOut().setBody(res); 
         } 
        }) 
    .to("log:foo"); 
    

    }

+0

Il y a une version 1.0.4 de spring-data-redis, ça vous dérange de tester cette version? –

+0

J'ai essayé avec 1.0.4.RELEASE de spring-data-redis et ça ne marche toujours pas. le problème est –

+0

Merci pour les tests et rapports –

Questions connexes