<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java 實現程序運行狀態監控 之我的思路(守護進程)

     

    Java 實現程序運行監控狀態之我的思路(守護進程)

    問題:寫出這個工具的意義在于我運行一個需要長時間執行的程序,如單線程爬蟲。在網絡出現中斷的或網站丟包情況下,程序會拋出socketexception sockettimeoutexception程序會中斷。(再此只是提出一種假設)

    解決方案:

    Java 并不能像C#一樣對windows的進程進行監控(資料說這是跨平臺原因)。因此沒有api 提供對其他進程的監控(如果在此您有其他辦法,希望您給出寶貴建議)。所以很多人都是通過對文件的加鎖,來判斷程序是否在運行。

    一、判斷當前程序是否正在運行

    在此我參考了:

    java 對文件的加鎖。

    http://www.examda.com/Java/jichu/20070411/140527453.html

    (原文地址不知)

    這里的思路是:

    1、 在要監視寫的程序中(這里假設為爬蟲)對一個用來判斷程序是否運行的文件(自定義,無實際意義。只是一個空文件)對文件進行加鎖。

    2、 在守護程序中寫了簡單的 循環來實現按時探測。這里面比如說20秒。

    3、  如果程序確實在運行(即文件不能再被加鎖,因為已被鎖),那么證明程序確實在運行,否則,如果程序出現了網絡異常而中斷,那么runtime重新調用該程序。

    (演示代碼如下:注意不要忘了在爬蟲程序中需要對文件進行加鎖)。這樣才有效。

    演示代碼:





    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.channels.FileChannel;
    import java.nio.channels.FileLock;

    import data.BaseDataofConfiguration;

    public class ThreadKeepTools {
        
    /**
        * 通過文件鎖來判斷程序是否正在運行
        * 
    @return 如果正在運行返回true,否則返回false
        
    */

        
    private static boolean isRunning(String fileLockPath)
        
    {
            
    boolean rv=false;
            
    try {
                
    //
                String os_name=System.getProperty("os.name");
                
    //指定文件鎖路徑
                String path=null;
                
    if(os_name.indexOf("Windows")>-1)
                
    {
                    
    //如果是Windows操作系統
                    path=System.getProperty("user.home")+System.getProperty("file.separator");
                }

                
    else
                
    {
                    path
    ="/usr/temp/";
                }

                File dir
    =new File(path);
                
    if(!dir.exists())
                
    {
                    dir.mkdirs();
                }

                
    //程序名稱
                String applicationName="run.bat";
                RandomAccessFile fis 
    = new RandomAccessFile(fileLockPath,"rw");
                FileChannel lockfc 
    = fis.getChannel();
                FileLock flock 
    = lockfc.tryLock();
                
    if(flock == null{
                    System.out.println(
    "程序正在運行.");
                    rv
    =true;
                    
                }
    else {
                    flock.release();
                }

                
             
            }
     catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }

            
    catch (IOException e) {
                e.printStackTrace();
            }

            
    return rv;
        }

        
        
    public static void ExcuteThread() throws InterruptedException{
            String strFilePath
    =BaseDataofConfiguration.baseUrlOfPro+"testThread.txt";
            String strBatPath
    =BaseDataofConfiguration.baseUrlOfPro+"run.bat";
            strBatPath
    =strBatPath.replaceFirst("/""");
            
    while(true){
                System.out.println(
    "strFilePath:"+strFilePath);
            
    boolean RunOrNOT=isRunning(strFilePath);
            System.out.println(
    "RunOrNot:"+RunOrNOT);
            
            
    if(!RunOrNOT){
                
    try {
                    System.out.println(
    "開始執行程序!");
                
                    Runtime.getRuntime().exec(
    "cmd /k start "+strBatPath);
                    System.out.println(
    "strbatpath:"+strBatPath);
                }
     catch (IOException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
     
                
            }
    else {
                Thread.sleep(
    6000);
            }

            Thread.sleep(
    10000);
            
            }

        }

        
    public static void main(String[] args) {
            
    try {
                ExcuteThread();
            }
     catch (InterruptedException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }




    如果您有更好解決方案,希望您聯系我。 歡迎留言,提供您寶貴的意見。代碼不規范,僅供參考。

    # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:36 feenn

    bz提供的方案也挺好的,不過我覺得還可以這樣搞:
    1.JNI方式:典型的開源項目有:http://sourceforge.net/projects/jsysmonitor/
    2.以爬蟲為例,守護程序與爬蟲之間維持一個連接,使用某種具有連接屬性的協議,如socket TCP。當連接異常斷開則認為爬蟲出錯需要重啟,好處是通過使用事件機制,可以實時監控爬蟲。當然,前提是爬蟲源代碼可見,且可以修改。
    典型實現:某些大型分布式系統
    3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當然前提是程序都在JVM中運行。

    當然,守護進程最高效、最完美的做法是使用C/C++來編寫,在各種平臺如Linux/Unix上都有豐富的API可以使用。
    個人建議,僅供參考。  回復  更多評論   

    posted on 2011-05-09 13:42 scorpio小蝎 閱讀(12316) 評論(4)  編輯  收藏 所屬分類: java

    評論

    # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:11 scorpio小蝎

    如果您有改進建議,或者更好方案,歡迎留言,再次表示感謝  回復  更多評論   

    #  kjdwbt.keb kh 2011-05-09 15:16 christian louboutin

    If you’re still on the fence: grab your favorite earphones, head down to a Best Buy

    and ask to plug them into a Zune then an iPod and see which one sounds better to you,

    and which interface makes you smile more. Then you’ll know which is right for you.
      回復  更多評論   

    # re: Java 實現程序運行狀態監控 之我的思路(守護進程) [未登錄] 2011-05-09 15:36 feenn

    bz提供的方案也挺好的,不過我覺得還可以這樣搞:
    1.JNI方式:典型的開源項目有:http://sourceforge.net/projects/jsysmonitor/
    2.以爬蟲為例,守護程序與爬蟲之間維持一個連接,使用某種具有連接屬性的協議,如socket TCP。當連接異常斷開則認為爬蟲出錯需要重啟,好處是通過使用事件機制,可以實時監控爬蟲。當然,前提是爬蟲源代碼可見,且可以修改。
    典型實現:某些大型分布式系統
    3.JConsole方式:http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html,當然前提是程序都在JVM中運行。

    當然,守護進程最高效、最完美的做法是使用C/C++來編寫,在各種平臺如Linux/Unix上都有豐富的API可以使用。
    個人建議,僅供參考。  回復  更多評論   

    # re: Java 實現程序運行狀態監控 之我的思路(守護進程) 2011-05-09 15:43 scorpio小蝎小蝎

    @feenn
    非常感謝feenn 的方案 。這種方案非常成熟,有很多應用,大家也可以參考方案  回復  更多評論   

    <2011年5月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 你懂的在线免费观看| 亚洲av无码兔费综合| 最新久久免费视频| 亚洲无线码一区二区三区| 一级特级女人18毛片免费视频| 免费在线观看你懂的| 日本高清免费中文在线看| 亚洲 国产 图片| 一级中文字幕免费乱码专区| 亚洲精品无码永久在线观看| 色吊丝性永久免费看码| 亚洲美女高清一区二区三区| 中文字幕在线视频免费| 久久精品国产亚洲av成人| 成全高清在线观看免费 | 最近的免费中文字幕视频| 亚洲男人的天堂久久精品| 欧美日韩国产免费一区二区三区| 亚洲一区精彩视频| 免费成人黄色大片| 国产免费福利体检区久久| 久久精品国产亚洲AV无码偷窥| 男女超爽刺激视频免费播放| 亚洲人成网站18禁止| 亚洲区日韩区无码区| 久久精品人成免费| 亚洲精品自偷自拍无码| 亚洲欧洲一区二区三区| 91热久久免费精品99| 亚洲成a人片在线不卡一二三区| 亚洲综合亚洲综合网成人| 免费人成视频在线观看网站| 亚洲精品无码永久在线观看男男| 亚洲成A人片在线观看无码3D| 免费在线看黄网站| 亚洲乱理伦片在线观看中字| 国产亚洲大尺度无码无码专线| 一级毛片免费观看不卡视频| 久久水蜜桃亚洲AV无码精品| 久久精品亚洲中文字幕无码网站 | 久久免费看少妇高潮V片特黄|