一些关键的线程在发生了莫名的错误时,往往造成整个系统的崩溃,比如我现在做的东东,几个小模块间的通信都是使用redis进行,如果正常的情况下,这些关键线程是不会出问题,但是在使用的过程中(使用jedis连接池),偶尔会发生一些莫名的Exception而造成关键线程的终止。
设计图:
观察者:需要实现 Observer接口,就能在update方法中处理你感兴趣的事了,以及你所希望的操作,我的处理方式是直接重新启动一个新的线程。
public class ListenerObserver implements Observer{
private static Logger logger = LoggerFactory.getLogger(ListenerObserver.class);
@Override
public void update(Observable observable, Object arg) {
BaseListener listener = (BaseListener)observable;
try {
listener.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
process方法就是用来通知观察者们,NM,我有情况要报告
public abstract class BaseListener extends Observable {
public void process() {
super.setChanged();
notifyObservers();
}
public abstract void start();
}
public class WakeUpJobListener extends BaseListener {
private static final Logger logger = LoggerFactory.getLogger(WakeUpJobListener.class);
public void start() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
} catch (Exception e) {
process(); //出错时通知相关观察者,调用父类的方法
}
}
}, "wake_up_job_listener_thread");
thread.start();
}
}
//init listener observer
ListenerObserver observer = SpringContextProxy.getBean(ListenerObserver.class);
//init job queue listener
BaseListener logQueueListener = SpringContextProxy.getBean(LogQueueListener.class);
logQueueListener.start();
logQueueListener.addObserver(observer);
//init wake up job queue listener
BaseListener wakeUpListener = SpringContextProxy.getBean(WakeUpJobListener.class);
wakeUpListener.start();
wakeUpListener.addObserver(observer);
在使用时只要将这些关键线程添加观察者,大功告成,再也不用担心线程挂了。