redis 发布订阅
1.0 Redis配置
开启队列配置
spring:
redis:
topics:
enable: false
package com.connext.soa.platform.price.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.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
// value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);
// key的序列化采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
1.1 生产者
public void carryOnOrderedQueue(Long userId) {
redisTemplate.convertAndSend(SUB_KEY, userId.toString());
}
1.2 初始化监听
package com.connext.soa.platform.price.listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
@Configuration
@Slf4j
public class RedisSubConfig {
public static final String SUB_KEY = "DROOLS:MESSAGE";
@Bean(name = "droolsContainer")
RedisMessageListenerContainer droolsContainer(RedisConnectionFactory connectionFactory, @Qualifier("droolsListenerAdapter") MessageListenerAdapter droolsListenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(droolsListenerAdapter, new PatternTopic(SUB_KEY));
return container;
}
@Bean(name = "droolsListenerAdapter")
MessageListenerAdapter droolsListenerAdapter(MessageSubListener redisPubSubListener) {
log.info("drools listenerAdapter register");
return new MessageListenerAdapter(redisPubSubListener, "onMessage");
}
}
1.2 消费者
package com.connext.soa.platform.price.listener;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringEscapeUtils;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;
/**
* @author maple Yu
* @version 1.0
* @date 2023/9/4 下午5:36
*/
@Component
@Slf4j
public class MessageSubListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] bytes) {
String messageBody = new String(message.getBody());
String msgResult = StringEscapeUtils.unescapeJava(messageBody);
log.info("onMessage.msgResult {} {}", msgResult, messageBody);
}
}