redis同樣可以實現消息隊列的發佈訂閱功能,發佈消息者使用比較簡單,訂閱消息者則需要手動繼承 redis.clients.jedis.JedisPubSub 這個抽象類,消費者有動作時就會回調這個實現類的方法。
新建兩個maven工程,生產者和消費者。
生產者的pom文件如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tansun</groupId>
<artifactId>ProducerTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
生產者的main方法
package com.tansun;
import java.util.Date;
import redis.clients.jedis.Jedis;
public class ProducerTest {
@SuppressWarnings("resource")
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.229.128", 6379);
// 向“channel1”的頻道發送消息, 返回訂閱者的數量
Long publishCount = jedis.publish("channel1", new Date() + ": hello redis channel1");
jedis.publish("channel1","close channel");
System.out.println("發送成功,該頻道有" +publishCount + "個訂閱者");
}
}
消費者的pom文件與生產者相同
消費者需要手動繼承 redis.clients.jedis.JedisPubSub 這個抽象類,重寫部分需要的方法:
package com.tansun;
import redis.clients.jedis.JedisPubSub;
public class MessageHandler extends JedisPubSub {
/*
* channel頻道接收到新消息後,執行的邏輯
*/
@Override
public void onMessage(String channel, String message) {
// 執行邏輯
System.out.println(channel + "頻道發來消息:" + message);
// 如果消息爲 close channel, 則取消此頻道的訂閱
if("close channel".equals(message)){
this.unsubscribe(channel);
}
}
/*
* channel頻道有新的訂閱者時執行的邏輯
*/
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(channel + "頻道新增了"+ subscribedChannels +"個訂閱者");
}
/*
* channel頻道有訂閱者退訂時執行的邏輯
*/
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.println(channel + "頻道退訂成功");
}
}
消費者的main方法
package com.tansun;
import redis.clients.jedis.Jedis;
public class ConsumerTest {
@SuppressWarnings("resource")
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.229.128", 6379);
MessageHandler handler = new MessageHandler();
jedis.subscribe(handler, "channel1");
}
}
注意需要先啓動消費者的main方法開啓訂閱,然後再啓動生產者發佈消息。
這裏的訂閱頻道採用的是完全匹配的規則,另外,redis還支持按規則訂閱,這裏不再贅述。
如果想了解redis實現消息隊列的queue模式,可以參考我的另一篇文章 http://blog.csdn.net/jia_costa/article/details/79030621