Camel Redis Component订阅了一个无效的频道

时间:2013-05-07 20:53:45

标签: redis apache-camel publish-subscribe spring-data

我是一个收听Redis频道的简单路线。出于某种原因,它无法正常工作。 这是我的路线。我确认数据正在发布到Redis频道,我可以使用普通的Jedis订阅者将其读回。我在Jetty中运行Camel并将其部署为战争。

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

}

更新(2013年5月10日美国东部时间上午9:56):添加版本信息

    <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

更新2013年5月10日(美国东部时间晚上10:18):

正如下面的评论所示,我将spring-data的版本更改为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]

2 个答案:

答案 0 :(得分:1)

消费者使用v 1.0.3.RELEASE时会出现问题,请改用1.0.0.RELEASE。

您获得的异常是不同的:Camel生产者使用Spring RedisTemplate,而Spring RedisTemplate又使用JdkSerializationRedisSerializer。为使其成为symetric,默认情况下,使用者还使用JdkSerializationRedisSerializer来反序列化数据。因此,如果您使用Camel生产者发布数据,它应该可以正常工作。但是,如果您使用其他redis客户端(或者在您的情况下使用其他库)将数据发布到redis,则必须为使用者使用另一个序列化程序。很长的解释,但要使它工作实际上是两行:

从( “弹簧redis的://本地主机:6379命令= SUBSCRIBE&安培;渠道= mychannel&安培;串行=#串行器”)

答案 1 :(得分:0)

以下是我必须更改以使其工作的摘要。

  1. 正如@Bilgin Ibryam所指出 - 你必须使用spring-data-redis的1.0.0.RELEASE版本(截至2013年5月11日)

    <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组件进行发布和使用,则不必声明其他序列化程序。在我的例子中,我使用Jedis从python和普通的旧Java发布。我必须change as my route包含序列化程序并在spring/camel config中定义序列化程序。

    @覆盖 public void 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");
    

    }