利用redis實現消息隊列之topic模式

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章