Redis除了可以用作緩存數據外,另一個重要用途是它實現了發佈訂閱(pub/sub)消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
爲了實現redis的發佈訂閱機制,首先要打開redis服務;其次,引入redis需要的jar包,在pom.xml配置文件加入以下代碼:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.1.0</version>
</dependency>
由於訂閱消息通道需要再tomcat啓動時觸發,因此,需要創建一個listener監聽器,在監聽器裏實現redis訂閱,在web.xml裏配置監聽器如下:
<listener>
<listener-class>com.test.listener.InitListener</listener-class>
</listener>
一、訂閱消息(InitListener實現)
redis支持多通道訂閱,一個客戶端可以同時訂閱多個消息通道,如下代碼所示,訂閱了13個通道。由於訂閱機制是線程阻塞的,需要額外開啓一個線程專門用於處理訂閱消息及接收消息處理。
複製代碼
public class InitListener implements ServletContextListener{
private Logger logger = Logger.getLogger(InitListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("啓動tomcat");// 連接redis
Map<String, String> proMap = PropertyReader.getProperties();
final String url = proMap.get("redis.host");
final Integer port = Integer.parseInt(proMap.get("redis.port"));
final ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
final RedisSubListener redisSubListener = (RedisSubListener) classPathXmlApplicationContext.getBean("redisSubListener");
// 爲防止阻塞tomcat啓動,開啓線程執行
new Thread(new Runnable(){
public void run(){
// 連接redis,建立監聽
Jedis jedis = null;
while(true){
//解碼資源更新通知,畫面選看回復,畫面選看停止回覆,預案啓動,預案停止,輪切啓動,輪切停止,預案啓動回覆,預案停止回覆,輪切啓動回覆,輪切停止回覆,監視屏分屏狀態通知,畫面狀態通知
String[] channels = new String[] { "decodeResourceUpdateNtf", "tvSplitPlayRsp","tvSplitPlayStopRsp",
"planStartStatusNtf", "planStopStatusNtf", "pollStartStatusNtf", "pollStopStatusNtf",
"planStartRsp","planStopRsp","pollStartRsp","pollStopRsp","tvSplitTypeNtf","tvSplitStatusNtf"};
try{
jedis = new Jedis(url,port);
logger.info("redis請求訂閱通道");
jedis.subscribe(redisSubListener,channels);
logger.info("redis訂閱結束");
}catch(JedisConnectionException e){
logger.error("Jedis連接異常,異常信息 :" + e);
}catch(IllegalStateException e){
logger.error("Jedis異常,異常信息 :" + e);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(jedis != null){
jedis = null;
}
}
}})
.start();
}
複製代碼
最後在spring配置文件裏接入以下配置:
複製代碼