Java Service Wrapper2-構建自己的Wrapper應用

        我們已經瞭解Wrapper的目錄結構,下面可是正式利用Wrapper來包裝我們自己的應用,這裏假設Wrapper的安裝目錄爲:/usr/local/wrapper。

 

        首先,創建項目應用

 

        1.創建一個Java項目,並創建Java 類HelloWorld,並實現WrapperListener 接口,代碼如下:

Java代碼  收藏代碼
  1. package com.helloworld.hello;  
  2.   
  3. import org.apache.log4j.Logger;  
  4.   
  5. public class HelloWorld {  
  6.       
  7.     static Logger logger=Logger.getLogger(HelloWorld.class);  
  8.   
  9.     public static void main(String[] args) {  
  10.         logger.info("Hello World!");  
  11.     }  
  12.   
  13. }  

 

 

        代碼很簡單只是作爲實例作用,這裏引用了log4j 是爲了展示在項目有依賴類庫的情況下如何使用Wrapper 進行包裝。

 

        2.導入相應log4j 的jar 包到classpath 或工程build path 下。


        3.將工程導出爲Jar 包形式:
        (1)在工程名上右鍵 -->Export -->JAR file 導出爲hello.jar。
        注:選擇可運行Jar 導出時會將程序所依賴的相關類包含在Jar 中一併導出,這樣做的好出就是不再需要添加額外的依賴類庫,直接將此Jar包發佈即可,缺點也很明顯依賴關係嚴重不利於升級維護。
        (2)更多的情況是直接按普通jar 包導出,然後在classpath 中添加相關依賴類庫,這樣更加便於維護,我們將按此種方式舉例,導出名爲hello.jar。

 

        其次,上傳Wrapper相關文件

 

        1.上傳程序及依賴:
        (1)上傳hello.jar 與依賴類庫至服務器wrapper 所在lib 目錄.
        (2)上傳Wrapper lib 目錄下的wrapper.jar和libwrapper.so 至服務器/usr/local/wrapper/lib 目錄。

        2.上傳wrapper 主程序:
        (1)上傳Wrapper bin 目錄下的wrapper 文件至服務器/usr/local/wrapper/bin目錄。
        (2)上傳Wrapper src/bin 目錄下的sh.script.in 文件至服務器/usr/local/wrapper/bin 目錄,並修改文件名稱爲:hello,去掉".script.in"後綴。

 

        3.上傳Wrapper conf 目錄下的wrapper.conf 文件至服務器/usr/local/wrapper/conf目錄。

 

        最後,修改相關配置文件內容


        1.修改bin 目錄下的hello 文件內容,利用vi 打開發現內容有將近2千行,其實不必擔心,我們只需要改文件頭部的配置信息即可,內容如下:

Conf代碼  收藏代碼
  1. # 應用名稱  
  2. APP_NAME="hello"  
  3. # 應用全名  
  4. APP_LONG_NAME="helloWorld"  
  5.   
  6. # Wrapper主程序所在目錄及名稱  
  7. WRAPPER_CMD="./wrapper"  
  8. # 配置文件所在目錄及名稱  
  9. WRAPPER_CONF="../conf/wrapper.conf"  

 

 

        2.修改conf 目錄下的wrapper.conf 文件內容。
        (1)找到"wrapper.java.command=java" 這行(43行),可以根據服務器配置修改爲"wrapper.java.command=%JAVA_HOME%/bin/java"
        (2)找到"wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main" 這行(56行),這是程序的入口即main函數所在類,修改成"com.helloworld.hello.HelloWorld"
        (3)找到"wrapper.java.classpath.1=../lib/wrappertest.jar"這行(60,61行),這行表示依賴jar包的位置,作用類似於build path或classpath,我們可以按照順序依次添加我們所依賴的jar包,需要注意的是序號必須以"1"爲起始,添加完成之後如下:

Conf代碼  收藏代碼
  1. wrapper.java.classpath.1=../lib/hello.jar  
  2. wrapper.java.classpath.2=../lib/wrapper.jar  
  3. wrapper.java.classpath.3=../lib/log4j-1.2.17.jar  
  4. wrapper.java.classpath.4=../lib/slf4j-api-1.7.5.jar  
  5. wrapper.java.classpath.5=../lib/slf4j-log4j12-1.7.5.jar  

 

        甚至你可以直接修改爲:

Conf代碼  收藏代碼
  1. wrapper.java.classpath.1=../lib/*.jar  

 

        來加載lib目錄下的所有jar包。

 

        (4)找到"wrapper.java.library.path.1=../lib"這行(64行),這是lib所在目錄可以根據情況修改。

 

        至此所有配置文件的基本修改已經完成,輸入以下命令來啓動我們的程序:

Shell代碼  收藏代碼
  1. root@TFS:/usr/local/wrapper/bin# ./hello console  
  2. Running helloWorld...  
  3. wrapper  | --> Wrapper Started as Console  
  4. wrapper  | Java Service Wrapper Community Edition 64-bit 3.5.20  
  5. wrapper  |   Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.  
  6. wrapper  |     http://wrapper.tanukisoftware.com  
  7. wrapper  |   
  8. wrapper  | Launching a JVM...  
  9. wrapper  | JVM exited while loading the application.  
  10. jvm 1    | <helloWorld>:<INFO>:2013-07-30 16:45:43 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  11. wrapper  | Launching a JVM...  
  12. wrapper  | JVM exited while loading the application.  
  13. jvm 2    | <helloWorld>:<INFO>:2013-07-30 16:45:47 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  14. wrapper  | Launching a JVM...  
  15. wrapper  | JVM exited while loading the application.  
  16. jvm 3    | <helloWorld>:<INFO>:2013-07-30 16:45:52 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  17. wrapper  | Launching a JVM...  
  18. wrapper  | JVM exited while loading the application.  
  19. jvm 4    | <helloWorld>:<INFO>:2013-07-30 16:45:57 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  20. wrapper  | Launching a JVM...  
  21. wrapper  | JVM exited while loading the application.  
  22. jvm 5    | <helloWorld>:<INFO>:2013-07-30 16:46:01 com.helloworld.hello.HelloWorld.main(HelloWorld.java:13): Hello World!  
  23. wrapper  | There were 5 failed launches in a row, each lasting less than 300 seconds.  Giving up.  
  24. wrapper  |   There may be a configuration problem: please check the logs.  
  25. wrapper  | <-- Wrapper Stopped  

 

        得到以上提示說明程序已經運行成功了,但是我們發現最終Wrapper 還是由於報錯而退出了,並且提示我們可能是配置問題,而且我們看到居然啓動了5個jvm 線程。

 

        接下來修改上面的代碼,讓HelloWorld 類實現WrapperListener 接口,修改後的代碼如下:

Java代碼  收藏代碼
  1. package com.helloworld.hello;  
  2.   
  3. import org.tanukisoftware.wrapper.WrapperListener;  
  4. import org.tanukisoftware.wrapper.WrapperManager;  
  5.   
  6. public class HelloWorld implements WrapperListener {  
  7.   
  8.     public static void main(String[] args) {  
  9.         // 打印參數  
  10.         for (String arg : args)  
  11.             System.out.println(arg);  
  12.         WrapperManager.start(new HelloWorld(), args);  
  13.     }  
  14.   
  15.     @Override  
  16.     public void controlEvent(int event) {  
  17.         System.out.println("controlEvent(" + event + ")");  
  18.         if ((event == WrapperManager.WRAPPER_CTRL_LOGOFF_EVENT) && (WrapperManager.isLaunchedAsService() || WrapperManager.isIgnoreUserLogoffs())) {  
  19.         } else {  
  20.             WrapperManager.stop(0);  
  21.         }  
  22.     }  
  23.   
  24.     @Override  
  25.     public Integer start(String[] args) {  
  26.         // 打印參數  
  27.         for (String arg : args)  
  28.             System.out.println(arg);  
  29.         System.out.println("hello world!");  
  30.         return null;  
  31.     }  
  32.   
  33.     @Override  
  34.     public int stop(int exitCode) {  
  35.         System.out.println("stop(" + exitCode + ")");  
  36.         return exitCode;  
  37.     }  
  38.   
  39. }  

 

 

        然後再運行服務,顯示如下結果:

Shell代碼  收藏代碼
  1. root@TFS:/usr/local/wrapper/bin# ./hello console  
  2. Running helloWorld...  
  3. wrapper  | --> Wrapper Started as Console  
  4. wrapper  | Java Service Wrapper Community Edition 64-bit 3.5.20  
  5. wrapper  |   Copyright (C) 1999-2013 Tanuki Software, Ltd. All Rights Reserved.  
  6. wrapper  |     http://wrapper.tanukisoftware.com  
  7. wrapper  |   
  8. wrapper  | Launching a JVM...  
  9. jvm 1    | g21121  
  10. jvm 1    | http://286.iteye.com/  
  11. jvm 1    | WrapperManager: Initializing...  
  12. jvm 1    | g21121  
  13. jvm 1    | http://286.iteye.com/  
  14. jvm 1    | hello world!  
  15. jvm 1    | stop(0)  
  16. wrapper  |  

 

        這樣的結果應該是我們想要的,但是兩者有什麼不同呢?WrapperManager的作用又是什麼,爲什麼會用到它?下篇文章我們仔細分析一下Wrapper的高級應用及配置。


原文:http://286.iteye.com/blog/1916125
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章