0

I'm playing with Spring/Redis/Jedis for a simple message queue system. I've brought up a simple test case using just Strings, but for some reason the strings are coming back corrupted. I was originally trying with POJOs, but that also had corruption, so I figured just simple strings would work, but so far no luck.

When I use redis-cli and subscribe to the channel the raw data it shows me is

1) "message"
2) "test"
3) "\xac\xed\x00\x05t\x00\x03wee"

Here is my sample code

@Service
public class MessageService {
    @Autowired private RedisTemplate<String, String> testTemplate;

    @Bean
    RedisMessageListenerContainer container(JedisConnectionFactory jedisConnectionFactory,
                                            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(jedisConnectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("test"));

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(this, "receiveMessage");
    }

    public void sendMessage(){
        TestObject message = new TestObject();
        message.test = 5;
        testTemplate.convertAndSend("test", "wee");
    }

    public void receiveMessage(String testObject) {
        System.out.println("I got a message " + testObject);
    }
}

The output from receieveMessage is I got a message ?? t wee, well there are two characters that can't be displayed in stackoverflow where the spaces are before and after the 't'.

Any ideas as to what is causing this corruption?

JoshMc
  • 10,239
  • 2
  • 19
  • 38
Zipper
  • 7,034
  • 8
  • 49
  • 66
  • Spring Data Redis uses `JdkSerializationRedisSerializer` for serializing values. Use `StringRedisSerializer` or `RedisStringTemplate` if you want to use strings. See http://docs.spring.io/spring-data/data-redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html and http://docs.spring.io/spring-data/redis/docs/1.6.0.RELEASE/reference/html/#redis:serializer – mp911de Oct 24 '15 at 13:08
  • I'm already using the RedisTemplate, and even if I put in `testTemplate.setKeySerializer(new StringRedisSerializer()); testTemplate.setDefaultSerializer(new StringRedisSerializer());` I still get the same corruption. And from looking at the RedisMessageListenerContainer it appears to use the default StringRedisSerializer. – Zipper Oct 25 '15 at 01:16
  • There is also a `setValueSerializer()`, but `setDefaultSerializer()` should be ok. – mp911de Oct 25 '15 at 09:20

1 Answers1

0
    @Bean
    public RedisTemplate<String,String> redisTemplate() {
        final RedisTemplate<String,String> redisTemplate = new RedisTemplate<String,String>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

Your RedisTemplate value serializer should be StringRedisSerializer. Use this conf for RedisTemplate.

güven seckin
  • 99
  • 1
  • 4