0

我在玩骆驼和redis。我有一条很短的路线:

from("timer://foo?period=5s")
    .to("http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson")
    .split().method(SplitFeatures.class,"splitMessage")
    .to("spring-redis://localhost:6379?command=SET&serializer=#serializer");

其中 splitMessage 如下:

public static List<Message> splitMessage(@Body String body) throws IOException {

    List<Message> answer = new ArrayList<Message>();
    JsonParser parser=new JsonParser();
    JsonObject jo=(JsonObject)parser.parse(body);

    // I care only for the features array
    JsonArray features=jo.get("features").getAsJsonArray();

    for (JsonElement feature: features) {
         Message msg=new DefaultMessage();
         JsonObject jof=feature.getAsJsonObject();

         // get the key
         String id=jof.get("id").getAsString().toString();

         System.out.print(id);
         msg.setHeader(RedisConstants.KEY, id);
         msg.setHeader(RedisConstants.VALUE, jof.toString());
         answer.add(msg);
    }
    return answer;
}

一切运行顺利,但是当我检查 redis db 时,我发现关键是:

 "\xac\xed\x00\x05t\x00\nci11361338"

并且值中存在相同的前缀"\xac\xed\x00\x05t\x00"

显然 System.out 打印的那些看起来不错。

如您所见,我尝试添加一个序列化程序,即我在 Main 中定义的 StringRedisSerializer,如下所示:

    Main main = new Main();
main.bind("serializer", new StringRedisSerializer());

但结果是一样的(也使用 GenericToStringSerializer)。

有什么我想念的吗?

4

3 回答 3

2

今天刚碰到这个。使用 Camel 2.18.0 和 camel-spring-redis 您需要做的就是创建一个 bean 来处理适当的序列化并将其传递给骆驼生产者定义。

  @Bean
  public RedisSerializer stringSerializer() {
    return new StringRedisSerializer();
  }

接收器声明与您的原始帖子相同

 .... 
 .to("spring-redis://localhost:6379?serializer=#stringSerializer");
于 2016-10-14T01:59:34.950 回答
1

我查看了源代码,您指定的自定义序列化程序似乎只为消费者设置,而不是为生产者设置。因此,您创建的序列化程序未在您的情况下使用。

同时,您可以做的是在注册表中创建一个 RedisTemplate 并设置您想要的序列化程序。然后让 Camel 使用那个 RedisTemplate。那应该使用您想要的序列化程序配置 Camel 生产者。

于 2013-09-10T14:38:19.087 回答
-2

在春季 DSL 中:

  <bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

...

      <marshal ref="json" />
      <convertBodyTo type="java.lang.String" charset="UTF-8"/>
    <setHeader headerName="CamelRedis.Value">
      <simple>${body}</simple>
    </setHeader>
    <to uri="spring-redis://{{redis.host}}:{{redis.port}}?command=SET&amp;serializer=#stringRedisSerializer"/>
于 2019-02-14T12:56:53.953 回答