【发布时间】:2016-01-23 17:15:27
【问题描述】:
我正在使用 Spring/Redis/Jedis 来构建一个简单的消息队列系统。我提出了一个仅使用字符串的简单测试用例,但由于某种原因,字符串返回已损坏。我最初尝试使用 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 中有两个字符不能显示在't' 之前和之后的空格。
关于导致这种损坏的任何想法?
【问题讨论】:
-
Spring Data Redis 使用
JdkSerializationRedisSerializer序列化值。如果要使用字符串,请使用StringRedisSerializer或RedisStringTemplate。见docs.spring.io/spring-data/data-redis/docs/current/api/org/… 和docs.spring.io/spring-data/redis/docs/1.6.0.RELEASE/reference/… -
我已经在使用 RedisTemplate
,即使我输入了 testTemplate.setKeySerializer(new StringRedisSerializer()); testTemplate.setDefaultSerializer(new StringRedisSerializer());,我仍然会遇到同样的损坏。从 RedisMessageListenerContainer 看来,它似乎使用了默认的 StringRedisSerializer。 -
也有
setValueSerializer(),不过setDefaultSerializer()应该没问题。