Camel Redis自动将字符串添加到键

时间:2016-05-24 00:41:30

标签: java redis apache-camel

我在Camel应用程序中使用Redis组件。一个问题是它会自动将字符串添加到键中。例如,让我说我在我的Camel应用程序中运行以下内容:

        from("direct://path/to/store/in/redis")
            .setHeader(RedisConstants.COMMAND, constant("SET"))
            .setHeader(RedisConstants.KEY, constant("key"))
            .setHeader(RedisConstants.VALUE, constant("value"))
            .to(spring-redis://localhost:6379);

然后,如果我打开命令行Redis客户端并运行以下命令来列出数据库中的所有密钥:

> keys *

它返回:

1) "\xac\xed\x00\x05t\x00\x03key"

在这里你可以看到它将 \ xac \ xed \ x00 \ x05t \ x00 \ x03 添加到密钥中,我不确定它到底在哪里。

如果我只使用GET和SET Redis命令,这不会有问题,因为由于某种原因,它会为这些命令的前缀添加相同的字符串,所以没有关键错误比赛。但是,如果我尝试通过Camel应用程序执行不同的Redis命令,例如 KEYS ,请执行以下操作:

from("direct://some/other/path/to/redis")
        .setHeader(RedisConstants.COMMAND, constant("KEYS"))
        .setHeader(RedisConstants.PATTERN, constant("*"))
        .to(spring-redis://localhost:6379);

它会在星号前面添加一个稍微不同的字符串,这会导致查询没有返回任何内容,因为该模式没有匹配项。那就是

> KEYS * 

命令转换为Redis中的以下内容:

> KEYS "\xac\xed\x00\x05t\x00\x05t*" 

对此有何想法?

2 个答案:

答案 0 :(得分:1)

以下两篇文章帮我解决了这个问题:

Redis serialization prefixed with extra string

Weird redis key with spring data Jedis

所以我通过将 RedisTemplate 中的 DefaultRedisSerializer 设置为 StringRedisSerializer 来修复它。

由于我使用Guice进行依赖/ bean注入,我将以下内容添加到我的 GuiceCamelModule 中:

.flex-item {
   flex: 1;
}
.big {
   flex: 3;
}

我的路径URI如下所示:

public class GuiceCamelTestModule extends CamelModuleWithMatchingRoutes {

    ...

    @Provides
    @JndiBind("redisTemplateBean")
    Object provideRedisTemplateBean() {
        JedisConnectionFactory redisConnectionFactory = new  JedisConnectionFactory();
        redisConnectionFactory.afterPropertiesSet();

        RedisTemplate<?, ?> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        template.setDefaultSerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
}

答案 1 :(得分:0)

如果单独使用骆驼组件spring-redis(即不使用Jedis),则使用下面的代码。

pom.xml

   <dependency>
      <groupId>org.apache.camel.springboot</groupId>
      <artifactId>camel-spring-redis-starter</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

RedisConfiguration.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfiguration {

  @Bean("redisTemplate")
  public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {

    RedisTemplate<String, Object> template = new RedisTemplate<>();

    template.setConnectionFactory(connectionFactory);

    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));

    return template;
  }
}

Route.java

.setHeader(RedisConstants.COMMAND, constant("SETEX"))
.setHeader(RedisConstants.KEY, simple("${body.parentId}"))
.setHeader(RedisConstants.VALUE, simple("${body}"))
.setHeader(RedisConstants.TIMEOUT, constant(100))
.to("spring-redis://" + redisHost + ":" + redisPort + "?redisTemplate=#redisTemplate");