2013-05-07 3 views
0

У меня есть простой маршрут, который слушает канал Redis. По какой-то причине он не работает. Вот мой маршрут. Я подтвердил, что данные публикуются в канал Redis, и я могу прочитать его обратно с помощью обычного подписчика Jedis. Я бегу Camel внутри Jetty, и он развертывается как война.Компонент Camel Redis подписаться на канал, не работающий

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

}

UPDATE (10-May-2013 9:56 утра EST): Добавление информации о версии

<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> 

Redis серверная версия 2.6.11

Пример проекта git здесь. https://github.com/soumyasd/camelredisdemo

UPDATE 10-May-2013 (10:18 вечера EST):

Как было предложено в комментариях ниже я изменил версию пружинных данных 1.0.0.RELEASE. Похоже, что сообщение доходит до абонента, но я все еще получаю исключение.

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

Какую версию Верблюд и Redis вы используете? –

+0

Я обновил вопрос с информацией о версии, а также ссылку на демонстрационный проект на github. –

+0

На данный момент, вы можете попробовать изменить версию диска в верблюд-весна-REDIS компонента следующим образом: org.springframework.data пружинными данных Redis 1.0.0.RELEASE

ответ

1

Есть что-то сломанное в потребителе с v 1.0.3.RELEASE, вместо этого используйте 1.0.0.RELEASE.

Исключением, которое вы получаете, является нечто иное: производитель Camel использует Spring RedisTemplate, который, в свою очередь, использует JdkSerializationRedisSerializer. Чтобы сделать его симметричным, потребитель по умолчанию также использует JdkSerializationRedisSerializer для десериализации данных. Поэтому, если вы используете продюсер Camel для публикации данных, он должен работать нормально без суеты. Но если вы публикуете данные для повторного использования с использованием других клиентов redis (или, как в случае с некоторыми другими библиотеками), вы должны использовать другой сериализатор для пользователя. Длинные объяснения, но сделать это работа на самом деле две линии:

из ("пружинных Redis: // локальный: 6379 Команда = ПОДПИСАТЬСЯ & каналы = & Serializer мой канал = # сериализатору")

+0

Я использую Jedis (и Python (redis-py) для публикации на канал Redis. Поэтому мне нужно добавить этот сериализатор в свой весенний XML. Позвольте мне попробовать. –

+0

Добавление сериализатора и использование его в работе на верблюжьем пути –

0

Вот краткое изложение того, что я должен был изменить, чтобы сделать эту работу.

  1. Как отметил @Bilgin Ibryam - вы должны использовать версию 1.0.0.RELEASE весенне-данных-Redis (как на 11-май-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. Другое версии, которые я использовал в моей pom.xml являются

    3.2.2.RELEASE 2.11.0 7.6.8.v20121106

  3. Если вы публикуете и потребляете с помощью компонента Camel Redis, вам не нужно объявлять другой сериализатор. В моем случае я публиковал с python, а также обычную старую Java, использующую Jedis. Мне пришлось change as my route включить сериализатор и определить сериализатор в моем spring/camel config.

    @Override общественная недействительная Configure() бросает исключение {

    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

Есть версия 1.0.3 для Spring-data-redis. Вы не против тестирования этого выпуска? –

+0

Я пробовал с 1.0.4.RELEASE из spring-data-redis, и он все еще не работает. проблема есть. –

+0

Спасибо за тестирование и отчетность –

Смежные вопросы