製作windows服務(java)

前言

在之前我寫了篇如何調用微信掃碼支付接口的博客http://blog.csdn.net/qq_32574435/article/details/78952325,但是這個存在一個問題,就是在用戶支付成功之後系統如何通知用戶,說白了就是給用戶一個反饋。人家給了錢你不管是網頁自動跳轉,還是發送支付成功的短信,總得通知人家,這樣起碼不會讓用戶擔心我們是不是沒收到錢,業務是否訂購成功。對於支付成功之後的通知用戶的方式,常見的就是當前網頁跳轉,不過我聽說這個對服務器有一定的要求,然後我最終選擇了製作一個windows服務的形式,不斷去查詢數據庫,將滿足條件的用戶發送短信,比如說有個標誌flag字段,當值爲0時,發送短信,然後將值改爲1。其實製作這個windows服務並不難,網上教程也很多,只不過我當時在這裏花了好長的時間,所以我得把這個過程記下來,紀念一下自己跳過的坑。

開發語言:java
開發工具:eclipse
數據庫:oralce
架構:spring + mybatis

實現過程

一、方案的選擇
以下是我當時考慮的兩種方案:

1、新建一個web項目,使用監聽器的方法,web.xml中註冊一個監聽器,然後利用項目的啓動調用監聽器的初始化方法,去啓動一個線程,這個線程的作用就是不斷去查詢數據庫,然後將滿足條件的用戶發送成功短信。

2、新建一個普通的java maven項目,製作成windows服務,然後將項目製作成jar包,再將jar包製作成windows服務,隨着服務器的啓動去調用main方法啓動線程,也是不斷去查詢數據庫,然後將滿足條件的用戶發送成功短信。如果是部署到windows服務器的話,可以寫成windows服務,如果是部署到linux服務器的話,建議寫成一個定時任務。後面這個我沒做過,請大家自行去百度。

第一個方案是我百度了好久,是我想用的方案,因爲這些組成因素對於我來說還是比較熟悉的。不過後來這個方案被否決了,主要是聽說當時web有個延遲的東西在裏面,當然我也不是很理解,老大推薦我做成一個windows服務的形式,因爲他說這個方案比方案一較好,而且製作windows服務是java程序員的必修課,最終,我選擇了方案二。

二、開發流程

1、第一步當然是新建一個普通的java maven項目,注意不要是web項目。
2、架構的選擇,我這裏選擇的是spring + mybatis 。
3、首先是配置mybatis,然後寫curd的代碼,這些都沒啥好說的。然後就到了spring操作mybatis這個了,以前我一般是使用springmvc mybatis spring 這三個架構組合,然後使用註解的形式,按照依賴關係,比如說@Controller @Resource(name = “UserService”) dao 的方式來實現service 調用dao 。但是現在這個不是web項目,這個方法在這裏不適用啊。然後我就想到了我之前測試mybatis的代碼

public class TestMybatis {

    private ApplicationContext ctx = null;
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception {
        try {
            ctx = new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext.xml");
            sqlSessionFactory = (SqlSessionFactory)ctx.getBean("sqlSessionFactory");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @Test
    public void testOneLevelCache() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        String account = "1827758888";
        String password = "700cac7c";
        User user = userMapper.findByAccount(account, password);
        System.out.println(user);
        sqlSession.close();*87
    }   
    }

我之前都是通過這樣的單元測試來測試代碼是否正常的,我將上面的代碼簡單改寫之後(具體怎麼寫我也忘了),然後每次通過創建session會話的方式從而來實現對數據庫的操作,但是當時被否決了。我用這種方式打成jar包,然後進入cmd ,到達你放jar包的路徑,執行 java -jar xxx.jar 執行,發現是可以執行的,但是執行一段時間之後,就會報異常,好像是獲取session失敗還是獲取bean失敗(具體沒記錄下來),這麼說這種方式應該是行不通的。(感興趣的朋友可以探究下,然後給我留言分享)

後面我選用了下面獲取bean這樣的方式,一直執行,都未報錯。
這裏寫圖片描述

這裏寫圖片描述

使用getBean的方式避開了每次都要創建session,也避免了運行一段時間產生異常情況。

4、寫一個線程,使用死循環的方式,不斷的執行代碼
5、啓動線程方式,main方法

public class SendMsgTask {

    public static void main(String[] args) {

        SendMsgThread  sendMsg = new SendMsgThread();
        sendMsg.start();
    }
}

6、接下來先將代碼打成jar包,注意我這個是maven項目,大家可以參考下這個鏈接
http://blog.csdn.net/xiao__gui/article/details/47341385 寫的很好,我是在pom.xml配置文件中配置,然後左鍵選中項目,然後右鍵 run as —— maven install ,如果項目正常的話,那麼就會在target文件夾下生成你所需要的jar包(其實就是一些class文件)
這裏寫圖片描述

圖中箭頭的sendmsgtask.jar就是你需要的jar包,有興趣的朋友可以點開看看,裏面就是class文件和maven的配置信息,然後旁邊的sendmsgtask-sources.jar裏面放置的是源文件java代碼。
打成jar包的時候,建議大家複製出來,右鍵解壓,點開文件夾查看文件是否齊全,有時候打包的時候會少了conf這個包,解決方法:選中當前項目——project——clean 重新編譯項目在打包基本即可。

7、jar包測試
當你製作成jar的時候,個人建議是先用cmd運行這個jar包來查看是否正常,如果有問題的話控制檯會打印輸出信息,這樣就可以排除,避免製作成windows服務太難排查問題。
自己新建個文件夾,將上圖中的lib文件夾(運行需要的jar包)和sendmsgtask.jar放進去,也許你會問怎麼知道複製出來的時候,lib的相對於sendmsgtask.jar路徑,請看下面這個sendmsgtask.jar中maven的配置圖
這裏寫圖片描述
至於路徑可以參考下圖,我這裏涉及到日誌路徑,所以測試的朋友可以先向我這樣編寫路徑,到時候再將com/aotain/sendmsg/util/LogUtil.java輸出日誌路徑改爲自己的路徑。
這裏寫圖片描述

然後進入cmd 輸入下圖的命令 f: cd 到 jar包所需要的路徑,然後執行java -jar sendmsgtask.jar ,如果一切正常的話,將會輸出下面的日誌信息。恭喜你,已經完成一半了,接下來是製作成windows服務了。
這裏寫圖片描述

8、製作windows服務的工具選擇
其實吧,我試過很多個製作windows服務的工具,不過也就只有一個成功了。不知道是工具不能實現還是我的操作不對,我在這個流程上面花了好多時間,搞得我都快瘋了。
我一開始使用的是javaservice來製作,參考了下面的鏈接http://blog.csdn.net/sky1718/article/details/51103865但是不成功,好像提示啓動失敗。我當時也使用了一個另外一個工具prunsrv,有人介紹它是tomcat製作windows服務的,我當時想我終於要做出來了,心裏有那麼一點小竊喜。但是事與願違,啓動的時候報錯 :服務已經安裝,但是啓動失敗(英文大概意思),我當時還去查看了計算機的系統日誌,也沒給我多大線索,當時花了好多時間都做不出來,都開始懷疑人生了。
後來我使用了wrapper-windows-x86這個工具,在經過一段時間的搗鼓之後,終於成功了。

9、製作流程
其實這個教程網上有很多。下面有詳細的教程。
第一步當然是下載工具:到官網https://wrapper.tanukisoftware.com/doc/english/download.jsp下載windows x86的社區免費版本。這裏要說明下這個工具的分64位和32位,不過64位是收費版,他會先讓你使用一段時間,然後證書過期之後,就會程序停止,我記得當時好像是每十五分鐘服務會停止,然後讓你手動去開啓服務,這個在裏面的配置文件也有說明。所以不管是64位還是32位的電腦,建議直接下載這個工具的32位的。
這裏寫圖片描述
當然大家要是有積分的話也可以到這裏下載http://download.csdn.net/download/love_smallbear/2166538,我用的就是這個。
其實準備好jar包和工具之後,只需要修改工具的配置文件即可,這裏是製作的另外一個核心。我來詳解一下。
至於製作流程參考的這個鏈接http://blog.csdn.net/xs_00/article/details/50818362裏面寫的太麻煩,其實你主要是看配置文件conf/wrapper.conf裏面的參數解析即可
這裏僅僅列出需要修改和需要注意的地方
8.1 找到wrapper.java.command=java
如果本機已配置了jre,那麼此項不需更改;否則的話,需要將jre複製到myWindowServ文件夾路徑下
(如和bin在 同一級,修改wrapper.java.command=../jre/bin/java.exe《注:這裏需要將編譯jar包jre安裝文件全部拷貝過來。》)
8.2 指定wrapper的啓動方式,用wrapper代理啓動不容易出現問題,不然 老報test.Main不存在的異常。
wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
修改成
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
8.3 將程序運行需要的jar包都列出來 lib文件夾中的wrapper.jar是必需的
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../application/myjar.jar
8.4 配置程序運行的所需要的內存大小
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
修改成
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=256
這裏是限制服務所佔用的最小和最大內存,根據程序運行的效果也可以不改。
8.5 指定程序的主類
如 com.weiguo.mypro.TimerRun 是 myJar打包工程中main方法所在的類,
就需要如下配置:
wrapper.app.parameter.1=com.weiguo.mypro.TimerRun
以下的一些設置 就是服務本身的屬性設置,可以 設置—控制面板–管理工具–服務–隨便選中一個服務–右鍵屬性看到。
8.6 控制檯運行時的名稱
wrapper.console.title=TestServer
8.7 指定服務的名稱
wrapper.ntservice.name=TestServer
8.8 windows服務的顯示名稱
wrapper.ntservice.displayname=TestServer
8.9 服務描述
wrapper.ntservice.description=TestServer描述
8.10 啓動模式,默認是自啓動AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
9 運行InstallApp-NT.bat安裝服務,運行StartApp-NT.bat啓動服務。
10 可以暫停,重啓服務 停止服務 PauseApp-NT.bat ResumeApp-NT.bat StopApp-NT.bat
11 如果要卸載這個服務的話,運行UninstallApp-NT.bat卸載服務。

製作流程可以參考我的,簡單粗暴有效
第一步:在f盤新建一個文件夾,取個名字,比如:sandmsgTest,再將wrapper-windows-x86-32-3.2.3.zip解壓,將裏面的lib bin conf logs 這個四個文件夾複製到sandmsgTest裏面,在新增一個文件叫做application ,將你做好的jar包 sendmsgtask.jar放進application 這裏,將你需要的jar包都放進lib文件夾,結果請看下圖
這裏寫圖片描述

這裏寫圖片描述
當然這裏jar包太多,我只截圖了其中一部分

第二步,修改配置文件,重要
打開wrapper.conf配置文件,參考參數解釋來修改成自己的信息
有兩個細節要注意:一個是你這次需要的jar包,最好自己一個個手寫進入,我試過用*表示,結果報錯,請看下圖
這裏寫圖片描述
第二個細節,就是你如果對其中的參數修改,要生效的話,記得去掉前面的 # 註釋符號,我當時就犯了修改沒去掉註釋符這個低級的錯誤,導致一直失敗。檢查沒問題之後進入下一步

第三步,運行
你打開bin文件,然後看到裏面的bat文件,
這裏寫圖片描述
至於功能,百度下前面開頭的單詞即可,也可以自己改掉文件名字,不會影響功能,因爲都是去讀取配置文件來執行。
先執行安裝命令InstallTestWrapper-NT.bat,沒報錯的話繼續執行StartTestWrapper-NT.bat開啓服務命令,如果雙擊出現無權限訪問,建議右鍵以管理員權限運行即可。
如果一直都沒報錯,就可以點開我的電腦 ——右鍵管理——服務和應用程序——服務 來查找你啓動的服務,如果一切正常,那麼將會出現下圖。
這裏寫圖片描述

那麼恭喜你,windows服務製作成,你可以定時查看下服務運行日誌來看系統是否正常,如下圖

這裏寫圖片描述

結尾

其實這個並不難實現,百度上也有很多例子,不過有一些感覺是不靠譜的,這個是例子是我自己全程跑完正常的。所以在這裏給大家一個參考的方向,少走彎路。

下面是我的maven項目,導入加上自己的配置即可,如果導入報錯:Project build error: Non-resolvable parent POM: Failure to find
com.aotain:bms:pom:1.0.0 in http://repo.maven.apache.org/maven2 was
cached in the local repository, resolution will not be reattempted until the
update interval of central has elapsed or updates are forced and
‘parent.relativePath’ points at wrong local POM 這個其實我也不大懂怎麼解決,如果有時間的話新建一個項目,然後將對應文件複製出來,或者有朋友成功解決了這個問題的麻煩給我留言,學習下。

源代碼下載地址:
http://download.csdn.net/download/qq_32574435/10188032

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