版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433454
使用jedis 实现redis消息订阅是一个独立的线程(长连接与Redis server通讯),
在实际应用场景下,Redis服务暂时中断是可预见一种异常,必须处理,这时就必须实现重连(reconnect)。
下面是我的应用中实现subscribe reconnect的逻辑。
/**
* 创建消息线程,订阅指定的频道<br>
* @param channels 频道名列表
*/
private void open(final String... channels){
Runnable run = new Runnable(){
String[] subs = channels;
@Override
public void run() {
// 如果连接异常则释放当前连接对象重新申请连接
for(;;){/** 无限循环,JVM结束时自动关闭线程 */
try{
// 获取Jedis实例执行频道订阅
getJedis().subscribe(jedisPubSub,subs);
break;
} catch (JedisConnectionException e) {
// 释放当前连接再试
releaseJedis();
logger.error("Subscribing failed. {}", e.getMessage());
// 延时后再试
try {
Thread.sleep(RECONNECT_DELAY_MILLS);
} catch (InterruptedException e1) {
}
// 从channelSubs获取所有注册频道,重新注册
subs = channelSubs.keySet().toArray(new String[0]);
}catch (Exception e) {
logger.error("Subscribing failed.", e);
}
}
}};
// subscribeExecutor是一个线程池,JVM结束时自动关闭
subscribeExecutor.execute(run);
}
完整代码参见码云(GITEE)仓库:gu.simplemq.redis.RedisSubscriber