我从Spring Redis MessageReceiver获得了一个损坏的值

时间:2015-10-24 04:57:19

标签: java spring redis mq jedis

我正在使用Spring / Redis / Jedis来创建一个简单的消息队列系统。我使用Strings提出了一个简单的测试用例,但由于某种原因,字符串会被损坏。我最初尝试使用POJO,但也有腐败,所以我认为只是简单的字符串可以工作,但到目前为止还没有运气。

当我使用redis-cli并订阅频道时,它显示的原始数据是

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

这是我的示例代码

@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);
    }
}

receieveMessage的输出为I got a message ?? t wee,有两个字符无法在stackoverflow中显示,其中空格位于&#39; t&#39;之前和之后。

有关造成这种腐败的原因的任何想法?

1 个答案:

答案 0 :(得分: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;
    }

您的RedisTemplate值序列化器应为StringRedisSerializer。将此conf用于RedisTemplate。