afterJFinalStart()中订阅频道 项目无法启动

@Override

public void afterJFinalStart() {

Jedis jedis = Redis.use("overall").getJedis();

jedis.psubscribe(new OrderSubscribe(), "__keyevent@0__:expired");

}

如上,有哪位大神能给小弟讲解下吗

评论区

JFinal

2017-09-18 16:56

有没有异常抛出? 程序是否停在了jedis.psubscribe(...)?如果是,则是程序被这行代码阻塞, jfinal 没启动完成

社会你冲哥

2017-09-18 18:37

@JFinal 没有异常抛出,项目虽然启动超时,但是项目中的定时任务却执行了

社会你冲哥

2017-09-18 18:50

@JFinal 我是想在项目启动后,利用redis的频道订阅,能够在key失效后监听到,请问有什么好的办法吗

aloneJFinal

2017-09-30 13:22

@社会你冲哥 Jedis.psubscribe()是一个阻塞式方法,订阅完成后会一直卡在那,导致JFinal的其他模块无法运行,造成启动超时,你可以再开一个线程启动。
private static final OrderSubscribe redisListener = new OrderSubscribe();
public void afterJFinalStart() {
new Thread(new Runnable() {
public void run() {
Jedis jedis = Redis.use("overall").getJedis();
jedis.psubscribe(redisListener, "__keyevent@0__:expired");
}
).start();
}
项目关闭时,取消订阅:
public void beforeJFinalStop() {
//取消redis订阅
redisListener.punsubscribe("__keyevent@0__:expired");
}

注意,JFinal启动时afterJFinalStart() 方法会运行两次,这样会导致你订阅2次,同一个key过期事件消息收到2次,所以你需要在afterJFinalStart() 方法中处理一下,使其中的代码只运行一次,这里不赘述。
@JFinal afterJFinalStart() 运行两次,没细看,什么梗?

aloneJFinal

2017-09-30 14:27

抱歉,可能是我IDE缓存的原因,当我清理后,afterJFinalStart()只会运行一次了。

热门分享

扫码入社