1 发布者发布消息到不同的频道,订阅者接收来自不同频道的消息。
1.1 设计到Redis的publish和subscribe,publish向指定的端口推送消息,subscribe监听指定频道的消息。
Linu下举例如下:
监听端:
发送端:
上图中监听名为third的频道,使用publis指令在third中推送消息,可以看到在监听端接收到了发送的消息。
1.2 java代码实现:
向频道推送消息:
Jedis jedis = new Jedis("localhost");
jedis.publish("one","hello");
jedis.close();
监听端口:
Java相关:
添加依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
向频道发送消息代码:
public static void publishMessage() {
Jedis jedis = new Jedis("192.168.209.129", 6379);
jedis.publish("channel.test", "德玛西亚万岁!!!");
System.out.println("向频道发送消息成功。。。");
}
订阅频道代码:
public static void subscribeChannel() {
Jedis jedis = new Jedis("192.168.209.129", 6379);
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
// TODO Auto-generated method stub
System.out.println("接收通过频道发送的消息--》"+message);
super.onMessage(channel, message);
}
}, "channel.test");
}
先启动订阅的代码,然后再启动发布消息的代码。接收端会一直阻塞,只有取消订阅才不会阻塞。
运行情况:
与SpringBoot整合
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Autowired
private MessageListener redisMessageListener;
/**
* 处理线程
*/
private ThreadPoolTaskScheduler taskScheduler;
/**
* 运行线程等待处理Redis消息
* @return
*/
@Bean
public ThreadPoolTaskScheduler initTaskScheduler(){
if(this.taskScheduler != null){
return this.taskScheduler;
}
this.taskScheduler=new ThreadPoolTaskScheduler();
this.taskScheduler.setPoolSize(20);
return this.taskScheduler;
}
/**
* 话题与消息处理类绑定
* @return
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(){
RedisMessageListenerContainer redisMessageListenerContainer=new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(this.redisConnectionFactory);
redisMessageListenerContainer.setTaskExecutor(taskScheduler);
Topic topic=new ChannelTopic("topic1");
redisMessageListenerContainer.addMessageListener(this.redisMessageListener,topic);
return redisMessageListenerContainer;
}
消息处理类实现MessageListener接口
/**
* @Author: ShipTang
* @Date: 2019/1/29 16:20
*/
@Component
public class RedisMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
//消息体
String body=new String(message.getBody());
//渠道名称
String topic=new String(pattern);
System.out.println(body);
System.out.println(topic);
}
}
参考:http://www.runoob.com/redis/redis-pub-sub.html
http://blog.csdn.net/u011734144/article/details/51782085
《深入浅出SpringBoot 2.X》