我的20天项目经历--至今令我难忘的技术难题

系统 1594 0

原创于2007年06月19日,2009年10月16日迁移至此。


时间转眼过去一年多了 , 我离开 H 公司也已经一年多了 . 往事不堪回首 , 世事也总是以成败论英雄的 , 因为我知道前面的一个接口项目先后导致 3 个人离职 ,2 个人被处罚 ; 而这个项目只有我一个人 , 在项目割接的当天我总算不辱使命完成了 ; 我既是成功者 , 也是失败者 ; 我证明了自己是可以笑着离开 H 公司的 . 其实我一直不太想写出来 , 毕竟申请离职也不是一件很光彩的事情 .

2006 年是全国号码百事通风起云涌的一年 , Z 电信公司正是第一个勇于吃螃蟹的人且率业界之先的公司 ; 我就是 2006 年初被派到 电信公司跟着另外一个项目经理讨论接口需求的 ( 原因很简单 , 为了避免垄断 ,Z 电信公司把省中心业务给了 Q 公司 , 12 各地市给了 H 公司 所以在省中心和地市之间需要通过 Web Service 接口进行互连 ), 其实在这之前的一年内我是做 BI 和数据库优化的 , 对于所谓的接口和 114 是一窍不通的 . 估计看出了点苗头 , 项目经理当了甩手掌柜 , 只好由我一个人来负责此事了 . Z ,

2 8 , 春节还没过完 , 我便来到了 H , 经过反复的讨论和调研 , 其实我做的工作只是号码百事通业务的一部分 , 即实现对现有知识库的智能访问 , 当然访问是需要通过接口来完成的 , 此外还要实现一定的功能 , 例如发送短信 , 来电转接 , 记录计费信息 , 当然也是通过接口来实现 .


其实我很早就已经有了初步的想法 , 最简单的就是我自动生成存储过程和自动生成 html 网页 ( 其实基本上已经实现了 ), 但是了解到存储过程需要在友商的数据库中创建 , 以及考虑到相关的风险和双方的剑拔弩张的气氛 , 这显然是不可能实现的任务 . 现在只能自己另辟蹊径建一个独立的 Web Server 服务器 , 通过正在流行的 Web Service 接口来实现这一切功能了 .

上述的图片显示的框架源于我对 BI 和数据库的理解 , 只要有一个开放的数据字典 , 基本上就可以实现任何的自定义查询和自定义组合 如果复杂一点的话 , 甚至可以实现一套简单的报表系统 . 正是基于这样的想法和相关数据结构开始和 Q 公司谈相关的接口 . 但是有几个问题一直缠绕着我 : ;

1. 采用什么样的 WEB 服务器 ,Tomcat 还是 Resin

2. 采用什么样的编程工具 ,Jbuilder 还是 Eclipse?

3. Web Service 接口到底是什么 , 如何完成发布和调用

4. 采用什么样的 Java 框架 (Struct 还是 Spring 还是纯粹的 JSP)

5. Ajax 技术

6. 关于树型目录的实现 ( 需要高效 , 无延迟 )

7. 最难缠的还是和 Q 公司的谈判和交流 ( 要面对对方 5,6 人的轮番轰炸 )

也许对于 java 高手而言这根本不算什么 , 可对于我而言 , 那简直是一场噩梦 , 我的 Java 水平和 HTML 水平仅限于写一些简单的 JSP 页面和 JavaBean 完成简单的封装 , 我自认为自己水平最高的还是 HTML javascript 水平 , 不管多么复杂的页面和 frame 我都可以整理出一个头绪出来 . 我从来不是一个唯工具论者 , 我相信任何工具都只是手段 , 而条条马路都可以通向罗马的 . 可惜给我留的时间太短了 , 只有 3 周的时间 . 说真的 , 那时候天天对着西湖的美景 , 没有一丝丝观看的心情 , 真的想扑通一声跳下去 , 一了百了 .

言规正传首先需要确定系统大体的架构 ,Tomcat Eclipse 都是开源的架构 , 不涉及到版权和费用 , 从网上 down Tomcat, 呵呵 , 如果 Z 电信公司知道了非要气个半死不可 . 按照从网上搜索的资料把 Tomcat Eclipse 环境配置完毕 , 然后按照公司的 java 高手指点 , 配置 框架 . Spring


关于 Spring 框架的配置

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

其实在这样的小型系统里 , 它提供了一个便于调试和控制的开关 ; 至少在本文中 , 是为了解决无法使用接口环境进行调试的时候 , 改用数据库接口方式 .

<!-- ======= 如果是和 soap 接口连接,请去掉该 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 接口连接测试 , 请去掉该 bean 的注释 =====-->

<!--

<bean id="QueryData" class="com.xxx.yyy.inf.DBInterface">

<property name="dataSource">

<ref local="DataSource"/>

</property>

</bean>

-->


关于树型目录的框架

严格说来写一个树型目录的架构是一项非常复杂的工作 , 树型目录的实现有两种方式 : 全部画出所有的树节点和当触发时实时画出下一层节点。前一种的实现相对简单一些 , 但是当节点数量超过 1000 之后 , 采用递归算法会导致页面首次显示时出奇的缓慢 , 我曾经做过对 js 脚本和相应的存储过程做过调优 , 但是效果还是不甚理想 ; 触发时才实时画出下一层节点技术难度很高 , 还好公司有比较现成的框架 , java 类和接口就有 10 几个 , 完全阅读并理解显然是不现实的 , 只能通过摸索把先有的业务和原来的接口进行不断的测试 , 花费了一天时间才得以完成 .


关于 Web Service

Web Service 是一种可以接收从 Internet 或者 Intranet 上的其它系统中传递过来的请求,轻量级的独立的通讯技术。总得来讲它能够突破平台限制 , 穿越企业防火墙 , 通过开放的接口和认证实现信息的共享和传递 .

WSDL

对于商业用户来说,要找到一个自己需要使用的服务,他必须知道如何来调用。 WSDL (Web Services Description Language) 规范是一个描述接口,语义以及 Web 服务为了响应请求需要经常处理的工作的 XML 文档。这将使简单地服务方便,快速地被描述和记录。

对于 .Net WSDL 调用来说是很简单的 , 例如一个简单的 VBS 脚本

Dim obj

set obj=createobject("MSSOAP.SoapClient30")

obj.MSSoapInit "QueryService.wsdl"

MsgBox obj.getPhoneByName("0578", "XXX 单位 ",10)

但是对于 java 而言调用一个 .Net 产生的 WSDL 简直被折磨了半死 ,Q 公司又不肯提供技术支持 , 不断的进行调试跟踪最后才发现是一个 setEncodingStyle 参数设置的问题 .

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;

}

}


关于 Ajax

单纯从 Ajax 本身来说,其最主要不过就是解决在网页上一个无刷新获取数据的问题,再加上减少了数据的传输量,将数据解析的工作推到了客户端,的确能解决很多传统的问题,很方便的实现一些动态效果。 Ajax 的应用本来是为了增强用户体验 , 于是就有了一个新的名词 WEB2.0.

其实在该系统的应用很简单即获取到 COM 组件传过来的主叫号码和被叫号码 , 记录到 Session , 具体的 JSP 页面是一个非常简单的页面 , 就不必再写了 , 呵呵

Xh = new ActiveXObject(“Microsoft.XMLHTTP");

var link = "./beginSession.do?callID="+callid+"&callerNo="+callerno+"&calleeNo="+calleeno;


关于交流

其实整个系统过程中 , 最头疼的问题还是和 Q 公司的交流 ,Q 公司是一家新型的在电信领域刚刚展露头脚的公司 , 面对这样一个扬名立万的机会 , 当然不会错过了 , 于是派了 40 个现场人员进行现场开发 , 真不知道他们的项目成本控制是怎么做的 ; 而我方总计也只有 3 个人 , 参与接口的讨论最多也只有 2 个人 ; 每次都要面对对方嗡嗡的一群人的轮番轰炸 ; 最后不得已拉着 Z 电信公司一起参与讨论 . 还好对方也有很多的软肋 ( 双方都要提供一些接口 ), 才不至于被折磨的太惨 .


2006 2 28 , 是个特殊的日子 , 当天下午 Q 公司终于把接口调试完毕 , 当天晚上我也把相应的功能完善起来 , 终于到了一个 milestone. 彷佛经历了一场噩梦 . 连续 3 周的时间 , 每天从早 9 点到晚上 3 点不停的写代码 , 调试代码 , 查询资料 , 讨论需求 ; 极度厌烦了这样的生活 , 最后终于借口身体不好 , 仓惶逃离了这个地方 , 把工作交接给一位新来的同事 , 他又继续维护了 6 个月 . 我回去后休整了 1 个多月 , 身体仍然比较虚弱 , 再过了一个月就黯然离职了


补记 : 时年 6 月份便发生了一幕惨剧 , 一位同事因过劳而死 不知道我再呆上几个月 , 轮到的是不是我

我的20天项目经历--至今令我难忘的技术难题


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论