|
忙著應付保密檢查和其他一些事情,把Xmail的事情耽擱了。晚上的時間我看了一下關(guān)于短信技術(shù)的應用。根據(jù)一些文章和自己的感悟簡單談談。 中國電信和中國移動的短信協(xié)議要求客戶端主動連接到網(wǎng)關(guān)收取信息,并且接受的連接只能有一個。 因此客戶端的接收程序必須盡快處理收到的信息,好盡快接收下一個信息。而客戶端的程序又有很多事情必須處理,比如寫日志并分發(fā)給相關(guān)的應用。 開始我用多線程的方式,即接收程序收到從網(wǎng)關(guān)發(fā)來的信息后,啟動一個新線程處理收到的信息,本身接著收下一個信息。新啟動的線程負責寫日志,然后分發(fā)給相關(guān)的應用。這種方式運行起來效果不錯。 接著又遇到一個問題,寫日志和分發(fā)給應用的程序是兩個不相關(guān)的東西,放在一起有點別扭。寫日志的程序?qū)崟r性要求不高,只要保證記錄了就可以;而分發(fā)程序需要盡量快,不應該等日志完了再執(zhí)行。再起一個線程寫日志,一個線程分發(fā)? 這樣線程多了反而更慢,不太好。 對與從網(wǎng)關(guān)收到的信息我們可能有許多處理程序,比如一個是寫日志,一個是分發(fā)給應用。就日志來說,就有寫數(shù)據(jù)庫、寫文本文件、控制臺輸出等。所以我采用了消息隊列的方式,這樣接收程序收到從網(wǎng)關(guān)來的信息后送出一個消息到消息隊列中,需要處理的程序自己來取就是了。這個消息隊列用的是 Topic/Subscribe模式,就是接收程序發(fā)出的同一個消息可能被多個處理程序接受。這樣對信息的不同處理,我就可以寫不同的消息處理程序。 接收完了,看看向網(wǎng)關(guān)發(fā)送信息的情況。短信網(wǎng)關(guān)一般也只允許一個連接進行發(fā)送,而且中國電信和中國移動使用的短信網(wǎng)關(guān)協(xié)議都是異步的,這樣用消息隊列的發(fā)送也很理想。 整體框架如下面這幅圖 : Transport Service 是和網(wǎng)關(guān)通訊的程序。它負責保持連接、發(fā)送信息給網(wǎng)關(guān)、接收網(wǎng)關(guān)來的信息,并把信息發(fā)送到消息隊列 Deliver Controller 是分發(fā)信息給相關(guān)應用的控制器。它從消息隊列中收取Deliver信息,然后根據(jù)信息的內(nèi)容或者用戶的狀態(tài),用不同的Application Deliver把信息分發(fā)給應用 Application Deliver 負責具體分發(fā)信息給應用。不同的應用可能要求不同的信息接受方式,比如多數(shù)是用HTTP方式,分發(fā)程序用POST方法把信息提交給應用,這中方式用的是 AppDeliverHttpPost;有的是用SOAP,用的就是AppDeliverSoap了??傊?,要什么新方法,寫一個Application Deliver就可以了。 Logger 就是寫日志的程序。它從消息隊列中收取所以消息,然后寫日志。如果要有不同的日志方法可以寫不同的Logger,比如我有一個DBLogger,是向數(shù)據(jù)庫里寫日志的實現(xiàn)。 Sender 是通過Transport Service發(fā)送Submit信息給網(wǎng)關(guān)的程序。短信協(xié)議是異步的,但多數(shù)應該要求同步,就是要知道發(fā)送是否成功。因此Sender多提供了一個實現(xiàn)同步的方法。Sender發(fā)送后,從消息隊列中等待發(fā)送的結(jié)果,然后返回結(jié)果。 Web Service 是接受應用發(fā)送信息的接口。為什么要這個呢?和接收一樣,多數(shù)應用發(fā)送信息的時候是用HTTP的POST方法。而且這樣應該不應該知道短信協(xié)議的數(shù)據(jù)包格式,這樣同一個應該可以給不同的短信協(xié)議使用,比如中國電信的SMGP和中國移動的CMPP。 Application 就是最終處理短信的應用了。它和短信協(xié)議無關(guān)。 在實際實現(xiàn)中,我使用了J2EE。我本來對J2EE挺煩的,不過這次效果不錯,特別是它的JMS,正好適合我的需要。開始我自己做消息隊列管理,后來發(fā)現(xiàn)做Topic方式的實現(xiàn)比較麻煩,所以還是用現(xiàn)成的吧。Application Server選用了JBoss,當然也可以選用JRun,這兩個用JMX,比較容易寫自己的MBean放到作為應用服務的Service。 其中Transport Service就是一個JMX的MBean。另外根據(jù)JRun和JBoss的要求,做了一下擴展,很順利的作為應用服務器中的一個服務執(zhí)行了。為什么用 JMX?因為它比較容易管理,比如我要修改Transport Service的連接超時參數(shù),用HttpAgentAdapter直接修改就可以了,服務本身就不用重新啟動。 Deliver Controller、Logger我都做成了MessageBean,好接收消息隊列。Sender和Application Deliver是Stateless的SessionBean,方便別人調(diào)用。 用了EJB還一個好處是,我Deploy和Undeploy其中的某些Bean的時候,不影響到其他Bean提供服務。比如新做了一個 Application Deliver,直接Deploy后,這個功能就可以用了。其他服務都不需要重新啟動,有點Plug&Play的味道。 另外,數(shù)據(jù)庫我用的是MySQL。 |
|
|
來自: 鬼迷心竅 > 《Java相關(guān)》