【问题标题】:Redis: Wrong serialization using the camel-redisRedis:使用 camel-redis 的错误序列化
【发布时间】:2013-09-12 23:24:58
【问题描述】:

我在玩骆驼和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)。

我有什么遗漏吗?

【问题讨论】:

    标签: java serialization redis apache-camel


    【解决方案1】:

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

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

    【讨论】:

    • 我认为它现在也为制作人修复了。
    【解决方案2】:

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

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

    接收器声明与您的原始帖子一致

     .... 
     .to("spring-redis://localhost:6379?serializer=#stringSerializer");
    

    【讨论】:

      【解决方案3】:

      在春季 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"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2017-07-21
        相关资源
        最近更新 更多