52.10.1. 集成 RedisTemplate 定义新类 JsonRedisTemplate
package cn.netkiller.wallet.redis;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonRedisTemplate extends RedisTemplate<String, Object> {
public JsonRedisTemplate(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper, Class<?> valueType) {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
super.setKeySerializer(stringSerializer);
super.setHashKeySerializer(stringSerializer);
super.setHashValueSerializer(stringSerializer);
Jackson2JsonRedisSerializer<?> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(valueType);
jsonRedisSerializer.setObjectMapper(objectMapper);
super.setValueSerializer(jsonRedisSerializer);
super.setConnectionFactory(connectionFactory);
super.afterPropertiesSet();
}
}
package cn.netkiller.wallet.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import com.fasterxml.jackson.databind.ObjectMapper;
import cn.netkiller.wallet.redis.JsonRedisTemplate;
import cn.netkiller.wallet.redis.RedisMessageSubscriber;
@Configuration
public class RedisConfig {
public RedisConfig() {
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
@Bean
public MessageListenerAdapter messageListener() {
return new MessageListenerAdapter(new RedisMessageSubscriber());
}
@Bean
public ChannelTopic topic() {
return new ChannelTopic("demo");
}
@Bean
public RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(messageListener(), topic());
container.addMessageListener(messageListener(), new ChannelTopic("test"));
return container;
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
@Bean
public JsonRedisTemplate jsonRedisTemplate(RedisConnectionFactory connectionFactory, ObjectMapper objectMapper) {
return new JsonRedisTemplate(connectionFactory, objectMapper, Object.class);
}
}
package cn.netkiller.wallet.restful;
import java.io.IOException;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import cn.netkiller.wallet.pojo.RestfulResponse;
import cn.netkiller.wallet.redis.JsonRedisTemplate;
import cn.netkiller.wallet.redis.RedisMessagePublisher;
@RestController
public class TestRestController {
private static final Logger logger = LoggerFactory.getLogger(TestRestController.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private JsonRedisTemplate jsonRedisTemplate;
public TestRestController() {
}
@GetMapping("/version")
public String version() throws IOException {
Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
logger.info(clientVersion);
return clientVersion;
}
@GetMapping("/pub/demo")
public String pub() {
RedisMessagePublisher publisher = new RedisMessagePublisher(stringRedisTemplate, new ChannelTopic("demo"));
String message = "Message " + UUID.randomUUID();
publisher.publish(message);
return message;
}
@GetMapping("/pub/test")
public String pub(@RequestParam String message) {
RedisMessagePublisher publisher = new RedisMessagePublisher(stringRedisTemplate, new ChannelTopic("test"));
publisher.publish(message);
return message;
}
@GetMapping("/pub/json")
public RestfulResponse pubJson() {
RestfulResponse restfulResponse = new RestfulResponse(true, 0, null, null);
jsonRedisTemplate.opsForValue().set("test", restfulResponse);
jsonRedisTemplate.convertAndSend("test", restfulResponse);
return restfulResponse;
}
}