原創(chuàng)于2007年06月19日,2009年10月16日遷移至此。
時(shí)間轉(zhuǎn)眼過去一年多了 , 我離開 H 公司也已經(jīng)一年多了 . 往事不堪回首 , 世事也總是以成敗論英雄的 , 因?yàn)槲抑狼懊娴囊粋€(gè)接口項(xiàng)目先后導(dǎo)致 3 個(gè)人離職 ,2 個(gè)人被處罰 ; 而這個(gè)項(xiàng)目只有我一個(gè)人 , 在項(xiàng)目割接的當(dāng)天我總算不辱使命完成了 ; 我既是成功者 , 也是失敗者 ; 我證明了自己是可以笑著離開 H 公司的 . 其實(shí)我一直不太想寫出來 , 畢竟申請(qǐng)離職也不是一件很光彩的事情 .
2006 年是全國(guó)號(hào)碼百事通風(fēng)起云涌的一年 , 而 Z 電信公司正是第一個(gè)勇于吃螃蟹的人且率業(yè)界之先的公司 ; 我就是 2006 年初被派到 電信公司跟著另外一個(gè)項(xiàng)目經(jīng)理討論接口需求的 ( 原因很簡(jiǎn)單 , 為了避免壟斷 ,Z 電信公司把省中心業(yè)務(wù)給了 Q 公司 , 而 12 各地市給了 H 公司 所以在省中心和地市之間需要通過 Web Service 接口進(jìn)行互連 ), 其實(shí)在這之前的一年內(nèi)我是做 BI 和數(shù)據(jù)庫(kù)優(yōu)化的 , 對(duì)于所謂的接口和 114 是一竅不通的 . 估計(jì)看出了點(diǎn)苗頭 , 項(xiàng)目經(jīng)理當(dāng)了甩手掌柜 , 只好由我一個(gè)人來負(fù)責(zé)此事了 . Z ,
2
月
8
號(hào)
,
春節(jié)還沒過完
,
我便來到了
H
市
,
經(jīng)過反復(fù)的討論和調(diào)研
,
其實(shí)我做的工作只是號(hào)碼百事通業(yè)務(wù)的一部分
,
即實(shí)現(xiàn)對(duì)現(xiàn)有知識(shí)庫(kù)的智能訪問
,
當(dāng)然訪問是需要通過接口來完成的
,
此外還要實(shí)現(xiàn)一定的功能
,
例如發(fā)送短信
,
來電轉(zhuǎn)接
,
記錄計(jì)費(fèi)信息
,
當(dāng)然也是通過接口來實(shí)現(xiàn)
.
其實(shí)我很早就已經(jīng)有了初步的想法 , 最簡(jiǎn)單的就是我自動(dòng)生成存儲(chǔ)過程和自動(dòng)生成 html 網(wǎng)頁 ( 其實(shí)基本上已經(jīng)實(shí)現(xiàn)了 ), 但是了解到存儲(chǔ)過程需要在友商的數(shù)據(jù)庫(kù)中創(chuàng)建 , 以及考慮到相關(guān)的風(fēng)險(xiǎn)和雙方的劍拔弩張的氣氛 , 這顯然是不可能實(shí)現(xiàn)的任務(wù) . 現(xiàn)在只能自己另辟蹊徑建一個(gè)獨(dú)立的 Web Server 服務(wù)器 , 通過正在流行的 Web Service 接口來實(shí)現(xiàn)這一切功能了 .
上述的圖片顯示的框架源于我對(duì) BI 和數(shù)據(jù)庫(kù)的理解 , 只要有一個(gè)開放的數(shù)據(jù)字典 , 基本上就可以實(shí)現(xiàn)任何的自定義查詢和自定義組合 如果復(fù)雜一點(diǎn)的話 , 甚至可以實(shí)現(xiàn)一套簡(jiǎn)單的報(bào)表系統(tǒng) . 正是基于這樣的想法和相關(guān)數(shù)據(jù)結(jié)構(gòu)開始和 Q 公司談相關(guān)的接口 . 但是有幾個(gè)問題一直纏繞著我 : ;
1. 采用什么樣的 WEB 服務(wù)器 ,Tomcat 還是 Resin
2. 采用什么樣的編程工具 ,Jbuilder 還是 Eclipse?
3. Web Service 接口到底是什么 , 如何完成發(fā)布和調(diào)用
4. 采用什么樣的 Java 框架 (Struct 還是 Spring 還是純粹的 JSP)
5. Ajax 技術(shù)
6. 關(guān)于樹型目錄的實(shí)現(xiàn) ( 需要高效 , 無延遲 )
7. 最難纏的還是和 Q 公司的談判和交流 ( 要面對(duì)對(duì)方 5,6 人的輪番轟炸 )
也許對(duì)于 java 高手而言這根本不算什么 , 可對(duì)于我而言 , 那簡(jiǎn)直是一場(chǎng)噩夢(mèng) , 我的 Java 水平和 HTML 水平僅限于寫一些簡(jiǎn)單的 JSP 頁面和 JavaBean 完成簡(jiǎn)單的封裝 , 我自認(rèn)為自己水平最高的還是 HTML 和 javascript 水平 , 不管多么復(fù)雜的頁面和 frame 我都可以整理出一個(gè)頭緒出來 . 我從來不是一個(gè)唯工具論者 , 我相信任何工具都只是手段 , 而條條馬路都可以通向羅馬的 . 可惜給我留的時(shí)間太短了 , 只有 3 周的時(shí)間 . 說真的 , 那時(shí)候天天對(duì)著西湖的美景 , 沒有一絲絲觀看的心情 , 真的想撲通一聲跳下去 , 一了百了 .
言規(guī)正傳首先需要確定系統(tǒng)大體的架構(gòu) ,Tomcat 和 Eclipse 都是開源的架構(gòu) , 不涉及到版權(quán)和費(fèi)用 , 從網(wǎng)上 down 的 Tomcat, 呵呵 , 如果 Z 電信公司知道了非要?dú)鈧€(gè)半死不可 . 按照從網(wǎng)上搜索的資料把 Tomcat 和 Eclipse 環(huán)境配置完畢 , 然后按照公司的 java 高手指點(diǎn) , 配置 框架 . Spring
關(guān)于 Spring 框架的配置
Spring 是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢(shì)之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個(gè)組件,同時(shí)為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。
其實(shí)在這樣的小型系統(tǒng)里 , 它提供了一個(gè)便于調(diào)試和控制的開關(guān) ; 至少在本文中 , 是為了解決無法使用接口環(huán)境進(jìn)行調(diào)試的時(shí)候 , 改用數(shù)據(jù)庫(kù)接口方式 .
<!-- ======= 如果是和 soap 接口連接,請(qǐng)去掉該 bean 的注釋 ===========-->
<bean id="QueryData" class="com.xxx.yyy.inf.SoapInterface">
<property name="endpoint">
<value>http://192.168.1.2/Forxxx/ForQuery.asmx</value>
</property>
<property name="nameSpace">
<value>http://tempuri.org/</value>
</property>
</bean>
<!-- =========== 如果是和 db 接口連接測(cè)試 , 請(qǐng)去掉該 bean 的注釋 =====-->
<!--
<bean id="QueryData" class="com.xxx.yyy.inf.DBInterface">
<property name="dataSource">
<ref local="DataSource"/>
</property>
</bean>
-->
關(guān)于樹型目錄的框架
嚴(yán)格說來寫一個(gè)樹型目錄的架構(gòu)是一項(xiàng)非常復(fù)雜的工作 , 樹型目錄的實(shí)現(xiàn)有兩種方式 : 全部畫出所有的樹節(jié)點(diǎn)和當(dāng)觸發(fā)時(shí)實(shí)時(shí)畫出下一層節(jié)點(diǎn)。前一種的實(shí)現(xiàn)相對(duì)簡(jiǎn)單一些 , 但是當(dāng)節(jié)點(diǎn)數(shù)量超過 1000 之后 , 采用遞歸算法會(huì)導(dǎo)致頁面首次顯示時(shí)出奇的緩慢 , 我曾經(jīng)做過對(duì) js 腳本和相應(yīng)的存儲(chǔ)過程做過調(diào)優(yōu) , 但是效果還是不甚理想 ; 觸發(fā)時(shí)才實(shí)時(shí)畫出下一層節(jié)點(diǎn)技術(shù)難度很高 , 還好公司有比較現(xiàn)成的框架 , 光 java 類和接口就有 10 幾個(gè) , 完全閱讀并理解顯然是不現(xiàn)實(shí)的 , 只能通過摸索把先有的業(yè)務(wù)和原來的接口進(jìn)行不斷的測(cè)試 , 花費(fèi)了一天時(shí)間才得以完成 .
關(guān)于 Web Service
Web Service 是一種可以接收從 Internet 或者 Intranet 上的其它系統(tǒng)中傳遞過來的請(qǐng)求,輕量級(jí)的獨(dú)立的通訊技術(shù)。總得來講它能夠突破平臺(tái)限制 , 穿越企業(yè)防火墻 , 通過開放的接口和認(rèn)證實(shí)現(xiàn)信息的共享和傳遞 .
WSDL
對(duì)于商業(yè)用戶來說,要找到一個(gè)自己需要使用的服務(wù),他必須知道如何來調(diào)用。 WSDL (Web Services Description Language) 規(guī)范是一個(gè)描述接口,語義以及 Web 服務(wù)為了響應(yīng)請(qǐng)求需要經(jīng)常處理的工作的 XML 文檔。這將使簡(jiǎn)單地服務(wù)方便,快速地被描述和記錄。
對(duì)于 .Net 的 WSDL 調(diào)用來說是很簡(jiǎn)單的 , 例如一個(gè)簡(jiǎn)單的 VBS 腳本
Dim obj
set obj=createobject("MSSOAP.SoapClient30")
obj.MSSoapInit "QueryService.wsdl"
MsgBox obj.getPhoneByName("0578", "XXX 單位 ",10)
但是對(duì)于 java 而言調(diào)用一個(gè) .Net 產(chǎn)生的 WSDL 簡(jiǎn)直被折磨了半死 ,Q 公司又不肯提供技術(shù)支持 , 不斷的進(jìn)行調(diào)試跟蹤最后才發(fā)現(xiàn)是一個(gè) setEncodingStyle 參數(shù)設(shè)置的問題 .
public class CpSpInterface {
protected Log logger = LogFactory.getLog(this.getClass());
private String endpoint = "http://192.168.1.2/Service1.asmx";
private String nameSpace = "GetSPInfo";
public String callGetIndexByType(String strTypeID, String strParaList,String strResultType)
{
String ret = "<?xml version="1.0" encoding="gb2312" ?><root status="1" lines="0"></root>";
try {
String methodName = "GetIndexByType";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTimeout(new Integer(120000));
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setUseSOAPAction(true);
call.setSOAPActionURI(nameSpace + "/GetIndexByType");
call.setOperationStyle(org.apache.axis.constants.Style.WRAPPED);
call.setEncodingStyle("literal");
call.setOperationName(new QName(nameSpace, methodName));
StringHolder holder = new StringHolder("0");
// Set Call Parameter
call.addParameter(new QName(nameSpace, "strTypeID"),
Constants.XSD_STRING, ParameterMode.IN);
………… 略
//Set back Parameter
call.setReturnType(Constants.XSD_STRING);
ret = (String) call.invoke(new Object[] { strTypeID, strParaList,
strResultType });
ret = ret.replaceAll("utf-8","gb2312");
logger.debug("ret = "+ret);
logger.info("return errorcode = " + holder.value);
} catch (Exception e) {
logger.error("Error " + e);
}
return ret;
}
}
關(guān)于 Ajax
單純從 Ajax 本身來說,其最主要不過就是解決在網(wǎng)頁上一個(gè)無刷新獲取數(shù)據(jù)的問題,再加上減少了數(shù)據(jù)的傳輸量,將數(shù)據(jù)解析的工作推到了客戶端,的確能解決很多傳統(tǒng)的問題,很方便的實(shí)現(xiàn)一些動(dòng)態(tài)效果。 Ajax 的應(yīng)用本來是為了增強(qiáng)用戶體驗(yàn) , 于是就有了一個(gè)新的名詞 WEB2.0.
其實(shí)在該系統(tǒng)的應(yīng)用很簡(jiǎn)單即獲取到 COM 組件傳過來的主叫號(hào)碼和被叫號(hào)碼 , 記錄到 Session 中 , 具體的 JSP 頁面是一個(gè)非常簡(jiǎn)單的頁面 , 就不必再寫了 , 呵呵
Xh = new ActiveXObject(“Microsoft.XMLHTTP");
var link = "./beginSession.do?callID="+callid+"&callerNo="+callerno+"&calleeNo="+calleeno;
關(guān)于交流
其實(shí)整個(gè)系統(tǒng)過程中 , 最頭疼的問題還是和 Q 公司的交流 ,Q 公司是一家新型的在電信領(lǐng)域剛剛展露頭腳的公司 , 面對(duì)這樣一個(gè)揚(yáng)名立萬的機(jī)會(huì) , 當(dāng)然不會(huì)錯(cuò)過了 , 于是派了 40 個(gè)現(xiàn)場(chǎng)人員進(jìn)行現(xiàn)場(chǎng)開發(fā) , 真不知道他們的項(xiàng)目成本控制是怎么做的 ; 而我方總計(jì)也只有 3 個(gè)人 , 參與接口的討論最多也只有 2 個(gè)人 ; 每次都要面對(duì)對(duì)方嗡嗡的一群人的輪番轟炸 ; 最后不得已拉著 Z 電信公司一起參與討論 . 還好對(duì)方也有很多的軟肋 ( 雙方都要提供一些接口 ), 才不至于被折磨的太慘 .
2006 年 2 月 28 日 , 是個(gè)特殊的日子 , 當(dāng)天下午 Q 公司終于把接口調(diào)試完畢 , 當(dāng)天晚上我也把相應(yīng)的功能完善起來 , 終于到了一個(gè) milestone. 彷佛經(jīng)歷了一場(chǎng)噩夢(mèng) . 連續(xù) 3 周的時(shí)間 , 每天從早 9 點(diǎn)到晚上 3 點(diǎn)不停的寫代碼 , 調(diào)試代碼 , 查詢資料 , 討論需求 ; 極度厭煩了這樣的生活 , 最后終于借口身體不好 , 倉(cāng)惶逃離了這個(gè)地方 , 把工作交接給一位新來的同事 , 他又繼續(xù)維護(hù)了 6 個(gè)月 . 我回去后休整了 1 個(gè)多月 , 身體仍然比較虛弱 , 再過了一個(gè)月就黯然離職了
補(bǔ)記 : 時(shí)年 6 月份便發(fā)生了一幕慘劇 , 一位同事因過勞而死 … 不知道我再呆上幾個(gè)月 , 輪到的是不是我 …
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
