jdk自带观察者模式 监视重要进程

使用观察者模式重启异常线程
本文介绍了一种利用观察者模式监控并重启发生异常的关键线程的方法,通过实现Observer接口并在Update方法中处理异常,确保系统稳定运行。

    一些关键的线程在发生了莫名的错误时,往往造成整个系统的崩溃,比如我现在做的东东,几个小模块间的通信都是使用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);

在使用时只要将这些关键线程添加观察者,大功告成,再也不用担心线程挂了。

转载于:https://my.oschina.net/zjoschina/blog/179773

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值