一個(gè)監(jiān)控程序,調(diào)用短信接口的實(shí)現(xiàn).
一個(gè)監(jiān)控程序,調(diào)用短信接口的實(shí)現(xiàn).
最近接受了一個(gè)燙手的山芋頭.是公司的給一個(gè)客戶做的CRM系統(tǒng)中的一個(gè)訂單處理模塊,這個(gè)模塊當(dāng)時(shí)考慮并發(fā)和訪問量比較大所以套用SOA的思想,把訂單處理模塊單獨(dú)成一個(gè)服務(wù).
部署在專門的機(jī)器上并做了負(fù)載均衡,提供接口給其他模塊調(diào)用. 由于本人專注數(shù)據(jù)庫方面和計(jì)費(fèi)結(jié)算等架構(gòu)方面.所以那個(gè)訂單處理模塊的設(shè)計(jì)開發(fā)我沒有參加. 系統(tǒng)測(cè)試和試運(yùn)行的時(shí)候都一切正常.
但是上線不久,就出問題了. 那個(gè)訂單處理模塊老是掛掉.經(jīng)檢查發(fā)現(xiàn)那個(gè)服務(wù)運(yùn)行一段時(shí)間(半天或者一天總之說不清楚)就使得那個(gè)服務(wù)器的cpu占用100%.直接over, 然后重新殺掉那個(gè)模塊的jboss服務(wù),啟動(dòng)一下jboss,又可以堅(jiān)持一天半天.
檢查數(shù)據(jù)庫一切正常,估計(jì)是在程序里面有邏輯出現(xiàn)bug,時(shí)間長(zhǎng)了吧cpu的資源耗盡了. 更讓人要跳樓的是做那個(gè)模塊的幾個(gè)哥們兒 跳槽了. 悲劇啊!!!!(人生就好比一個(gè)大茶幾,上面擺滿了杯具!!).
咋辦捏,系統(tǒng)在運(yùn)行已經(jīng)有不少的用戶和數(shù)據(jù),不可能系統(tǒng)停止讓我們檢查原因,然后再上線,估計(jì)這樣說,Boss要吧我殺了...,看來在這個(gè)bug解決之前. 唯一的辦法就是,監(jiān)控這個(gè)程序,如果掛掉,馬上重啟服務(wù).但不可能幾頁子一天到黑守到起
想到了一個(gè)可能的辦法,就是寫一個(gè)監(jiān)控程序,如果發(fā)現(xiàn)那個(gè)服務(wù)掛掉,馬上重啟服務(wù).但是試驗(yàn)只有,發(fā)現(xiàn)也走不通,服務(wù)掛的時(shí)候,是cpu100%沒法相應(yīng)了,這時(shí)候那個(gè)監(jiān)控程序一并搞死在那兒...
然后又想到吧那個(gè)監(jiān)控程序部署到另一個(gè)服務(wù)器上,但是在另一個(gè)服務(wù)器上沒法去重啟訂單處理模塊的服務(wù).最后想如果發(fā)現(xiàn)服務(wù)掛了能通過短信通知維護(hù)人員也可以.維護(hù)人員可以通過手機(jī)上網(wǎng)遠(yuǎn)程桌面進(jìn)入那服務(wù)器,去重啟jboss.這樣就不用大家都守到哪兒了.
于是馬上到網(wǎng)上搜如何通過程序給手機(jī)發(fā)短信的東東.
首先搜到短信modem. 看到一哥們兒的blog里面寫的文章http://hi.baidu.com/surelybox/blog/item/0404371bf8066afdae513360.html,說要去買一個(gè)短信modem的設(shè)備,然后再根據(jù)它提供的sdk包進(jìn)行開發(fā).
我暈死,這么個(gè)事情還要買個(gè)modem,而且那哥們兒說的用起來中間還有很多問題.不好解決,具體的情況 如果大家有興趣可以看看他的blog.
我在想.那些電信運(yùn)營(yíng)商其實(shí)提供一個(gè)webserive或者h(yuǎn)ttp的接口出來,然后我調(diào)用一下這個(gè)接口不是就可以吧短信發(fā)出去了么.咋個(gè)搞的這么麻煩捏.真是奇怪,于是放棄該死的短信modem的想法,又繼續(xù)在網(wǎng)上搜短線接口.
搜出來,出現(xiàn)很多 xxx科技提供短信接口.看了幾個(gè)差不多都是短信群發(fā)的東東,提供一個(gè)群發(fā)的系統(tǒng),然后讓用戶可以去是設(shè)置號(hào)碼和短信內(nèi)容,再給用戶發(fā)送.但是我需要的是短信的api接口,這些又不太適合我.
繼續(xù)搜索,看有沒有.
正在折騰中,同事喊吃飯了,想到先把飯吃完多,再說.畢竟身體是革命的本錢! 吃飯回來,有點(diǎn)犯困,順便到cnbeta上去逛逛. 看到了一篇文章:中國(guó)電信將推出“能力開放平臺(tái)”http://www.cnbeta.com/articles/99098.htm
奇怪能力開放是個(gè)什玩意兒,于是繼續(xù)看,開始寫了什么"國(guó)家重大專項(xiàng)課題,該項(xiàng)目由王曉初掛帥".哇,投入還大喲. 再往下看,有如下一句話:
"通俗的講,就是電信將一些核心的 資源如短信、IVR、語音通話、位置服務(wù)等功能通過該平臺(tái)向普通的開發(fā)者開放,開發(fā)者可以根據(jù)自己的產(chǎn)品需求快捷申請(qǐng)和調(diào)用這些功能."
喲呵,這個(gè)短信不是我真需要的么,而且是想普通開發(fā)者開放,我的監(jiān)控程序正好需要這個(gè)東東啊!!先進(jìn)去看看,http://open.ctfactory.com.然后里面發(fā)現(xiàn)了一個(gè)短信的鏈接.
http://open.ctfactory.com/Portal/Supermarket/FuncDetail.aspx?funcID=10000033然后再點(diǎn)進(jìn)去.前面的注冊(cè)賬號(hào)這些都不看了,里面關(guān)鍵的兩個(gè)步驟:
第四步: 調(diào)用能力開放平臺(tái)認(rèn)證鑒權(quán)接口,獲得認(rèn)證碼;
第五步: 獲得認(rèn)證碼以后,調(diào)用短信發(fā)送接口。
基本明白了,其實(shí)就是首先用賬號(hào)去申請(qǐng)一個(gè)驗(yàn)證碼,然后根據(jù)驗(yàn)證碼調(diào)用短信接口. 哇咔咔,方便.
馬上注冊(cè)了一個(gè)賬號(hào),然后注冊(cè)成功后提示 "一元訂購(gòu)能力",進(jìn)入界面看到其中短信是一元錢訂購(gòu)100次. my god 一分錢一次,電信這回真是大方了一回了.然后通過銀聯(lián)支付一塊錢,訂購(gòu)了100次的短信.
哈哈,短信的問題搞定了,接下來進(jìn)行監(jiān)控程序的編寫,其實(shí)就是用doNET寫了一個(gè)客戶端程序(這個(gè)部署在另外一個(gè)windows的機(jī)器上).代碼很簡(jiǎn)單,啟一個(gè)線程,定時(shí)訪問接口,如果訪問不到了,就調(diào)用發(fā)短信的接口
一下就是全部的代碼,通過注釋就可以看明白了. 為了趕時(shí)間,代碼寫的很不規(guī)范,望大家不要見笑喲
public partial class Form1 : Form
{
//定義一個(gè)線程對(duì)象的變量,全局的
Thread t;
int interval=10;//間隔10秒
delegate void delegate_getRet(string error);
bool flag = true;
//這些事doNET生成,不管他.
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//在這個(gè)按鈕按下的時(shí)候,就啟動(dòng)線程,每10秒執(zhí)行方法getRet
private void start_Click(object sender, EventArgs e)
{
this.label1.Text = "啟動(dòng)時(shí)間:" + DateTime.Now.Hour + "時(shí)" + DateTime.Now.Minute + "分";
start.Enabled = false;
flag = true;
//執(zhí)行方法getRet
t = new Thread(getRet);
t.Start();
}
//關(guān)閉按鈕,就是停止線程的
private void stop_Click(object sender, EventArgs e)
{
try
{
flag = false;
t.Join();
t.Abort();
}
catch
{
}
start.Enabled = true;
}
void getRet()
{
while (true)
{
if (!flag) return;
try
{
//模擬一個(gè)http請(qǐng)求
WebRequest myRequest = null;
WebResponse myResponse = null;
//Stream resStream = null;
//StreamReader sr = null;
myRequest = WebRequest.Create("這兒是訂單模塊的接口,這兒就不便公開了!呵呵.如果要使用這個(gè)代碼,請(qǐng)改成你的URL地址");
myResponse = myRequest.GetResponse();
}
catch (Exception ex)
{
//發(fā)一個(gè)短信,發(fā)短信的功能,封裝在這個(gè)方法里面,在方法里面決定接受者的電話號(hào)碼和短信內(nèi)容.
this.sendMsg("杯具啊!!又掛了!!趕快重啟...");
}
finally
{
Thread.Sleep(interval * 1000);
}
}
}
以上是程序的主體結(jié)構(gòu),下面是發(fā)送短信的方法的代碼. 可能中途有寫問題,但是邏輯都是一樣的,代碼在我的本本上,現(xiàn)在我寫這個(gè)文章的時(shí)候又是在家里的臺(tái)式機(jī)上寫的
如果有什么問題,可以看open.ctfactory.com 里面有詳細(xì)的開發(fā)文檔和客服服務(wù).
private sendMsg(string msgContent)
{
//1.調(diào)用能力管控認(rèn)證鑒權(quán)接口,獲取Token,這個(gè)是一個(gè)webservice接口,
// Authenticator = Base64(SHA1 (TimeStamp + “$” + APID+ “$” + APUserAccount + “$” + FunID + “$” + APKEY))
// 以下介紹在http://open.ctfactory.com/Portal/Supermarket/FuncDetail.aspx?funcID=10000033#KSSS 都能看到
//下面的設(shè)置分別是授權(quán)接口的URL和能力調(diào)用接口的URL,以及用戶ID和能力ID以及Key.
string AuthInterfaceURL = ConfigurationManager.AppSettings["AuthInterfaceURL"];
string FuncInterfaceURL = ConfigurationManager.AppSettings["FuncInterfaceURL"];
string APID = ConfigurationManager.AppSettings["APID"];
string APKey = ConfigurationManager.AppSettings["APKey"];
string FuncID = ConfigurationManager.AppSettings["FuncID"];
string APUserID = ConfigurationManager.AppSettings["APUserID"];
// AMCPForAP這個(gè)東東是用doNET將授權(quán)接口的webservice生成的本地代理
string authResult = AMCPForAP.Auth(AuthInterfaceURL, APID, FuncID, APUserID, APKey);//AMCPForAP這兒是我通過doNET自動(dòng)生成的webservice代理
string[] authResults = authResult.Split('$');
int result = Int32.Parse(authResults[0]);
2.獲取驗(yàn)證碼發(fā)送消息
if (result == 0)
{
//生成請(qǐng)求字符串
string sendMsgRequest = "http://118.123.249.4/ims/ghsendim.php?SendMsgRequest=" + token + "$" + 這兒是要發(fā)送短信的電話號(hào)碼 + "$" + PSOCryptography.ConvertStringToBase64String(msgContent).Replace("+", "%2B").Replace("&", "%26") + "$" + "";
//發(fā)送短信.這兒的短信發(fā)送接口是一個(gè)REST接口,需要模擬一個(gè)http請(qǐng)求來發(fā)送
WebRequest myRequest = WebRequest.Create(sendMsgRequest);
WebResponse myResponse = myRequest.GetResponse();
resStream = myResponse.GetResponseStream();
string content = new StreamReader(resStream, System.Text.Encoding.UTF8).ReadToEnd();
if (content.IndexOf("200")>0)
{
//記錄日志,發(fā)送成功
............
}
else
{
//記錄日志,發(fā)送失敗.
............
}
}
}
posted on 2009-12-05 16:22 zxbyh 閱讀(3211) 評(píng)論(7) 編輯 收藏