摘要: 觀察者模式,定義對象之間的一種一對多的依賴關(guān)系,當(dāng)對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并且被自動更新。觀察者模式在JDK中有現(xiàn)成的實現(xiàn),java.util.Obserable。
首先說下需求:通過ftp上傳約定格式的文件到服務(wù)器指定目錄下,應(yīng)用程序能實時監(jiān)控該目錄下文件變化,如果上傳的文件格式符合要求,將將按照每一行讀取解析再寫入到數(shù)據(jù)庫,解析完之后再將文件改名。(這個是原先已經(jīng)實現(xiàn)了的功能,請看我的一篇文章java利用WatchService實時監(jiān)控某個目錄下的文件變化并按行解析(注:附源代碼))
但項目上線一段時間后,發(fā)現(xiàn)再利用FileZilla登陸上傳文件,文件不能被解析,而重啟tomcat之后再上傳,又能解析,于是判定是監(jiān)控指定目錄的那個線程掛掉了,導(dǎo)致上傳后的文件不能被檢測到,故也不能被解析。之后查看日志也最終驗證了我推斷。
所以關(guān)鍵的問題就是:如何監(jiān)聽線程,當(dāng)意外退出線程后進行自動重啟,這也是本文所要利用觀察者模式實現(xiàn)的。
下面請看實現(xiàn)過程(尤其見紅色注解部分):
1、web.xml監(jiān)聽器配置文件監(jiān)控監(jiān)聽器,初始化創(chuàng)建一個監(jiān)控指定目錄的線程
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">