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

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

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

    好好生活,努力工作,天天向上!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      46 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

        你是不是在找將Java程序注冊成系統服務的方法?試試Java Service Wrapper這個工具吧,你可以從這個網站上面下載你喜歡的版本:http://wrapper.tanukisoftware.org/ ,Java Service Wrapper提供了適合市面上流行的操作系統的版本。

        使用WrapperJava程序注冊成系統服務有三種方式可供選擇:

        第一種是使用WrapperSimpleApp 這個幫助類來運行你的程序,這個是最簡單的方法,也是官方推薦使用的方式,但是這樣可能會對你的程序有改動,如果你在項目初期就開始考慮的話,這個方法還是不錯的。像JBoss也是使用這種方式。

        第二種方式是使用WraperStartStopApp這個類來實現功能,這個方法適合那些通過ClassA類來負責啟動服務,ClassB類來負責停止服務的應用場景。

        我使用的是第三種方式,這種方式好處是對程序改動比較小,只要讓你的啟動類實現WrapperListener接口,并實現接口中的start(String[] args) 和 stop(String [] args)方法,然后通過WrapperManager來啟動。其他的一些配置比如要運行的主類全名、Java類路徑、依賴Java庫的路徑、還有服務顯示的名稱,都可以通過配置文件conf/wrapper.conf來配置,相對來說比較靈活,像我目前在做的RCP項目有自動更新功能,更新下來的插件要比那些原來的插件的版本號要更新,雖然說會定期刪除那些過期的插件,但有時還是會產生延遲,那么配置文件里面配置的Java類路徑必須也要鏈接到最新的插件的地址,我是通過一個Java類來管理這個wrapper.confg文件,如果有更新的插件,通過Java類來得到最新插件的路徑,將這些信息寫入到wrapper.confg文件中,這樣就能保證配置文件中的類路徑是最新的了。
       下面是程序的結構:

      

       這里主頁介紹一下wrapper.conf的配置,這個配置文件是Java常用的屬性文件格式,

       wrapper.java.command=java: 指定要運行的Java,如果你不想設置環境變量的話,你也可以指定JDKbin文件路徑

       wrapper.java.mainclass=test.Main: 指定要運行的類,這個類必須實現WrapperListener接口和接口中的startstop方法,通過WrapperManager類來初始化服務。如果啟動服務過程中出現與不能取得JVM信息的情況,可能是接口實現的問題。

       wrapper.java.classpath.1=../lib/wrapper.jar:配置Java的類路徑,這里的將wrapper.jar也包含在內,這里可以設置參數的位置,而且這個位置必須得從開始,不能跳過,必須順序指定,指定類路徑的時候還有根據依賴關系來排列,被依賴的排在前面,否則會出現ClassNotFoundException的錯誤,這里支持覺得路徑和相對路徑,也支持通配符"*",比如wrapper.java.classpath.1=../lib/wrapper*,不過這個通配符只能用于匹配文件名,不能用于匹配文件夾名稱。

       wrapper.java.library.path.1=../lib指定Wrapper自帶的類庫文件存放文件夾,比如Wrapper.DLL文件等,只要指定到對應的上級目錄名稱就行,支持通配符。

       wrapper.java.library.path.1=../lib指定Wrapper自帶的類庫文件存放文件夾,比如Wrapper.DLL文件等,只要指定到對應的上級目錄名稱就行,支持通配符。

       wrapper.app.parameter.1= :指定運行類的main方法參數。

       wrapper.daemonize=TRUE:將服務注冊成守護線程,就算程序關閉的話不影響服務的運行

       wrapper.ntservice.hide-console=false:不顯示控制臺

       wrapper.filter.trigger.1= , wrapper.filter.action.1 :指定過濾器和觸發器,可以對控制臺的輸出信息進行監聽,然后觸發相應的操作

       wrapper.disable_shutdown_hook=TRUE:是否禁用 "關閉Hook" ,關閉的話在出現一般異常的情況下面可以忽略掉異常繼續執行

       wrapper.console.loglevel=INFO配置控制臺的顯示信息的級別,NONE不顯示任何輸出信息,FATAL只顯示致命的錯誤消息,ERROR顯示所有的錯誤消息,STATUS顯示服務狀態的改變,包括服務啟動和停止等信息,INFO顯示所有程序輸出的信息和JVM顯示的信息,如果程序無法正常啟動,可以使用DEBUG顯示詳細的調試信息。

       wrapper.logfile.loglevel=INFO配置日志記錄文件要記錄的輸出信息的級別,參數值和wrapper.console.loglevel功能一致

       wrapper.logfile.maxsize=0配置日志文件的最大大小,如果為0表示不限制日志文件的大小,支持標記符,“k”代表KB,“m”代表MB,如果要設置最大大小為100KB的話可以這樣:wrapper.logfile.maxsize=100k

       wrapper.console.title=Wrapper Demo 控制臺窗口顯示標題,

       wrapper.ntservice.name=testwrapper: 系統服務的名稱

       wrapper.ntservice.displayname=Wrapper Demo在服務管理中顯示的名稱

       wrapper.ntservice.description=Wrapper Demo的介紹信息: 在服務管理器顯示服務的描述信息

       wrapper.ntservice.starttype=AUTO_START: 配置服務啟動方式,可以選擇AUTO_START(自動)DEMAND_START(手動)兩種方式。默認為自動。


       前幾天在看Jetty源代碼的時候發現它也是使用Wrapper注冊成系統服務,使用的是第三種方式,可以參考一下,

    import java.io.PrintStream;
    import org.mortbay.jetty.Server;
    import org.mortbay.start.Main;
    import org.tanukisoftware.wrapper.WrapperListener;
    import org.tanukisoftware.wrapper.WrapperManager;

    public class JettyServiceWrapperListener implements WrapperListener {
      
    private static Server __server = null;

      
    public void controlEvent(int event) {
        
    if ((WrapperManager.isControlledByNativeWrapper()) || ((event != 200&& (event != 201&& (event != 203)))
          
    return;
        WrapperManager.stop(
    0);
      }

      
    public Integer start(String[] args) {
        
    for (int i = 0; i < args.length; ++i) {
          System.out.println(
    "ARG[" + i + "] = " + args[i]);
        }
        Main.main(args);
        
    return null;
      }

      
    public int stop(int code) {
        
    try {
          System.out.println(
    "JettyServiceWrapperListener: Stopping Jetty 6 Service!!!");
          __server.stop();
          System.out.println(
    "JettyServiceWrapperListener: Jetty 6 Service Stopped!!!");
          
    return code;
        }
        
    catch (Exception e) {
          System.out.println(
    "Stop Server Error");
          e.printStackTrace();
        }
        
    return -1;
      }

      
    public static void setServer(Server server) {
        __server 
    = server;
      }

      
    public static Server getServer() {
        
    return __server;
      }

      
    public static void main(String[] args) {
        String[] newStrArgs 
    = new String[args.length + 1];
        newStrArgs[
    0= System.getProperty("jetty.home"+ "etc/jetty-win32-service.xml";
        
    for (int i = 0; i < args.length; ++i) {
          newStrArgs[(i 
    + 1)] = args[i];
        }
        WrapperManager.start(
    new JettyServiceWrapperListener(), newStrArgs);
      }
    }

       這個類實現了WrapperWrapperListener 并實現了它的startstop方法,start方法在服務器啟動的時候調用,不過這里要注意,如果在30秒內你不能執行完start方法,系統會自動放棄這個服務的啟動,解決辦法可以在start方法使用線程,將比較耗時的操作放在這個線程執行,比如加載Spring文件等。而且如果在start方法執行出現異常,會終止服務的運行。這點要注意。

      Stop方法在服務停止啟動,startstop方法的參數可以在wrapper.conf文件里面配置。一般按照這樣配置的話你的程序應該可以通過執行StartApp-NT.bat正常啟動了,

    posted on 2009-08-05 12:27 VWPOLO 閱讀(3642) 評論(1)  編輯  收藏 所屬分類: Java 技術

    Feedback

    # re: 使用Java Service Wrapper 將Java程序注冊成系統服務 2009-08-06 10:53 VWPOLO
    如果想忽略掉一般的異常可以在配置文件里面添加:wrapper.disable_shutdown_hook=TRUE   回復  更多評論
      

    主站蜘蛛池模板: 成人免费视频试看120秒| 99re在线这里只有精品免费| 成年女性特黄午夜视频免费看| 亚洲AV日韩精品久久久久| 久久国产一片免费观看| 亚洲色成人中文字幕网站| 九九热久久免费视频| 精品亚洲一区二区三区在线观看| 日日狠狠久久偷偷色综合免费 | 亚洲精品视频在线| 久久成人免费播放网站| 亚洲狠狠综合久久| 一二三四免费观看在线视频中文版 | 亚洲乱妇老熟女爽到高潮的片| 麻豆国产人免费人成免费视频 | xxxxx做受大片在线观看免费| 亚洲精品无码永久在线观看| 最近更新免费中文字幕大全| 亚洲国产精品久久久久婷婷软件| 97公开免费视频| 亚洲欧美国产国产一区二区三区| 免费大黄网站在线观| 9久热精品免费观看视频| 亚洲国产女人aaa毛片在线| 无人在线直播免费观看| 国产精品亚洲精品日韩动图| 中文亚洲AV片在线观看不卡| 8x网站免费入口在线观看| 亚洲性色精品一区二区在线| 国产亚洲欧洲Aⅴ综合一区| 99精品视频在线视频免费观看 | 亚洲国产系列一区二区三区| 免费二级毛片免费完整视频| 久久免费视频观看| 亚洲色成人网站WWW永久四虎| 亚洲国产精品尤物YW在线观看| 午夜视频在线免费观看| 亚洲爆乳少妇无码激情| 亚洲精品V欧洲精品V日韩精品 | 久久综合日韩亚洲精品色| 青苹果乐园免费高清在线|