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