Jnotify動態監聽文件夾,郵件系統文件夾監聽示例

来源:http://www.cnblogs.com/herkey/archive/2016/06/23/5611713.html
-Advertisement-
Play Games

JNotify,一個支持動態監控文件和文件夾(支持級聯監控)的架包。在linux系統中,調用的是linux底層的inotify服務,只是添加了對子文件夾級聯監控的功能。在windows中,需要添加附件的dll文件,因為windows預設沒有該服務 一、郵件系統對本地文件夾的監聽 1、使用 jnoti ...


JNotify,一個支持動態監控文件和文件夾(支持級聯監控)的架包。在linux系統中,調用的是linux底層的inotify服務,只是添加了對子文件夾級聯監控的功能。在windows中,需要添加附件的dll文件,因為windows預設沒有該服務

一、郵件系統對本地文件夾的監聽

1、使用 jnotify 需要導入 jnotify.jar

2、需要在jdk/bin 添加jnotify 本地方法:jnotify.dll  jnotify_64bit.dll

二、步驟

1、jnotify監聽目錄

public class MailWatcher {
    /** 日誌 */
    private static final Logger LOG = LoggerFactory
            .getLogger(MailWatcher.class);
    // 收件路徑
    private String path;
    public MailWatcher() {
        // 收件郵件路徑
         path = Configure.getString("path");
    }
    // 監聽主線程
    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
                            | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
                    // 監聽接收郵件
                    int watchId = JNotify.addWatch(path, mask, true, new  MailListener());
                    // 是否監聽子目錄
                    boolean watchSubtree = true;
                    // 日誌
                    LOG.info("watcher開始監聽:{} {}", path, watchId);
                } catch (Exception e) {
                    LOG.error("監聽失敗", e);
                }
            }
        }).start();


        // 不讓主線程掛掉
        while (true) {
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

2、監聽器,

//文件創建 動態監聽
public class MailListener implements JNotifyListener {

    /** 日誌 */
    private static final Logger LOG = LoggerFactory.getLogger(MailListener.class);
//文件重命名時
    public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
        LOG.debug("{} renamed to {}", oldName, newName);
    }
//文件修改時
    public void fileModified(int wd, String rootPath, String name) {
        LOG.debug("{} modified", name);
    }
//文件刪除時
    public void fileDeleted(int wd, String rootPath, String name) {
        LOG.debug("{} deleted", name);
    }
//文件創建時
    public void fileCreated(final int wd, final String rootPath, final String name) {
        if (name.endsWith(".eml")) {
            LOG.info("{} created", name);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    LOG.info("{},開始讀取", name);
                    MimeMessage msg = null;
                    File file = new File(rootPath, name);
                    try {
                        Thread.sleep(Configure.getLong("wait_first_time"));
                    } catch (Exception e) {
                        LOG.warn("{},初始等待失敗", name);
                    }
                    // 再迴圈等待50次,每次等待10秒,共計500秒
                    // 寫入郵件需要時間,所以迴圈
                    for (int i = 0; i < Configure.getInt("wait_times"); i++) {
                        try {

          //這裡寫的封裝,file--->mimemessage
                            msg = EmlFileHelper.getMimeFile(file);
                            break;
                        } catch (Exception e) {
                            LOG.debug("第{}次讀取文件{}失敗", i + 1, name, e);
                        }
                        try {
                            Thread.sleep(Configure.getLong("wait_time_interval") * 1000l);
                        } catch (InterruptedException e) {
                            LOG.debug("等待失敗", e);
                        }
                    }
                    if (msg == null) {
                        LOG.error("{},重試後讀取失敗", name);
                        return;
                    }
                    if (!Configure.getBoolean("not_intercept_send_email")) {
                        // 判斷是否是發出的郵件,如果是,就不記錄
                        try {
                            String receiver = name.substring(0, name.indexOf(File.separator));

          //這裡是我寫的郵件幫助類,忽略
                            String from = MailHelper.getFrom(msg);
                            if (from.startsWith(receiver + "@")) {
                                LOG.info("{}是發出的郵件,不記錄", name);
                                return;
                            }
                        } catch (Exception e) {
                            LOG.error("判斷是否是發出的郵件失敗", e);
                        }
                    }
                    try {
                        saveMsg(msg, name);
                        LOG.info("{},保存成功", name);
                    } catch (Exception e) {
                        LOG.error("{},保存失敗", name, e);
                    }
                }
            }).start();
        }       
    }
}


3、開啟監聽,

public class Main {
    public static void main(String[] args) throws Exception {
        new MailWatcher().start();
    }
}

4、說明,在main中開啟主線程,文件修改觸發jnotify 監聽方法,


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天通過幾個小程式以及Hangout源碼學習了CLI的基本使用,今天就來嘗試翻譯一下CLI的官方使用手冊。 下麵將會通過幾個部分簡單的介紹CLI在應用中的使用場景。 昨天已經聯繫過幾個基本的命令行參數使用場景, "可以參考這裡" 通過使用Apache Commons CLI可以幫助開發者快速構建命令 ...
  • 本文以序列長度20的{ 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};以及頁面4;為例; 結果: ...
  • 題目 輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重覆的數字。 例如,前序遍歷序列:{1,2,3,7,3,5,6,8},中序遍歷序列:{4,7,2,1,5,3,8,6} 答案 前序遍歷: 前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷 ...
  • view剩餘代碼 ...
  • 2016年6月22日,第一款開源免費的完整支持PHP 7版本的IDE PDT 4終於發佈。原本我是期望Netbeans 8.2的,但PDT 4.0 發佈,就等不及了。 PDT團隊很高興的宣佈PDT新版本 4.0發佈: 這是一個大版本的發佈,它做了巨大的性能改進。修複了100個bug: 完整支持PHP ...
  • 題外話:該分頁顯示是用 “表示層-控制層-DAO層-資料庫”的設計思想實現的,有什麼需要改進的地方大家提出來,共同學習進步。 思路:首先得在 DAO 對象中提供分頁查詢的方法,在控制層調用該方法查到指定頁的數據,在表示層通過 EL 表達式和 JSTL 將該頁數據顯示出來。 重點:兩個方法:(1)計算 ...
  • 之前說了許可權認證,其實也就是登錄驗證身份 這次來說說shiro的授權 shiro可以針對角色授權,或者訪問資源授權 兩者都行,但是在如今的複雜系統中,當然使用後者,如果你是小系統或者私活的話,前者即可,甚至可以不用,我懂的 好吧,上代碼: 首先新建一個ini,登陸信息以及許可權配置好 以下代碼先登陸, ...
  • 我們可以使用C的結構體來表示數據結構元素,比如鏈表或樹的節點,指針是把這些元素聯繫到一起的紐帶 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...