我是一个收听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]
答案 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)
以下是我必须更改以使其工作的摘要。
正如@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>
我在pom.xml中使用的其他版本
3.2.2.RELEASE 2.11.0 7.6.8.v20121106
如果您使用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");
}