- 进行环境配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
- 配置redis
package com.wd.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfig {
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMaxTotal(20);
jedisPoolConfig.setMinIdle(5);
return jedisPoolConfig;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
jedisConnectionFactory.setHostName("192.168.157.135");
jedisConnectionFactory.setPort(6379);
jedisConnectionFactory.setPassword("redis");
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTempLate(JedisConnectionFactory jedisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
- 配置消息监听
-
package com.wd.config;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;
import com.wd.msgListener.RedisMsgListener;
@Configuration
public class MessageListenerConfig {
/*
* @Bean public ChannelTopic channelTopic(){ ChannelTopic channelTopic = new
* ChannelTopic("chat2"); return channelTopic; }
*/
/**
* 订阅多个
* @return
*/
@Bean
public List<ChannelTopic> channelTopicList(){
ChannelTopic channelTopic1 = new ChannelTopic("chat1");
ChannelTopic channelTopic2 = new ChannelTopic("chat2");
ChannelTopic channelTopic3 = new ChannelTopic("chat3");
ArrayList<ChannelTopic> channelTopicList = new ArrayList<>();
channelTopicList.add(channelTopic1);
channelTopicList.add(channelTopic2);
channelTopicList.add(channelTopic3);
return channelTopicList;
}
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(JedisConnectionFactory jedisConnectionFactory,RedisMsgListener redisMsgListener,List<ChannelTopic> channelTopicList){
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(jedisConnectionFactory);
// ArrayList<ChannelTopic> list = new ArrayList<ChannelTopic>();
// list.add(channelTopic);
//此处使用Map<MessageListener, ArrayList<ChannelTopic>> listeners = new HashMap<>();
//总是报错
Map<MessageListener, Collection<? extends Topic>> listeners = new HashMap<>();
listeners.put(redisMsgListener, channelTopicList);
redisMessageListenerContainer.setMessageListeners(listeners);
return redisMessageListenerContainer;
}
/*@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(JedisConnectionFactory jedisConnectionFactory,RedisMsgListener redisMsgListener,ChannelTopic channelTopic){
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(jedisConnectionFactory);
ArrayList<ChannelTopic> list = new ArrayList<ChannelTopic>();
list.add(channelTopic);
//此处使用Map<MessageListener, ArrayList<ChannelTopic>> listeners = new HashMap<>();
//总是报错
Map<MessageListener, Collection<? extends Topic>> listeners = new HashMap<>();
listeners.put(redisMsgListener, list);
redisMessageListenerContainer.setMessageListeners(listeners);
return redisMessageListenerContainer;
}*/
}
package com.wd.msgListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisMsgListener implements MessageListener{
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();
String msgBody = (String) redisTemplate.getValueSerializer().deserialize(body);
System.out.println(msgBody);
byte[] channel = message.getChannel();
String msgChannel = (String) redisTemplate.getValueSerializer().deserialize(channel);
System.out.println(msgChannel);
String msgPattern = new String(pattern);
System.out.println(msgPattern);
}
}
- 测试
package com.wd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
package com.wd.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.wd.App;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = App.class)
public class RedisTest {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testSet() {
String channel = "chat1";
String msg1 = "hello 发布订阅1";
redisTemplate.convertAndSend(channel, msg1);
String channe2 = "chat2";
String msg2 = "hello 发布订阅2";
redisTemplate.convertAndSend(channe2, msg2);
String channe3 = "chat3";
String msg3 = "hello 发布订阅3";
redisTemplate.convertAndSend(channe3, msg3);
};
}